Postgresql To_Date()扫描每个分区上的索引。我如何优化它,或者它可以(因为它不会慢很多)或者切换到pg11解决它?

Postgresql To_Date()扫描每个分区上的索引。我如何优化它,或者它可以(因为它不会慢很多)或者切换到pg11解决它?,postgresql,postgresql-9.6,Postgresql,Postgresql 9.6,我有一张分区的桌子。数据类型为TIMESTAMP且不带时区的列Shift_Date上的分区 我正在使用PostgreSQL 9.6.12 explain analyze select * from tbl_shiftassignment where shift_date = to_date('15/01/19','dd/mm/yy') 即使它是没有时区的时间戳,我也需要从我的前端使用它来确定日期,否则就没有输出。 如果我不使用TO_DATE,它只扫描单个分区 现在,请参见解释和分析差异 “s

我有一张分区的桌子。数据类型为TIMESTAMP且不带时区的列Shift_Date上的分区

我正在使用PostgreSQL 9.6.12

explain analyze
select * from tbl_shiftassignment 
where shift_date = to_date('15/01/19','dd/mm/yy')
即使它是没有时区的时间戳,我也需要从我的前端使用它来确定日期,否则就没有输出。 如果我不使用TO_DATE,它只扫描单个分区

现在,请参见解释和分析差异

“sql 解释分析 从tbl\U换档符号中选择* 其中,班次日期=至日期'15/01/19','dd/mm/yy'

=============================================

然而,如果我不习惯这样约会

explain analyze
select * from tbl_shiftassignment 
where shift_date = '15-JAN-19';


"Append  (cost=0.00..35.61 rows=67 width=187) (actual time=0.023..0.041 rows=66 loops=1)"
"  ->  Seq Scan on tbl_shiftassignment  (cost=0.00..0.00 rows=1 width=308) (actual time=0.006..0.006 rows=0 loops=1)"
"        Filter: (shift_date = '2019-01-15 00:00:00'::timestamp without time zone)"
"  ->  Bitmap Heap Scan on tbl_shiftassignment_201901  (cost=4.79..35.61 rows=66 width=186) (actual time=0.016..0.032 rows=66 loops=1)"
"        Recheck Cond: (shift_date = '2019-01-15 00:00:00'::timestamp without time zone)"
"        Heap Blocks: exact=12"
"        ->  Bitmap Index Scan on isd_tbl_shiftassignment_201901  (cost=0.00..4.77 rows=66 width=0) (actual time=0.011..0.011 rows=66 loops=1)"
"              Index Cond: (shift_date = '2019-01-15 00:00:00'::timestamp without time zone)"
"Planning time: 7.388 ms"
"Execution time: 0.088 ms"
如果不用于指定日期,则仅影响10行

虽然索引扫描很快,但我的问题是,如果我切换到pg11,它是否会像第二个示例中那样工作,即使我使用to_DATE,也只影响10行

Same problem for Date Range 
WHERE Shift_Date >= TO_DATE('25/08/2018','DD/MM/YYYY')
AND Shift_Date <= TO_DATE('30/08/2018','DD/MM/YYYY')

是的,这是PostgreSQL v11中的一个新特性:分区修剪也可以在执行时发生

在PostgreSQL v10中,分区修剪只能在计划查询时进行。由于截止日期是稳定的,并且不是一成不变的,因此在计划时执行可能会产生与执行时不同的值,因此计划员无法对其进行优化


如果您使用日期文字编写查询,它应该在v10中工作。

如果您确实需要分区,则必须升级到Postgres 11。因此,在PostgreSQL 9.6中,如果不使用日期,则无法从前端进入精确分区?不使用此查询。您可以使用日期文字,如果分区正确,它应该可以工作。
Same problem for Date Range 
WHERE Shift_Date >= TO_DATE('25/08/2018','DD/MM/YYYY')
AND Shift_Date <= TO_DATE('30/08/2018','DD/MM/YYYY')