1

I have following sql query and i would like to optimize it to work faster.

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")

Execution plan evalutes all using correct indexes but it still takes so long. The where condition should filter all entries from DVPCT table so only this is evaluated in most cases:

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

Why does the query still executes the joins when it have nothing to join there.

Many thanks for any ideas, Marek

4

1 回答 1

0

您可以尝试在 WITH [...] 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
于 2013-07-30T19:03:16.557 回答