2011-08-31 102 views
1

我們從SQL Server 2000遷移到2008,並且對於某些用戶(在某些數據庫角色中),當我們使用UNION運算符時,查詢運行非常緩慢。我嘗試了與UNION ALLSQL Server 2008升級後,使用UNION查詢運行速度非常緩慢

查詢是像下面

SELECT 'PONumber'= '','POId'='' 

UNION 

SELECT DISTINCT 
       'PONumber'=PONumber, 
       'POId'=RTRIM(CONVERT(varchar(32),po.POId)) 
FROM PurchaseOrder po JOIN ... JOIN ..... JOIN ................... 

如果我只是刪除了第一部分(和UNION)和運行結果立即返回第二個查詢。

有什麼建議嗎?

+2

在更新之前,相同的查詢是如何執行的?我會檢查執行計劃並重建受影響的索引以防萬一。 –

+0

您需要查看執行計劃。看起來你不是模式限定你的對象(例如'dbo.PurchaseOrder',所以我認爲這可以解釋爲什麼不同的用戶可以得到不同的計劃) –

+0

不知道是否有助於指出其中一個連接表使用sysusers和sysmembers系統tables uid列,因爲我們在數據庫中使用SQL Server內置安全性 –

回答

0

我不知道它是如何在SQL 2000中發生反應的,但是使用UNION而不是UNION ALL會在兩個查詢的結果合併時(除去重複項)導致排序操作。這可能是大量的處理,具體取決於結果集的大小。

此外,tempdb的使用情況改變非常顯着SQL 2000和SQL 2008年排序操作可能會使用tempdb,所以你應該檢查介質爲您的tempdb,並確保它有足夠的空間之間,等

+0

是的。 tempdb現在只使用640 MB,剩下400 MB。不知道是否有幫助注意到,其中一個連接表使用sysusers和sysmembers系統表的uid列,因爲我們在整個數據庫中使用SQL Server內置安全性 –

+0

我會嘗試使用更多'tempdb測試另一臺服務器上的代碼'空間,看看是否有幫助。 –