在postgreSQL中使用pg_pathman进行表分区后,SQL的运行速度要慢得多



在postgreSQL 9.6中使用pg_pathman 1.5进行表分区后,SQL运行得更慢,分区列是来自tale T1的"create_time"。列create_time的数据范围小于一个月,SQL如下:

SELECT
t1.*
FROM
T1 t1
JOIN T2 t2 ON t2.answer_question_id = t1.answer_question_id
JOIN T3 t3 ON t3.answer_paper_id = t2.answer_paper_id
JOIN T4 t4  ON t3.exam_paper_id = t4 .exam_paper_id
WHERE
t3.answer_paper_id = 'ab12-4567-7896-efgh'
AND t1.create_time >= t4 .exam_begin_time AND t1.create_time <= t4 .exam_end_time

表T1、T2、T3、T4定义如下:

T1:(id,answer_question_id,create_time )
T2:(id,answer_question_id,answer_paper_id)
T3:(id,answer_paper_id,exam_paper_id )
T4:(id,exam_paper_id,exam_begin_time,exam_end_time)

我在pg_pathman中执行以下操作:

1、 表分区按列create_time:

select                                             
create_range_partitions('T1'::regclass,           
'create_time',                      
'2018-11-01 00:00:00'::timestamp,
interval '3 month',   
24,   
false) ;

2、 数据迁移:

select partition_table_concurrently('T1'::regclass,
10000,
1.0);


当我执行上面的sql时,它不能自行停止,除非我在pg_pathman分区后手动取消它,但在pg_path man分区表T1之前,只需要2秒就可以完成sql的执行,为什么?以及如何解决这个问题?

我想我已经找到了原因,解决方案是它需要为分区键(列(创建索引,并在SQL的where子句中使用分区列。

最新更新