【发布时间】: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只是重新排列表中的行,使其具有与索引条目相同的物理顺序。
标签: postgresql query-performance