如何判断一个Postgres表何时被集群化以及使用了哪些索引?[英] How to tell when a Postgres table was clustered and what indexes were used

本文是小编为大家收集整理的关于如何判断一个Postgres表何时被集群化以及使用了哪些索引?的处理方法,想解了如何判断一个Postgres表何时被集群化以及使用了哪些索引?的问题怎么解决?如何判断一个Postgres表何时被集群化以及使用了哪些索引?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

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

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

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 可能需要重建/刷新/重新创建集群(不确定用语是否正确).是否知道表何时发生了如此大的变化以至于集群不再有帮助?

推荐答案

要知道上次使用哪个索引对表进行聚类,请使用 pg_index 系统目录.

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

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

要找到它,请查询 pg_stats您聚类所在的列的行.如果 correlation 接近于 1,你仍然很好.值越小,表示聚类越多.

本文地址:https://www.itbaoku.cn/post/1763957.html