原帖由 lfree 于 2008-6-4 11:50 发表
在我们的生产系统,有一条sql语句,问一下大家该如何优化:
SELECT drug_export_detail.retail_price, drug_export_detail.purchase_price
FROM drug_export_detail, drug_export_master
WHERE (drug_export_detail.document_no = drug_export_master.document_no)
AND ((drug_export_master.STORAGE = :xx1)
AND (drug_export_detail.drug_code = :xx2)
AND (drug_export_detail.package_spec = :xx3)
AND (drug_export_detail.firm_id = :xx4)
)
AND export_date =
(SELECT MAX (export_date)
FROM drug_export_detail, drug_export_master
WHERE (drug_export_detail.document_no =
drug_export_master.document_no
)
AND ((drug_export_master.STORAGE = :xx1)
AND (drug_export_detail.drug_code = :xx2)
AND (drug_export_detail.package_spec = :xx3)
AND (drug_export_detail.firm_id = :xx4)
)
GROUP BY drug_export_master.STORAGE,
drug_export_detail.drug_code,
drug_export_detail.package_spec,
drug_export_detail.firm_id)
AND ROWNUM = 1;
优化成这个行不?
select a.retail_price,a.purchase_price
from drug_export_detail a,
drug_export_master b,
(select max(export_date) max_export_date
from drug_export_detail m,
drug_export_master n
where m.document_no = n.docment_no
and n.storage = :xx1
and n.drug_code = :xx2
and n.package_spec = :xx3
and n.firm_id = :xx4) c
where a.docment_no = b.docment_no
and b.storage = :xx1
and b.drug_code = :xx2
and b.pacakge_spec = :xx3
and b.firm_id = :xx4
and a.export_date = c.max_export_date;
主表和明细表分别取两次是不可避免的,但是可以去掉不必要的group by ,这个对性能影响是比较大的 |