首页 > 解决方案 > 在 PostgreSQL 中,我们如何判断一个表的每个索引是否是聚集的?

问题描述

在 PostgreSQL 中,我们如何判断一个表的每个索引是否是聚集的?

这与在 MySQL 中,我们如何判断表的索引是否聚集?

谢谢。

标签: postgresql

解决方案


Postgres 不像 MySql 那样支持聚集索引。可能存在用于对表进行聚类的索引。您可以通过查询indisclustered系统目录pg_index 中的列来检查这一点。

indisclustered - 如果为 true,则表最后聚集在此索引上

例子:

create table my_table(id serial primary key, str text unique);

select relname, indisclustered
from pg_index i
join pg_class c on c.oid = indexrelid
where indrelid = 'public.my_table'::regclass

     relname      | indisclustered 
------------------+----------------
 my_table_str_key | f
 my_table_pkey    | f
(2 rows)

cluster my_table using my_table_str_key;

select relname, indisclustered
from pg_index i
join pg_class c on c.oid = indexrelid
where indrelid = 'public.my_table'::regclass

     relname      | indisclustered 
------------------+----------------
 my_table_str_key | t
 my_table_pkey    | f
(2 rows)

阅读有关CLUSTER 的文档:

当一个表被聚集时,它会根据索引信息在物理上重新排序。集群是一次性操作:当表随后更新时,更改不会集群。也就是说,不会尝试根据索引顺序存储新的或更新的行。


推荐阅读