2015-11-02 4 views
1

Нижеприведенный запрос занимает много времени, и я пытаюсь настроить запрос, но он, похоже, не работает. Там все равно я могу переписать запрос. Пожалуйста, помогите мне в настройке запроса.SQL Query занимает много времени

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 
Смежные вопросы