Postgresql

在 Postgres 中查詢物化視圖的定義

  • December 17, 2019

我想知道如何在 Postgres 中查詢物化視圖的定義。作為參考,我希望做的與正常視圖可以做的非常相似:

SELECT * FROM information_schema.views WHERE table_name = 'some_view';

它為您提供以下列:

table_catalog
table_schema
table_name
view_definition
check_option
is_updatable
is_insertable_into
is_trigger_updatable
is_trigger_deletable
is_trigger_insertable_into

這對於物化視圖是否可行?

從我目前的研究來看,物化視圖似乎被故意排除在 information_schema 之外,因為

information_schema 只能顯示 SQL 標準中存在的對象。

( http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us )

由於它們似乎完全被排除在 information_schema 之外,我不知道該怎麼做,但我想做的是雙重的:

  1. 查詢是否存在特定的物化視圖。(到目前為止,我發現這樣做的唯一方法是嘗試創建一個具有相同名稱的 mat 視圖,看看它是否會爆炸。)
  2. 然後查詢物化視圖的定義(類似view_definition上列information_schema.views)。

事實證明這並不像我想像的那麼複雜!(只需對 pg_catalog 有一點了解……)

Part 1:查詢物化視圖是否存在:

SELECT count(*) > 0
FROM pg_catalog.pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'm'
AND n.nspname = 'some_schema'
AND c.relname = 'some_mat_view';

好,易於。

第二部分:查詢物化視圖的定義:

為了提出一個查詢來獲取 mat 視圖的定義,我首先必須information_schema.views通過執行來查找視圖的定義:

SELECT view_definition
FROM information_schema.views
WHERE table_schema = 'information_schema'
AND table_name = 'views';

然後我複制了查詢並更改c.relkind = 'v'::"char"c.relkind = 'm'::"char"以獲得 mat 視圖(而不是正常視圖)。在此處查看完整查詢:http: //pastebin.com/p60xwfes

此時,您可以很容易地添加AND c.relname = 'some_mat_view'並執行它來獲得some_mat_view.

但是下次您想要查找 mat view 的定義時,您仍然需要重新執行此操作…

獎勵:創建一個視圖以使這更容易

我選擇創建一個新視圖,以便將來更輕鬆地查找 mat view 定義。我基本上只是添加CREATE VIEW materialized_views AS到上面連結的查詢的開頭來創建新視圖,現在我可以像這樣查詢它:

SELECT *
FROM materialized_views
WHERE table_schema = 'some_schema'
AND table_name = 'some_mat_view';

好多了!

*我還可以使用此視圖通過更改為.輕鬆查詢是否存在物化視圖count(*) > 0

免責聲明:我不知道查詢結果中的其他列是否完全正確,因為物化視圖與標準視圖根本不同(我認為它們是正確的)。但這至少可以正確查詢table_schema,table_nameview_definition

看起來像 9.3 及更高版本,您可以執行以下操作:

select * from pg_matviews;
select * from pg_matviews where matviewname = 'view_name';

在這裡找到更多資訊:https ://stackoverflow.com/questions/29297296/postgres-see-query-used-to-create-materialized-view

引用自:https://dba.stackexchange.com/questions/102620