select count(T.CONTRACT_ID) TOTALNUM,
nvl(sum(S.SPLITAMOUNT), 0) TOTALMONEY,
nvl(sum(S.SPLITNUM), 0) TOTALAMOUNT
from PS_CTT_CONTRACT T, PS_CTT_CONTRACTDETAIL S
where T.CONTRACT_ID = S.CONTRACT_ID
and T.CONTRACTENDSTATE = '0'
and ((T.RUNSTATE in ('5', '10') and
(exists (select *
from PS_AA_AVAILBILL A
where A.CONTRACT_ID = T.CONTRACT_ID
and A.BILL_STATE in ('1', '2', '3', '4', '10', '11')) and
(not exists (select B.CONTRACT_ID
from PS_EP_TREASURYPAY B
where B.CONTRACT_ID = T.CONTRACT_ID) and
not exists
(select C.CONTRACT_ID
from PS_EP_PAY C
where C.CONTRACT_ID = T.CONTRACT_ID) or exists
(select B.CONTRACT_ID
from PS_EP_TREASURYPAY B
where B.CONTRACT_ID = T.CONTRACT_ID
and B.PAYSTATE in ('00', '01', '03')
union all
select C.CONTRACT_ID
from PS_EP_PAY C
where C.CONTRACT_ID = T.CONTRACT_ID
and C.PAYSTATE in ('00', '01', '03'))))) or
(T.RUNSTATE in ('6', '7', '9') and not exists
(select B.CONTRACT_ID
from PS_EP_TREASURYPAY B
where B.CONTRACT_ID = T.CONTRACT_ID
and B.PAYSTATE in ('00', '01', '03')) and not exists
(select C.CONTRACT_ID
from PS_EP_PAY C
where C.CONTRACT_ID = T.CONTRACT_ID
and C.PAYSTATE in ('00', '01', '03'))))
and T.DISTRICTCODE = '00';
大量資料,此sql已經是經過優化了,還是效率慢,加過了如下索引
CREATE INDEX emeb_PS_EP_TREASURYPAY_fast on PS_EP_TREASURYPAY(PAYSTATE,CONTRACT_ID);
還是不好用。。求大神看下給一下優化思路。。謝謝!
uj5u.com熱心網友回復:
執行計劃
CONTRACT_ID 在各個表里 是唯一值嗎 還是會有重復?
uj5u.com熱心網友回復:
索引建得有問題,正確的應該是:
CREATE INDEX EMEB_PS_EP_TREASURYPAY_FAST ON PS_EP_TREASURYPAY(CONTRACT_ID,PAYSTATE);
uj5u.com熱心網友回復:
exists用得太多,不清楚腳本邏輯,無從優化。uj5u.com熱心網友回復:
優化不能只看陳述句,需要關注相關表資料量、欄位的選擇性等等;外加執行計劃
最好能給出這些資訊,陳述句只是表象
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/77998.html
標籤:高級技術
上一篇:oralce 查詢
下一篇:oracle登陸例外
