Postgresql
PostgreSQL 中的 CLUSTER USING 表的非集群程度如何
我有一些表從Postgres SQL 中的CLUSTER ON/CLUSTER USING中受益匪淺:
# CLUSTER table USING index_name; # ANALYZE VERBOSE table; # CLUSTER VERBOSE;
維護任務會定期執行 CLUSTER VERBOSE 以保持最新狀態。但是在執行 CLUSTER VERBOSE 之前,我可以執行一個測試來查看表的碎片程度嗎?也許是這樣的:
# CLUSTER ANALYZE table 40000 records. 4000 observed clusters, 5000 potential clusters (20% fragmentation)
請注意,我使用 CLUSTER,因此同時訪問的數據被“碎片整理”為少量磁碟塊。例如,每個頁面都有數千個屬性。a
CLUSTER page_attribute USING page_id;
將所有屬性並排放置,大大減少了磁碟負載。
我不完全確定這些資訊有多大幫助,但係統表
pg_stats
包含一correlation
列:select schemaname,tablename,attname,correlation from pg_stats where schemaname='public' order by correlation;
物理行排序和列值的邏輯排序之間的統計相關性。範圍從 -1 到 +1。當值接近 -1 或 +1 時,由於減少了對磁碟的隨機訪問,估計列上的索引掃描比接近零時便宜。(如果列數據類型沒有 < 運算符,則此列為空。)
這個值是基於每列的,所以我的猜測是,如果第一個索引列的相關性接近於零,則表是“未聚集的”,如果接近 -1 或 1,它更接近於索引,因此“更聚集”。如果課程只能適用於定義為 ASC 的 B-Tree 索引(我猜)。