在 Postgres 中查詢物化視圖的定義
我想知道如何在 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 之外,我不知道該怎麼做,但我想做的是雙重的:
- 查詢是否存在特定的物化視圖。(到目前為止,我發現這樣做的唯一方法是嘗試創建一個具有相同名稱的 mat 視圖,看看它是否會爆炸。)
- 然後查詢物化視圖的定義(類似
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_name
和view_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