PostgreSQL 中的 CLUSTER USING 表是如何非集群的

Bry*_*yce 3 postgresql performance optimization storage disk-structures

我有一些表可以从Postgres SQL 中的CLUSTER ON/CLUSTER USING中受益匪浅:

# CLUSTER table USING index_name;
# ANALYZE VERBOSE table;
# CLUSTER VERBOSE;
Run Code Online (Sandbox Code Playgroud)

维护任务会定期运行 CLUSTER VERBOSE 以保持最新状态。但是,在运行 CLUSTER VERBOSE 之前,是否可以运行测试来查看表的碎片化程度?也许是这样的:

# CLUSTER ANALYZE
table 40000 records. 4000 observed clusters, 5000 potential clusters (20% fragmentation)
Run Code Online (Sandbox Code Playgroud)

请注意,我使用 CLUSTER,因此同时访问的数据被“整理”为少量磁盘块。例如,每个页面都有数千个属性。aCLUSTER page_attribute USING page_id;将所有属性放在一起,大大减少了磁盘负载。

a_h*_*ame 6

我不完全确定这些信息有多大帮助,但系统表pg_stats包含一correlation列:

select schemaname,tablename,attname,correlation 
from pg_stats 
where schemaname='public' 
order by correlation;
Run Code Online (Sandbox Code Playgroud)

从手册

列值的物理行排序和逻辑排序之间的统计相关性。这范围从 -1 到 +1。当值接近 -1 或 +1 时,由于减少了对磁盘的随机访问,估计列上的索引扫描比接近零时便宜。(如果列数据类型没有 < 运算符,则此列为空。)

这个值是基于每列的,所以我的猜测是,如果第一个索引列的相关性接近于零,则该表是“未聚集的”,如果接近 -1 或 1,则它更接近于索引,因此“更加聚集”。这个 if course 只能用于定义为 ASC 的 B-Tree 索引(我猜)。