mybatis-plus icon indicating copy to clipboard operation
mybatis-plus copied to clipboard

select段嵌套括号会影响查询速度

Open kywvane opened this issue 3 years ago • 5 comments
trafficstars

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

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

报错信息

kywvane avatar Aug 05 '22 09:08 kywvane

demo呢?

miemieYaho avatar Aug 05 '22 09:08 miemieYaho

我提供了优化前和优化后的语句,是需要完整的语句吗? 目标数据库是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

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

kywvane avatar Aug 09 '22 01:08 kywvane

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

kywvane avatar Aug 09 '22 01:08 kywvane

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

miemieYaho avatar Aug 09 '22 03:08 miemieYaho

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

kywvane avatar Aug 10 '22 04:08 kywvane

关闭 SQL 解析可以自行

qmdx avatar Dec 13 '22 13:12 qmdx