如何内省物化视图

Posted

技术标签:

【中文标题】如何内省物化视图【英文标题】:How to introspect materialized views 【发布时间】:2013-10-08 06:49:29 【问题描述】:

我有一个实用程序,可以使用以下方法自省表列:

select column_name, data_type from information_schema.columns
        where table_name=%s

如何将其扩展到内省物化视图列?

【问题讨论】:

【参考方案1】:

您的查询有一些缺点/需要改进的地方:

表名在数据库中不是唯一的,您必须缩小到特定架构,否则可能会得到令人惊讶/误导/完全错误的结果。 将(可选)模式限定的表名转换为regclass 更有效/更方便...见下文。

转换为regtype 为您提供通用类型名称而不是内部类型名称。但这仍然只是基本类型。 请改用the system catalog information functions format_type() 来获取包含修饰符的准确类型名称。

通过上述改进,您无需加入其他表。只需pg_attribute

删除的列驻留在目录中,直到表被清空(完全)。您需要排除这些。

SELECT attname, atttypid::regtype AS base_type
              , format_type(atttypid, atttypmod) AS full_type
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass
AND    attnum > 0
AND    NOT attisdropped;  -- no dead columns

顺便说一句:information schema 中的视图仅适用于标准合规性和可移植性(无论如何很少起作用)。如果您不打算切换您的 RDBMS,请坚持使用目录表,它快得多 - 显然更完整。

【讨论】:

感谢您的清理和注释!【参考方案2】:

似乎 postgres 9.3 已将物化视图排除在 information_schema 之外。 (请参阅http://postgresql.1045698.n5.nabble.com/Re-Materialized-views-WIP-patch-td5740513i40.html 进行讨论。)

以下内容适用于自省:

select attname, typname 
from pg_attribute a 
join pg_class c on a.attrelid = c.oid 
join pg_type t on a.atttypid = t.oid
where relname = %s and attnum >= 1;

子句attnum >= 1 抑制系统列。我猜,类型名称是 pg_specific,但对于我的目的来说已经足够了。

【讨论】:

以上是关于如何内省物化视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sqlite 中创建物化视图?

Postgres:更新与物化视图连接的表?错误:视图无法在物化视图中锁定行

Oracle设置物化视图的自动刷新

如何做到物化视图的自动刷新

PG 物化视图

如何用 MySQL 实现物化视图?