使用多列索引的Postgres集群

时间:2018-11-17 13:59:49

标签: postgresql query-performance

我有一个表,其中包含定义为的多列索引

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)。

  • 如果这些值应该接近'1',但不是,是否意味着表不能(或不应该)聚集在多列索引上?
  • tab_a 有多个版本(在修订时进行了分区),我注意到,相关值在集群版本和非集群版本之间似乎并没有太大差异。表。这是否意味着对该索引进行聚类没有意义?

谢谢


更新-父表的创建如下。...

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 ;

0 个答案:

没有答案