with issue as select cmm_idstring_aggl3_flag ; as l3_flagstring_aggcare_id ; as care_idstring_aggcare_name ; as care_namestring_aggump_id ; as issue_id from t_issue_track_summary_info where deleted
要优化这个查询,可以考虑以下几点:
-
索引优化:为频繁使用的字段添加索引,如collect.patch_id、collect.dts_biz_no、details.parent_no等。这样可以加快关联表的查询速度。
-
子查询优化:将子查询中的聚合函数改为窗口函数,可以避免多次扫描表。例如,将issue的子查询改为窗口函数:
select cmm_id,
string_agg(l3_flag, ";") over (partition by cmm_id) as l3_flag,
string_agg(care_id, ";") over (partition by cmm_id) as care_id,
string_agg(care_name, ";") over (partition by cmm_id) as care_name,
string_agg(ump_id, ";") over (partition by cmm_id) as issue_id
from t_issue_track_summary_info
where deleted is null
-
连接顺序调整:将子查询放在最后连接,可以减少中间结果集的大小。
-
避免使用函数:避免在查询条件中使用函数,可以提高查询的性能。例如,将collect.version_id的条件改为直接比较字符串值。
综上所述,以下是优化后的查询:
SELECT collect.id,
CASE WHEN issue.l3_flag IS NULL THEN '' ELSE issue.l3_flag END AS L3flag,
issue.care_id,
CASE WHEN issue.care_name IS NULL THEN '' ELSE issue.care_name END AS CareName,
issue.issue_id,
collect.patch_plan,
collect.patch_id,
collect.cur_step,
collect.turns,
collect.cur_test,
...
FROM t_dts_collect collect
LEFT JOIN t_patch_info patch ON collect.patch_id=patch.id
LEFT JOIN t_dts_details details ON collect.dts_biz_no = details.dts_biz_no
LEFT JOIN t_dts_details details_parent ON details.parent_no = details_parent.dts_biz_no
LEFT JOIN (
SELECT cmm_id,
string_agg(l3_flag, ";") OVER (PARTITION BY cmm_id) AS l3_flag,
string_agg(care_id, ";") OVER (PARTITION BY cmm_id) AS care_id,
string_agg(care_name, ";") OVER (PARTITION BY cmm_id) AS care_name,
string_agg(ump_id, ";") OVER (PARTITION BY cmm_id) AS issue_id
FROM t_issue_track_summary_info
WHERE deleted IS NULL
) issue ON collect.dts_biz_no = issue.cmm_id
WHERE collect.is_deleted = 0
AND collect.version_id = '23735486'
AND collect.patch_plan IN ('CP2118')
ORDER BY details.create_time DESC
LIMIT 200
``
原文地址: https://www.cveoy.top/t/topic/iMmO 著作权归作者所有。请勿转载和采集!