PostgreSQL中的索引集群是否利用了预排序数据?

PostgreSQL中的索引集群是否利用了预排序数据?,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,我创建一个如下表: SELECT t1.c1, t2.c2, t3.c3, *several more columns* INTO t4 FROM t1 INNER JOIN t2 ON t1.j2 = t2.j2 INNER JOIN t3 ON t1.j3 = t3.j3; 然后,我创建一个集群主键: ALTER TABLE t4 ADD CONSTRAINT pk_t4 PRIMARY KEY (c1, c2, c3); CLUSTER t4 USING pk_t4; 如果我在SELE

我创建一个如下表:

SELECT t1.c1, t2.c2, t3.c3, *several more columns*
INTO t4
FROM t1
INNER JOIN t2 ON t1.j2 = t2.j2
INNER JOIN t3 ON t1.j3 = t3.j3;
然后,我创建一个集群主键:

ALTER TABLE t4 ADD CONSTRAINT pk_t4 PRIMARY KEY (c1, c2, c3);
CLUSTER t4 USING pk_t4;

如果我在
SELECT INTO
查询中添加一个
ORDER BY c1、c2、c3
子句,这会加快主键的聚类吗?

如果您使用
SELECT。。。PostgreSQL将在
或中创建表格作为选择…,并按顺序插入记录

因此,是的,如果您按c1、c2、c3添加一个
顺序,这也是一个主键,它们将已经被集群化,因此不需要
集群

但是,如果您再次运行集群,我认为PostgreSQL将重写该表


示例

首先生成一个500万整数的随机顺序表:

testdb=> create table clust as select a from generate_series(1, 5000000) a order by random() ;
SELECT 5000000
Time: 14675,540 ms
testdb=> create index clust_a_idx on clust (a);
CREATE INDEX
Time: 13145,245 ms
testdb=> cluster clust using clust_a_idx;
CLUSTER
Time: 19126,597 ms
testdb=> cluster clust using clust_a_idx;
CLUSTER
Time: 7968,350 ms
聚类第一次需要19秒,第二次需要7.9秒

创建另一个表,这次已排序:

testdb=> create table clust2 as select a from generate_series(1, 5000000) a ;
SELECT 5000000
Time: 2612,878 ms
testdb=> create index clust2_a_idx on clust2 (a);
CREATE INDEX
Time: 6816,040 ms
testdb=> cluster clust2 using clust2_a_idx;
CLUSTER
Time: 7762,115 ms
testdb=> cluster clust2 using clust2_a_idx;
CLUSTER
Time: 7861,405 ms
对已经排序的表进行集群大约需要7.8秒

按c1、c2、c3排序是否有帮助是。


但是,如果您按正确的顺序插入,则表已排序(群集),并且
群集
是多余的。

谢谢,@hruske。PostgreSQL是否将表或键标记为集群,以便在其查询计划中使用该信息,或者集群只是排序?集群是根据索引排序顺序排列堆(表)。通过索引进行查找仍然需要索引查找,使用集群的最大好处是当您有一种访问模式时,这种模式很有可能接触到相邻的记录,而此时postgres将需要获取较少的页面,因为它们已经在内存中。