如何判断 Postgres 表何时聚集以及使用了哪些索引

Posted

技术标签:

【中文标题】如何判断 Postgres 表何时聚集以及使用了哪些索引【英文标题】:How to tell when a Postgres table was clustered and what indexes were used 【发布时间】:2018-11-14 11:58:31 【问题描述】:

集群带来的性能提升给我留下了深刻的印象,但它需要多长时间。

我知道如果在集群之后更改了表或分区,则需要重新构建集群,但除非我记下上次集群表的时间,否则我如何知道何时需要再次进行集群?

我可以使用这个查询来告诉我哪些表有一个或多个聚集索引

SELECT *
FROM   pg_class c
JOIN   pg_index i ON i.indrelid = c.oid
WHERE  relkind = 'r' AND relhasindex AND i.indisclustered 

我的问题是。

如何判断哪些索引已聚集? 有没有什么方法可以准确地查出表最后一次聚集的时间? 如何判断一个聚集索引是否仍然“有效”,或者换句话说,如何判断一个表/索引已经发生了多少变化,以至于我需要重新构建集群。

我注意到重新构建聚集索引所花费的时间与最初构建它所花费的时间一样长(即使在此期间没有触及该表)。所以我想避免重新聚类,除非我知道表需要它。


更新清楚(我希望)

如果我使用这个命令......

CLUSTER tableA USING tableA_idx1;
我怎样才能在以后找出引用了哪个索引,即 tableA_idx1(表定义了多个索引)? 它是否记录在何时此命令运行的任何地方? 我知道,当表发生更改时,偶尔使用 CLUSTER tableA 可能需要重建/刷新/重新创建集群(不确定用语是否正确)。是否知道表何时发生了如此大的变化以至于集群不再有帮助?

【问题讨论】:

我如何知道哪些索引已被聚集?”没有意义。 Postgres 中的索引从不“聚集”。如果您想找出对于 cluster 命令使用 的索引,那么您的查询已经这样做了(因为它只返回已被索引“聚集”的表)而且没有Postgres中的“集群”之类的东西,所以你不能“重建集群”。 cluster 只是重新排列表中的行,使其具有与索引条目相同的物理顺序。 【参考方案1】:

要知道上次使用哪个索引对表进行集群,请使用pg_index 系统目录。

查询表中属于您的表的所有索引,并查看哪个索引设置了indisclustered。一个表一次只能由一个索引聚集。

没有办法知道什么时候该表最后一次聚集,但这也不是很有趣。您想知道的是聚类仍然有多好。

要找到它,请在 pg_stats 行中查询您聚类所在的列。如果correlation 接近于 1,你还是不错的。值越小,表示聚类越多。

【讨论】:

@Laurenze Albe - 谢谢!我询问表何时被聚集的原因是,在没有更好的指标的情况下,它为我提供了一种估计集群仍然“好”的可能性的方法——使用你提到的相关性似乎是更好的方法!跨度>

以上是关于如何判断 Postgres 表何时聚集以及使用了哪些索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 postgres 中集群我的 PRIMARY KEY

从架构跟踪表计数

如何判断何时可以重新加载表视图,以便它显示我已下载和解析的 JSON 数据?

如何判断 textarea 中的一行何时创建/删除?

FAST_FORWARD 游标何时会有工作表(这是要避免的)?

writeToFile 如何判断何时完成