我有2張桌子。表「Accs」包含900萬行(3列:acc_id,月份,年份)。 首先,我需要提取包含的賬號, 部分條目,然後在這些記錄中找到完全匹配,如果不記錄 - 那麼第一部分匹配如何優化下一個oracle查詢?
WITH t AS (
SELECT a.acc_id,
t1.as,
t1.cust,
t1.curr,
t1.code,
t1.depart,
t1.sdate,
t1.stype,
t1.amount,
t1.s_id
FROM table1 t1
LEFT JOIN Accs a
ON SUBSTR(a.acc_id,7,12)=t1.curr||LPAD(t1.code,4,'0')||LPAD(t1.depart,3,'0')
WHERE t1.sdate='20.11.2011' AND t1.stype='A' AND a.month=11 ANd a.year=2011)
SELECT MAX(t.s_id),
(CASE WHEN t.as='000000'
THEN (CASE WHEN ac2.acc_id IS NOT NULL THEN ac2.acc_id ELSE t.acc_id END)
ELSE t.cust||t.curr||LPAD(t.code,4,'0')||LPAD(t.depart,3,'0') END) acc_id
FROM t
LEFT JOIN (SELECT t.acc_id FROM t) ac2
ON SUBSTR(ac2.acc_id,1,6)='000'||LPAD(t.depart,3,'0')
GROUP BY
(CASE WHEN t.as='000000'
THEN (CASE WHEN ac2.acc_id IS NOT NULL THEN ac2.acc_id ELSE t.acc_id END)
ELSE t.cust||t.curr||LPAD(t.code,4,'0')||LPAD(t.depart,3,'0') END)
這個查詢需要較長時間。我是否正確?
我懷疑你可以加快速度。很多連接都是在計算結果上完成的,這意味着索引不能使用。 – 2011-12-23 05:44:47
有沒有其他更快的方法來做同樣的事情? – DmitryB 2011-12-23 05:52:52
將這些計算出的字段存儲在派生字段中(這會使某些字符非規格化),但確實允許使用索引。 – 2011-12-23 05:53:55