2011-03-22 50 views
5

我有兩個疑問,讓我們給他們打電話查詢和查詢B.ALL兩個select語句使用UNION或UNION讓他們難以置信的慢

這兩個查詢的第二個對我的情況下運行測試和查詢A返回1結果,並且查詢B返回0結果。

如果我union(或union all)這兩個查詢,它需要一分鐘以上才能返回(預期的)1結果。

這兩個查詢都從相同的表中選擇相同的列。我可能會在沒有工會的情況下重寫這整個事情,因爲我有一個高度條件化的where子句,但我試圖擺脫這樣做。

任何想法?我不確定我有多少精確的查詢和模式可以分享,但我很樂意提供我能做的。

這是在MSSQL 2008上,如果它對任何人的迴應都很重要。

+0

你能通過從一個新的空模式開始複製結果並添加少量僅包含非機密測試數據的表?它不一定是來自應用程序的數據 - 只是隨機數或樣本數據庫(或來自StackOverflow數據轉儲的數據,或者您真正喜歡的任何數據)。 – 2011-03-22 21:26:58

+0

有問題的數據庫曾經在2005年運行,直到最近,我碰巧有一個副本(具有相同的數據)仍然在2005服務器上運行。完整查詢(包括union)按預期執行,不存在額外的開銷。是否有任何具體的改變從2005年 - > 2008年,會導致任何人都知道? – Jay 2011-03-22 21:31:31

+0

我能夠在不同的2008服務器上覆制。無論compat級別如何,我都會遇到問題。我沒有想到這會有所幫助,但認爲這值得一試。 – Jay 2011-03-22 21:37:44

回答

1

我會嘗試查看Management Studio中針對單個查詢的執行計劃,然後將其與包含UNION的查詢的執行計劃進行比較。

如果在執行時間上有很大差異,我會想象UNION的查詢的執行計劃有什麼問題。識別不同的東西可以幫助你(也許我們)在正確的方向指出潛在的問題。

0

他們都在做桌面掃描嗎?這聽起來像它可能超過緩存容量,並且你正在緩存到磁盤。

即使它們來自同一張表,記錄可能會獨立鎖定。

1

UNION中非常相似且在同一個表上的單獨的子句可以被優化器合併爲一個查詢。您可以通過查詢計劃中的UNION運算符缺少來看到這一點。我見過類似的東西出現,但很少

你可以做的是第一個查詢後跟INSERT #temp...第二

現在,在哪裏我讀這一個SELECT.. INTO #temp... ...