【发布时间】:2014-04-23 08:15:13
【问题描述】:
有点味道 - 这是从水晶报告中调用的查询,该报告使用被分成两个纸箱的纸箱编号进行搜索,并返回两个纸箱编号、它们的数量、从原始报告中删除的数量,用户和拖车号(如果它已经加载到一个上)。
查询的第一部分效果很好,不幸的是所有数据都在 30 天后存档,而且存档量很大!添加存档部分后,此查询可能需要 30 到 45 分钟才能运行,这太长了。谁能帮我优化这个查询,让它运行得更快?
非常感谢,7's。
SELECT *
FROM
(SELECT menu_optn_name,
tran_nbr,
seq_nbr,
cntr_nbr,
ch.total_qty ,
ptt.create_date_time,
um.user_name,
ch.trlr_nbr,
(SELECT sum(ref_field_2)
FROM prod_trkg_tran
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND cntr_nbr = '0030651942') AS Total
FROM prod_trkg_tran ptt
INNER JOIN user_master um ON um.emplye_id = ptt.user_id
LEFT OUTER JOIN carton_hdr ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942'
GROUP BY menu_optn_name,
tran_nbr,
seq_nbr,
cntr_nbr,
ch.total_qty,
ptt.create_date_time,
um.user_name,
ch.trlr_nbr
UNION SELECT menu_optn_name,
tran_nbr,
seq_nbr,
cntr_nbr,
ch.total_qty,
ptt.create_date_time,
um.user_name,
ch.trlr_nbr,
(SELECT sum(ref_field_2)
FROM prod_trkg_tran
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND cntr_nbr NOT IN
(SELECT cntr_nbr
FROM prod_trkg_tran ptt
LEFT OUTER JOIN carton_hdr ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942')
AND tran_nbr IN
(SELECT tran_nbr
FROM prod_trkg_tran ptt
LEFT OUTER JOIN carton_hdr ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942')) AS Total
FROM prod_trkg_tran ptt
INNER JOIN user_master um ON um.emplye_id = ptt.user_id
LEFT OUTER JOIN carton_hdr ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE cntr_nbr NOT IN
(SELECT cntr_nbr
FROM prod_trkg_tran ptt
LEFT OUTER JOIN carton_hdr ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942')
AND tran_nbr IN
(SELECT tran_nbr
FROM prod_trkg_tran ptt
LEFT OUTER JOIN carton_hdr ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942')
GROUP BY menu_optn_name,
tran_nbr,
seq_nbr,
cntr_nbr,
ch.total_qty,
ptt.create_date_time,
um.user_name,
ch.trlr_nbr)
UNION
SELECT *
FROM
(SELECT menu_optn_name,
tran_nbr,
seq_nbr,
cntr_nbr,
ch.total_qty,
ptt.create_date_time,
um.user_name,
ch.trlr_nbr,
(SELECT sum(ref_field_2)
FROM wm_archive.prod_trkg_tran@awm.corp.*******.com
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND cntr_nbr = '0030651942') AS Total
FROM wm_archive.prod_trkg_tran@awm.corp.*******.com ptt
INNER JOIN user_master um ON um.emplye_id = ptt.user_id
LEFT OUTER JOIN carton_hdr ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942'
GROUP BY menu_optn_name,
tran_nbr,
seq_nbr,
cntr_nbr,
ch.total_qty,
ptt.create_date_time,
um.user_name,
ch.trlr_nbr
UNION SELECT menu_optn_name,
tran_nbr,
seq_nbr,
cntr_nbr,
ch.total_qty,
ptt.create_date_time,
um.user_name,
ch.trlr_nbr,
(SELECT sum(ref_field_2)
FROM wm_archive.prod_trkg_tran@awm.corp.*******.com
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND cntr_nbr NOT IN
(SELECT cntr_nbr
FROM wm_archive.prod_trkg_tran@awm.corp.*******.com ptt
LEFT OUTER JOIN wm_archive.carton_hdr@awm.corp.*******.com ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942')
AND tran_nbr IN
(SELECT tran_nbr
FROM wm_archive.prod_trkg_tran@awm.corp.*******.com ptt
LEFT OUTER JOIN wm_archive.carton_hdr@awm.corp.*******.com ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942')) AS Total
FROM wm_archive.prod_trkg_tran@awm.corp.*******.com ptt
INNER JOIN user_master um ON um.emplye_id = ptt.user_id
LEFT OUTER JOIN wm_archive.carton_hdr@awm.corp.*******.com ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE cntr_nbr NOT IN
(SELECT cntr_nbr
FROM wm_archive.prod_trkg_tran@awm.corp.*******.com ptt
LEFT OUTER JOIN wm_archive.carton_hdr@awm.corp.*******.com ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942')
AND tran_nbr IN
(SELECT tran_nbr
FROM wm_archive.prod_trkg_tran@awm.corp.*******.com ptt
LEFT OUTER JOIN wm_archive.carton_hdr@awm.corp.*******.com ch ON ch.carton_nbr = ptt.cntr_nbr
WHERE menu_optn_name = 'RF Split/Comb {Carton}'
AND ptt.cntr_nbr = '0030651942')
GROUP BY menu_optn_name,
tran_nbr,
seq_nbr,
cntr_nbr,
ch.total_qty,
ptt.create_date_time,
um.user_name,
ch.trlr_nbr)
WHERE rownum <=2;
【问题讨论】:
-
你为什么到处使用 SELECT SUM(ref_field_2) FROM...?看起来您正在执行子选择来汇总父选择中聚合的相同行。
-
第一次使用是在第一次选择纸箱号时使用,第二次使用是查找不是第一次号的纸箱号。它在每个查询中恰好使用两次。
-
这不是我要说的...每个单独的 subSELECT SUM FROM... 使用的是在相应的父选择中聚合的相同行...为什么?
-
我不确定我明白你的意思。 SELECT SUM(ref_field_2) 对查询结果中的所有行求和,因为将返回超过 2 行,我只对前 2 行感兴趣,除了 ref_field_2 之外的所有数据都必须合并。
-
您能告诉我哪些列位于哪个表上吗?我对 menu_opt_name、cntr_nbr 和 tran_nbr 感兴趣。另一件事...条件 menu_optn_name = 'RF Split/Comb {Carton}' 和 ptt.cntr_nbr = '0030651942' 隔离了多少行?
标签: sql performance oracle query-optimization