我有一个表,其中包含定义为的多列索引
CREATE INDEX tab_a_idx1 ON tab_a USING btree (device, fixtime)
故意选择索引是因为针对此表运行的大多数查询都包含这样的选择条件
WHERE device = 'xyz' AND fixtime > 'sometime' AND fixtime <= 'someothertime' ORDER BY fixtime;
该表已聚集在该索引上,以提高性能。
CLUSTER tab_a USING tab_a_idx1;
基于上一个question中的评论和答案,我已使用此查询列出了聚集表,聚集表的索引以及这些索引的定义。
SELECT c.oid, c.relname as tablename, x.relname as indexname, z.indexdef
FROM pg_class c
JOIN pg_index i ON i.indrelid = c.oid
JOIN pg_class x ON i.indexrelid = x.oid
JOIN pg_indexes z ON x.relname = z.indexname
WHERE c.relkind = 'r' AND c.relhasindex AND i.indisclustered
而且我一直在使用 pg_stats 表来检查索引列的相关性。
引用的答案指出,相关性接近“ 1”是好的,并且值越低,表明聚类越多。
表聚类后,索引(设备)中第一个字段的相关性很低(0.008),而第二个字段(固定时间)的相关性相对较高(0.994)。
谢谢
更新-父表的创建如下。...
CREATE TABLE tab_a
( device CHAR(6),
fixTime TIMESTAMP,
....lots more fields.....
)
PARTITION BY RANGE (fixTime);
各个分区都是这样创建的
CREATE TABLE tab_a_201704 PARTITION OF tab_a FOR VALUES FROM ('2017-04-01' ) TO ( '2017-05-01' )
像这样用于聚类的索引。...
CREATE INDEX tab_a_201704_idx2 ON tab_a_201704 (device, fixTime);
还有执行群集的命令。...
CLUSTER tab_a_201704 USING tab_a_201704_idx2 ;