如何判断何时对Postgres表进行集群以及使用了哪些索引

时间:2018-11-14 11:58:32

标签: postgresql query-performance

通过群集实现的性能改进给我留下了深刻的印象,但是花费的时间却没有。

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

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

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 来重建/刷新/重新创建群集(不确定正确的措辞)。无论如何,是否知道表何时发生了很大变化以至于群集不再起作用?

1 个答案:

答案 0 :(得分:4)

要确定哪个索引最后用于聚集表,请使用pg_index系统目录。

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

没有办法找出何时该表最后被聚类了,但是无论如何这不是很有趣。您想知道的是集群仍然有多出色。

要找到该地址,请在pg_stats行中查询要在其上进行集群的列。如果correlation接近1,则您仍然很好。值越小,表示的聚类就越多。