2013-07-30 92 views
1

我有以下的SQL查詢,我想優化它的工作更快。Sql選擇多個值從選擇與許多聯接

select dv.Id, dv.Version, cvco.Time 
from DVPST dvps -- cca. 10 000 entries 
    inner join DVPCT dvpc ON dvps.Value = dvpc.Value 
    inner join DVPT dvp on dvpc.Id = dvp.Id 
    inner join DVT dv on dvp.Id = dv.Id 
    inner join CVCOT cvco ON dv.Id = cvco.Id 
    inner join DT doc on doc.Id = dv.Id 
where dvps.ValueStr in ("value1", "value2", ..., "value1000") 

執行計劃評估所有使用正確的索引,但它仍然需要這麼長時間。 WHERE條件應該過濾從DVPCT表,所以只有這在大多數情況下評估所有條目:

select dv.Id, dv.Version, cvco.Time 
from DVPST dvps 
where dvps.ValueStr in ("value1", "value2", ..., "value10000") 

爲什麼查詢仍然執行時,它什麼都沒有參加那裏的聯接。

非常感謝您的任何想法, 馬立克

回答

0

你可以嘗試在與執行主查詢[...] AS,然後加入。也許它的速度更快:

WITH t AS (
    SELECT Value 
     FROM DVPST 
     WHERE ValueStr IN ("value1", "value2", ..., "value1000") 
) 

SELECT dv.Id, dv.Version, cvco.Time 
    FROM t 
    INNER JOIN DVPCT dvpc ON t.Value = dvpc.Value 
    INNER JOIN DVPT dvp ON dvpc.Id = dvp.Id 
    INNER JOIN DVT dv ON dvp.Id = dv.Id 
    INNER JOIN CVCOT cvco ON dv.Id = cvco.Id 
    INNER JOIN DT doc ON doc.Id = dv.Id 

或用#tempTable嘗試(它可以在某些情況下更快):

SELECT Value 
    INTO #table 
    FROM DVPST 
WHERE ValueStr IN ("value1", "value2", ..., "value1000") 

SELECT dv.Id, dv.Version, cvco.Time 
    FROM #table t 
    INNER JOIN DVPCT dvpc ON t.Value = dvpc.Value 
    INNER JOIN DVPT dvp ON dvpc.Id = dvp.Id 
    INNER JOIN DVT dv ON dvp.Id = dv.Id 
    INNER JOIN CVCOT cvco ON dv.Id = cvco.Id 
    INNER JOIN DT doc ON doc.Id = dv.Id 

讓我知道,如果它幫助。

注意:你確定這個INNER JOIN真的需要嗎?

inner join DT doc on doc.Id = dv.Id 
+0

謝謝!第二個查詢真的很快,也適用於MySQL。需要連接,我減少了查詢,使其更具可讀性。 – Marek