【问题标题】:Feedback on whether index was created on materialized views in postgresql关于是否在 postgresql 中的物化视图上创建索引的反馈
【发布时间】:2025-12-07 11:00:02
【问题描述】:

我为物化视图创建了一个唯一索引:

create unique index if not exists matview_key on
      matview (some_group_id, some_description);

我不知道它是否已经创建
如何查看索引?

谢谢!

【问题讨论】:

  • 您遇到错误了吗?如果没有,则创建索引。
  • psql 做:\d matview
  • 选项 2:select * from pg_indexes where indexname = 'matview_key' and tablename = 'matview';
  • 太棒了!
  • @AdrianKlaver 如果您认为这对其他人有用,请您写下您的 cmets 作为答案吗?谢谢!

标签: postgresql database-indexes


【解决方案1】:

两种验证索引创建的方法:

--In psql
\d matview

--Using SQL

select 
  * 
from 
   pg_indexes 
where 
   indexname = 'matview_key' 
and 
   tablename = 'matview';

更多关于pg_indexes的信息。

【讨论】:

    【解决方案2】:

    就像评论过的一样,如果命令成功完成并且您没有收到错误消息,则索引已创建。可能的警告:当事务没有提交时,没有其他人可以看到它(除了现在保留的唯一名称),它仍然可能被回滚。签入单独的交易以确保。

    绝对确定:

    SELECT pg_get_indexdef(oid)
    FROM   pg_catalog.pg_class
    WHERE  relname = 'matview_key'
    AND    relkind = 'i'
    -- AND    relnamespace = 'public'::regnamespace  -- optional, to make sure of the schema, too
    

    通过这种方式,您可以查看给定名称的索引是否存在,以及它的确切定义,以排除具有相同名称的不同索引。纯 SQL,适用于任何客户端。 (物化视图的索引没有什么特别之处。)

    还过滤模式以绝对确定。在您的情况下将是“默认”模式(也称为“当前”模式),因为您没有在创建中指定。见:

    相关:

    在 psql 中:

    \di public.matview_key
    

    只查找索引。同样,模式是可选的缩小范围。

    进度报告

    如果创建索引需要很长时间,您可以在 pg_stat_progress_create_index 中查找 Postgres 12 以来的进度:

    SELECT * FROM pg_stat_progress_create_index
    -- WHERE relid = 'public.matview'::regclass  -- optionally narrow down
    

    【讨论】:

    【解决方案3】:

    查看pg_indexes 的替代方法是pg_matviews(仅用于物化视图)

    select *
    from pg_matviews
    where matviewname = 'my_matview_name'; 
    

    【讨论】: