2015-11-02 220 views
1

下面的查詢花費很長時間,我試圖調整查詢,但它似乎不工作。無論如何,我可以重寫查詢。請幫我調整查詢。SQL查詢花費很長時間

SELECT DISTINCT TC.V_ID,A.ID,A.NAME 
    FROM OM_A_DATA TC 
     INNER JOIN ACC_DOM_EXT AE ON TC.DOMAINS = AE.DOMAIN 
     LEFT OUTER JOIN ACCOUNT A ON A.ID=AE.ACCOUNTID 
    WHERE V_ID not in (select distinct V_ID from DATA_ACC_MAP) 


OM_A_DATA has 41,696,776 rows 
ACC_DOM_EXT has 106,725 rows 
ACCOUNT has 106731 rows 
DATA_ACC_MAP has 91021 rows   
+3

無需在子查詢中選擇DISTINCT。 – jarlh

+0

V_ID列是否定義了NOT NULL? –

回答

3

通常not exists作品比not in更好:

SELECT DISTINCT TC.V_ID, A.ID, A.NAME 
FROM OM_A_DATA TC INNER JOIN 
    ACC_DOM_EXT AE 
    ON TC.DOMAINS = AE.DOMAIN LEFT OUTER JOIN 
    ACCOUNT A 
    ON A.ID = AE.ACCOUNTID 
WHERE NOT EXISTS (SELECT 1 FROM DATA_ACC_MAP dam WHERE dam.V_ID = tc.V_ID); 

顯然,你應該有DATA_ACC_MAP(V_ID)的索引。您還應該在其他列上有索引:OM_A_DATA(V_ID, DOMAINS),ACC_DOM_EXT(DOMAIN, ACCOUNTID)ACCOUNT(ID, NAME)

1

要麼刪除DISTINCT

SELECT DISTINCT TC.V_ID, A.ID, A.NAME 
FROM OM_A_DATA TC 
INNER JOIN ACC_DOM_EXT AE ON TC.DOMAINS = AE.DOMAIN 
LEFT OUTER JOIN ACCOUNT A ON A.ID = AE.ACCOUNTID 
WHERE V_ID NOT IN (SELECT V_ID FROM DATA_ACC_MAP) 

或使用INNER JOIN而不是子查詢。

SELECT DISTINCT TC.V_ID, A.ID, A.NAME 
FROM OM_A_DATA TC 
INNER JOIN ACC_DOM_EXT AE ON TC.DOMAINS = AE.DOMAIN 
INNER JOIN DATA_ACC_MAP AD ON TC.V_ID != AD.V_ID 
LEFT OUTER JOIN ACCOUNT A ON A.ID = AE.ACCOUNTID 

或使用LEFT JOIN而不是子查詢和修改WHERE條款。

SELECT DISTINCT TC.V_ID, A.ID, A.NAME 
FROM OM_A_DATA TC 
INNER JOIN ACC_DOM_EXT AE ON TC.DOMAINS = AE.DOMAIN 
LEFT JOIN DATA_ACC_MAP AD ON TC.V_ID = AD.V_ID 
LEFT OUTER JOIN ACCOUNT A ON A.ID = AE.ACCOUNTID 
WHERE AD.V_ID IS NULL