now()导致分区不能剪枝问题优化 本文为您介绍now()导致分区不能剪枝问题优化案例。 now()函数是获取当前时间,当SQL语句中分区表时间传入now()时,由于SQL下推DN节点执行,优化器在CN节点生成执行计划时,无法进行分区剪枝,导致扫描了所有分区,导致SQL性能下降,SQL并行执行时会引起严重的分区表锁冲突。 针对此问题,建议传入具体值代替now(),或定义一个稳定函数代替now()。 以下是关于该场景的测试情况: 1. 准备测试数据: teledb create table ttimerange (f1 bigint, f2 timestamp ,f3 bigint) partition by range (f2) begin (timestamp without time zone '20210601 0:0:0') step (interval '1 month') partitions (12) distribute by shard(f1) to group defaultgroup; CREATE TABLE 2. 使用now()时SQL执行计划: 可以看到,SQL被下推到DN节点执行,优化器没有剪枝,扫了所有分区。 teledb explain select from ttimerange where f2 Append (cost0.00..0.00 rows0 width0) > Seq Scan on ttimerange (partition sequence: 0, name: ttimerangepart0) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 1, name: ttimerangepart1) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 2, name: ttimerangepart2) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 3, name: ttimerangepart3) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 4, name: ttimerangepart4) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 5, name: ttimerangepart5) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 6, name: ttimerangepart6) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 7, name: ttimerangepart7) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 8, name: ttimerangepart8) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 9, name: ttimerangepart9) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 10, name: ttimerangepart10) (cost0.00..2.17 rows30 width24) Filter: (f2 Seq Scan on ttimerange (partition sequence: 11, name: ttimerangepart11) (cost0.00..2.17 rows30 width24) Filter: (f2 < now()) (27 rows) 3. 自定义一个稳定函数 teledb