1

UPDATE

我認爲現在還不成熟。經過多次測試後,我發現性能沒有提高。我將在這裏執行更多的測試併發布更新。直到那時,不用回答這個問題。SQL查詢UNION性能

我有這樣的查詢...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo 
         UNION 
         SELECT boTemp.[Id] 
         FROM [#BusinessObject_Table] boTemp) 

該查詢永遠需要一個相當大的數據集上運行。我還在臨時表的Id列中添加了CLUSTERED索引,這可以提高性能,但仍然無法完成。

我代替此查詢這... ...

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE [Field_A] NOT IN (SELECT bo.[Id] 
         FROM [BusinessObject_Table] bo) 
     AND [Field_A] NOT IN (SELECT boTemp.[Id] 
          FROM [#BusinessObject_Table] boTemp) 

這秒內完成。有人能解釋這裏發生了什麼嗎?

更新: 我以爲兩個查詢都是一樣的。這是我需要的。

BusinessObject_Table has following Ids: 1, 2, 3

#BusinessObject_Table has: 3, 4, 5

TempTable has rows whose Field_A values are: 1, 2, 3, 4, 6

查詢的結果應該是:6(在上面的查詢其變化)

我將努力讓查詢計劃和崗位他們在這裏。

+1

請張貼計劃。無論如何,查詢都會做不同的事情。第二個檢查它沒有出現在兩個表中。第一張桌子。第一個需要使用'intersect'或第二個'或'是相同的。 – 2012-03-27 09:22:52

回答

3

猜不透在沒有查詢計劃...

的UNION子查詢強制DISTINCT。使用單獨的IN子句,這是可以避免的。然而,邏輯是查詢之間的不同(編輯:馬丁·史密斯指出)

隨着UNION ALL和一個它應該會更好,如果是這樣的邏輯,你想

WHERE [Field_A] NOT IN (SELECT bo.[Id] 
        FROM [BusinessObject_Table] bo 
        UNION ALL 
        SELECT boTemp.[Id] 
        FROM [#BusinessObject_Table] boTemp) 
2

我認爲你應該做的您的查詢以這種方式:

SELECT DISTINCT TOP 11 [Field_A] 
FROM [#TempTable] 
WHERE NOT EXISTS(
    SELECT 1 FROM BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) AND NOT EXISTS(
    SELECT 1 FROM #BusinessObject_Table bo WHERE #TempTable.FieldA = bo.Id 
) 

這樣SQL Server可以使用它的優化器可能比UNIONed查詢好一點。根據索引策略和表大小,優化器可能會選擇以不同順序運行查詢。這很可能是最快的方式。雖然沒有表格結構和索引以及執行計劃,但很難確定。

+0

謝謝你。現在查詢速度很快。我將對此進行測試,並在稍後發佈更多評論(以及執行計劃) – Zuber 2012-03-27 11:55:24