2013-07-30 87 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