当前使用版本(必填,否则不予处理)

3.4.3.4

该问题是如何引起的?(确定最新版也有问题再提!!!)

升级 mybatis 3.5.6到3.5.7 mybatis-spring 2.0.5到2.0.6 mybatis-plus 3.4.1到3.4.3.4

升级完发现某个select段嵌套特别多括号的查询速度很慢,升级前没有问题

重现步骤(如果有就写完整)

业务大概是根据投运(开始)时间,和保养配置间隔,计算距下次保养还有多少天 fdt为投运日期的0点 cd为当前日期的0点 有问题的部分sql: CASE WHEN first_maintenance_date_ts is null or maintenance_cycle IS NULL OR maintenance_cycle = 0 THEN null ELSE date_part('day', (fdt +( (CEIL ( ( ( ( date_part( 'year', cd ) - date_part( 'year', fdt ) ) * 12 + ( date_part( 'month', cd ) - date_part( 'month', fdt ) ) ) + ( CASE WHEN date_part( 'day', cd ) > date_part( 'day', fdt ) THEN 1 ELSE 0 END ) ) / maintenance_cycle ) maintenance_cycle) ||' month') ::interval - cd)) END as nextMaintenanceDay 优化后的sql: CASE WHEN first_maintenance_date_ts is null or maintenance_cycle IS NULL OR maintenance_cycle = 0 THEN null ELSE date_part('day', fdt +( CEIL ( ( ( date_part( 'year', cd ) - date_part( 'year', fdt ) ) * 12 + date_part( 'month', cd ) - date_part( 'month', fdt ) + CASE WHEN date_part( 'day', cd ) > date_part( 'day', fdt ) THEN 1 ELSE 0 END ) / maintenance_cycle ) maintenance_cycle ||' month') ::interval - cd) END as nextMaintenanceDay

报错信息

Comment From: miemieYaho

demo呢?

Comment From: kywvane

我提供了优化前和优化后的语句,是需要完整的语句吗? 目标数据库是pg 上文中first_maintenance_date_ts、maintenance_cycle 是表的两个字段,类型分别是int8和int4 fdt和cd是两个TIMESTAMP 上文里的内容就是select段的内容。 完整语句可认为是 select 上文 from ( select now():: TIMESTAMP as fdt, now():: TIMESTAMP as cd, 1 as first_maintenance_date_ts, 1 as maintenance_cycle ) t1

发生这种情况时,数据库中仅有一条记录

Comment From: kywvane

补充一下,我将生成出的语句在数据库中查询,是非常快的。 在升级版本之前,也没有发生过执行很慢的情况。 并且我在反复的调整的过程中,最终定位到减少括号能解决慢的问题。 所以我觉得,可能是解析括号导致的执行变慢。

Comment From: miemieYaho

完整可复现可执行的项目demo

Comment From: kywvane

这个可以提交压缩包吗? 怎么操作的?

Comment From: qmdx

关闭 SQL 解析可以自行