SQL查询花费很长时间

SQL查询花费很长时间

问题描述:

下面的查询花费很长时间,我试图调整查询,但它似乎不工作。无论如何,我可以重写查询。请帮我调整查询。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? –

通常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)

要么删除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