SELECT tvv.id,
tvv.VIN,
tvv.as_code,
tvv.storage_time AS storageTime,
tvv.checkout_date AS checkoutDate,
tvv.tm_bas_route_id,
tvv.gearbox_no,
tvv.engine_no,
too.FC04,
too.MATERIAL_NO,
too.sap_order_no AS batchNo,
too.is_allocation,
topb.target_country,
topb.plan_batch_code,
tbmr.material_desc,
tbmr.vehicle_type,
tbmr.bs_material_no,
tbmr.bs_material_desc,
tbmr.ps_material_no,
tbmr.ps_material_desc,
tbc.clxh,
tsr.engTime,
tsr.apTime,
toif.sap_feature_code AS fc05,
toif.sap_feature_code_desc AS fc05Desc,
tvvm.*
FROM tm_vhc_vehicle tvv
INNER JOIN (SELECT tm_vhc_vehicle_id,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_HZ10' THEN input_time END) AS hz10Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_HZ20' THEN input_time END) AS hz20Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_TZBDCR' THEN input_time END) AS hzWBSRTime,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_TZBDCC' THEN input_time END) AS hzWBSCTime,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_TZ10' THEN input_time END) AS tz10Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_TZ20' THEN input_time END) AS tz20Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZBDCR' THEN input_time END) AS tzPBSRTime,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZBDCC' THEN input_time END) AS tzPBSCTime,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZ10' THEN input_time END) AS zz10Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZ20' THEN input_time END) AS zz20Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZ30' THEN input_time END) AS zz30Time
FROM tm_vhc_vehicle_movement
WHERE is_deleted = 0
AND input_time >= #{param.inputTimeStart}
AND input_time <= #{param.inputTimeEnd}
AND tm_bas_plant_id = #{param.tmBasPlantId}
<if test="null != param.tmBasWorkShopId and param.tmBasWorkShopId != ''">
AND tm_bas_work_shop_id = #{param.tmBasWorkShopId}
</if>
<if test="null != param.tmBasLineId and param.tmBasLineId != ''">
AND tm_bas_line_id = #{param.tmBasLineId}
</if>
<if test="null != param.nodeNature and param.nodeNature != ''">
AND node_nature = #{param.nodeNature}
</if>
GROUP BY tm_vhc_vehicle_id
) tvvm ON tvv.id = tvvm.tm_vhc_vehicle_id
INNER JOIN tm_ofm_order too ON too.id = tvv.tm_ofm_order_id AND too.is_deleted = 0
INNER JOIN te_ofm_plan_batch topb ON too.sap_order_no = topb.batch_no AND topb.is_deleted = 0
LEFT JOIN tm_bas_material_checkout tbmc ON tbmc.material_no = too.material_no AND tbmc.is_deleted = 0
LEFT JOIN tm_bas_checkout tbc ON tbc.link_id = tbmc.link_id AND tbc.is_deleted = 0
LEFT JOIN tm_ofm_imes_feature toif ON toif.tm_ofm_order_id = too.id AND toif.is_deleted = 0 AND toif.sap_feature_id = #{param.code}
LEFT JOIN (
SELECT vin,
MAX(CASE WHEN scan_type = 'Key_Uloc_Function_10' THEN scan_time END) AS engTime,
MAX(CASE WHEN scan_type = 'Key_Uloc_Function_1' THEN scan_time END) AS apTime
FROM tr_scan_record
WHERE scan_type IN ('Key_Uloc_Function_10', 'Key_Uloc_Function_1') AND is_deleted = 0
GROUP BY vin
) tsr ON tsr.vin = tvv.vin
LEFT JOIN tm_bas_material_relation tbmr ON tbmr.material_no = tvv.material_no AND tbmr.is_deleted = 0
WHERE tvv.is_deleted = 0
<if test="null != param.fc04 and param.fc04 != ''">
AND too.fc04 = #{param.fc04}
</if>
<if test="param.proType != null and param.proType != ''">
AND tvv.pro_type = #{param.proType}
</if>
<if test="null != param.carTypes and param.carTypes.size > 0">
AND too.vhc_model IN
<foreach collection="param.carTypes" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="null != param.vin and param.vin != ''">
AND too.vin REGEXP #{param.vin}
</if>
<if test="null != param.isAllocationC and param.isAllocationC != ''">
AND too.is_allocation = #{param.isAllocationC}
</if>
<if test="null != param.asCode and param.asCode != ''">
AND tvv.as_code = #{param.asCode}
</if>
<if test="null != param.materialNoList and param.materialNoList.size > 0">
AND tvv.material_no in
<foreach collection="param.materialNoList" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="null != param.batchCodeList and param.batchCodeList.size > 0">
AND topb.plan_batch_code in
<foreach collection="param.batchCodeList" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="null != param.vehModelName and param.vehModelName != ''">
AND tbc.clxh = #{param.vehModelName}
</if>
<if test="null != param.bsMaterialNo and param.bsMaterialNo != ''">
AND tbmr.bs_material_no = #{param.bsMaterialNo}
</if>
<if test="null != param.psMaterialNo and param.psMaterialNo != ''">
AND tbmr.ps_material_no = #{param.psMaterialNo}
</if>
<if test="null != param.sortFiled and param.sortFiled != ''">
ORDER BY ${param.sortFiled}
<if test="null != param.sortDesc and param.sortDesc == true">
DESC
</if>
</if>
<if test="null == param.sortFiled or param.sortFiled == ''">
ORDER BY too.mes_order_seq DESC
</if>
上面是我的SQL语句 其中下面这块很耗性能
SELECT tm_vhc_vehicle_id,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_HZ10' THEN input_time END) AS hz10Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_HZ20' THEN input_time END) AS hz20Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_TZBDCR' THEN input_time END) AS hzWBSRTime,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_TZBDCC' THEN input_time END) AS hzWBSCTime,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_TZ10' THEN input_time END) AS tz10Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_TZ20' THEN input_time END) AS tz20Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZBDCR' THEN input_time END) AS tzPBSRTime,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZBDCC' THEN input_time END) AS tzPBSCTime,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZ10' THEN input_time END) AS zz10Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZ20' THEN input_time END) AS zz20Time,
MAX(CASE WHEN node_nature = 'Key_Uloc_Type_ZZ30' THEN input_time END) AS zz30Time
FROM tm_vhc_vehicle_movement
WHERE is_deleted = 0
AND input_time >= #{param.inputTimeStart}
AND input_time <= #{param.inputTimeEnd}
AND tm_bas_plant_id = #{param.tmBasPlantId}
<if test="null != param.tmBasWorkShopId and param.tmBasWorkShopId != ''">
AND tm_bas_work_shop_id = #{param.tmBasWorkShopId}
</if>
<if test="null != param.tmBasLineId and param.tmBasLineId != ''">
AND tm_bas_line_id = #{param.tmBasLineId}
</if>
<if test="null != param.nodeNature and param.nodeNature != ''">
AND node_nature = #{param.nodeNature}
</if>
GROUP BY tm_vhc_vehicle_id
这里是聚合函数太多了 而且该表体谅 有几百万数据 后面还是持续变多 , 当前sql用于分页 ,现在这个sql不论分页参数如何变化 每次查询都要十几秒 就算查询一条数据也是如此 请问如何优化下这种SQL
你们平常遇到类似于这汇总很多JION 而且 表的量很大 并且查询的量也很大 这种sql你们是怎么解决的
如下是 SQL解析
下面是具体内容
-> Nested loop inner join (actual time=5765.841..5906.310 rows=11867 loops=1)
-> Nested loop inner join (actual time=5765.814..5843.334 rows=12071 loops=1)
-> Filter: (tvvm.tm_vhc_vehicle_id is not null) (actual time=5765.787..5779.942 rows=12074 loops=1)
-> Table scan on tvvm (actual time=0.002..3.445 rows=12074 loops=1)
-> Materialize (actual time=5765.784..5774.353 rows=12074 loops=1)
-> Group aggregate: max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_HZ10') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_HZ20') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_TZBDCR') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_TZBDCC') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_TZ10') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_TZ20') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_ZZBDCR') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_ZZBDCC') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_ZZ10') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_ZZ20') then tm_vhc_vehicle_movement.input_time end)), max((case when (tm_vhc_vehicle_movement.node_nature = 'Key_Uloc_Type_ZZ30') then tm_vhc_vehicle_movement.input_time end)) (actual time=0.573..5761.008 rows=12074 loops=1)
-> Filter: ((tm_vhc_vehicle_movement.tm_bas_plant_id = 1602841297391443969) and (tm_vhc_vehicle_movement.scan_time >= TIMESTAMP'2023-04-01 09:14:23') and (tm_vhc_vehicle_movement.scan_time <= TIMESTAMP'2023-08-28 09:14:23')) (cost=30757.60 rows=11799) (actual time=0.519..5617.853 rows=53905 loops=1)
-> Index lookup on tm_vhc_vehicle_movement using IDX2_TM_VHC_VEHICLE_ID (is_deleted=0) (cost=30757.60 rows=1062080) (actual time=0.476..4981.458 rows=2183227 loops=1)
-> Filter: (tvv.vin is not null) (cost=0.68 rows=1) (actual time=0.004..0.004 rows=1 loops=12074)
-> Single-row index lookup on tvv using PRIMARY (id=tvvm.tm_vhc_vehicle_id) (cost=0.68 rows=1) (actual time=0.003..0.003 rows=1 loops=12074)
-> Index lookup on too using IDX1_vin (vin=tvv.vin) (cost=0.25 rows=1) (actual time=0.003..0.004 rows=1 loops=12071)