2013-04-16 53 views
0

我在運行mssql 2008數據庫查詢的程序中遇到問題。 我在查詢分析器中做了一些研究。 有一個奇怪的問題有以下兩個查詢:在SQL Server中的性能

SELECT BOLD_ID , 
     BOLD_TYPE 
FROM ZusatzKlasseBase 
WHERE (bold_id IN (SELECT usereintrag 
         FROM  zusatzfeld 
         WHERE metazusatzfeld = 5211309 
           AND wertobject = 1298369) 
      AND bold_id IN (SELECT usereintrag 
          FROM  zusatzfeld 
          WHERE metazusatzfeld = 5207783 
            AND wertdatum = '20130415') 
     ) 

運行VOR這個查詢是大約一秒鐘

SELECT BOLD_ID , 
     BOLD_TYPE 
FROM ZusatzKlasseBase 
WHERE (BOLD_TYPE IN (336)) 
     AND (bold_id IN (SELECT usereintrag 
          FROM  zusatzfeld 
          WHERE metazusatzfeld = 5211309 
            AND wertobject = 1298369) 
       AND bold_id IN (SELECT usereintrag 
           FROM  zusatzfeld 
           WHERE metazusatzfeld = 5207783 
             AND wertdatum = '20130415') 
      ) 

該查詢的運行時間爲一分鐘。

我對此沒有任何解釋,字段BOLD_TYPE被索引。 任何人都可以猜測爲什麼更具體的查詢更慢?

感謝您提前提供所有答案。

+0

剛出來的興趣,你爲什麼要執行'select usereintrag from zusatzfeld where ...'這段代碼兩次?爲什麼不用多組邏輯標準來優化代碼呢? – Paul

+2

執行計劃有何不同? – Rob

+1

那麼,BOLD_TYPE有沒有索引?表中有多少行?有多少行的值是336? –

回答

2

我會改變bold_id指數(我假設有對bold_id索引),以這樣的:

CREATE INDEX whatever ON dbo.ZusatzKlasseBase(bold_id, bold_type) 
    WITH (DROP_EXISTING = ON); 

然後我會重新寫略有查詢:

SELECT BOLD_ID, 
     BOLD_TYPE 
FROM dbo.ZusatzKlasseBase AS b -- always use schema prefix 
WHERE 
    (BOLD_TYPE IN (336)) 
    AND EXISTS 
    (
     SELECT 1 FROM dbo.zusatzfeld 
     WHERE metazusatzfeld = 5211309 
       AND wertobject = 1298369 
       AND usereintrag = b.bold_id 
    ) 
    AND EXISTS 
    ( 
     SELECT 1 FROM dbo.zusatzfeld 
     WHERE metazusatzfeld = 5207783 
       AND wertdatum = '20130415' 
       AND usereintrag = b.bold_id 
    );