查询Postgres中物化视图的定义

Sea*_*ean 27 postgresql materialized-view information-schema postgresql-9.4

我想知道如何在 Postgres 中查询物化视图的定义。作为参考,我希望做的与您可以为常规视图做的非常相似:

SELECT * FROM information_schema.views WHERE table_name = 'some_view';
Run Code Online (Sandbox Code Playgroud)

它为您提供以下列:

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
Run Code Online (Sandbox Code Playgroud)

这对于物化视图是可能的吗?

从我目前的研究来看,物化视图似乎被故意排除在 information_schema 之外,因为

information_schema 只能显示存在于 SQL 标准中的对象。

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

由于它们似乎完全被排除在 information_schema 之外,我不知道如何解决这个问题,但我想做的是双重的:

  1. 查询特定的物化视图是否存在。(到目前为止,我发现这样做的唯一方法是尝试创建一个具有相同名称的 mat 视图,看看它是否会爆炸。)
  2. 然后查询物化视图的定义(类似于 上的view_definitioninformation_schema.views)。

小智 35

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

select * from pg_matviews;
select * from pg_matviews where matviewname = 'view_name';
Run Code Online (Sandbox Code Playgroud)

在这里找到更多信息:https : //stackoverflow.com/questions/29297296/postgres-see-query-used-to-create-materialized-view


Sea*_*ean 14

原来这并没有我想象的那么复杂!(只需要一点 pg_catalog 的知识......)

第 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';
Run Code Online (Sandbox Code Playgroud)

好,易于。

第二部分:查询物化视图的定义:

为了提出查询以获取 mat 视图的定义,我首先必须information_schema.views通过运行来查找视图的定义:

SELECT view_definition
FROM information_schema.views
WHERE table_schema = 'information_schema'
AND table_name = 'views';
Run Code Online (Sandbox Code Playgroud)

然后我复制了查询并更改c.relkind = 'v'::"char"c.relkind = 'm'::"char"以获取 mat 视图(而不是常规视图)。在此处查看完整查询:http : //pastebin.com/p60xwfes

此时,您可以非常轻松地添加AND c.relname = 'some_mat_view'并运行它以获取some_mat_view.

但是下次要查找 mat 视图的定义时,您仍然必须重新执行此操作...

奖励:创建一个视图使这更容易

我选择创建一个新视图,以便将来更轻松地查找 mat 视图定义。我基本上只是添加CREATE VIEW materialized_views AS到上面链接的查询的开头来创建新视图,现在我可以像这样查询它:

SELECT *
FROM materialized_views
WHERE table_schema = 'some_schema'
AND table_name = 'some_mat_view';
Run Code Online (Sandbox Code Playgroud)

好多了!

我还可以使用此视图通过更改*为来轻松查询物化视图是否存在count(*) > 0

免责声明:我不知道查询结果中的其他列是否完全正确,因为物化视图从根本上不同于标准视图(我认为它们是正确的)。但这至少可以查询table_schema,table_name并且view_definition正确。