2014-09-04 81 views
0

我有兩個表充滿了客戶調查響應數據。我一直在分別對它們運行查詢,並在不到一秒鐘內返回結果,但如果將它們結合起來,它似乎永遠運行。 5分鐘以上沒有結果返回,沒有錯誤發生,它仍然顯然是「運行」,但我無法弄清楚它實際上試圖做什麼可能是如此複雜。聯盟/聯盟所有慢或不工作

從本質上說,我的查詢工作,分別是:

SELECT 
oldsurveys.column1 as [something1], 
oldsurveys.column2 as [something2], 
oldsurveys.column3 as [something3], 
'staticvalue1' as [something4], 
oldsurveys.column5 as [something5] 
FROM 
database1.dbo.table1 oldsurveys 
WHERE 
oldsurveys.column1 = 'something' 
AND oldsurveys.column2 >= '2014-01-01 00:00:00' 
ORDER BY [something2], [something1] 

SELECT 
newsurveys.column1 as [something1], 
newsurveys.column2 as [something2], 
newsurveys.column3 as [something3], 
newsurveys.column4 as [something4], 
'staticvalue2' as [something5] 
FROM 
database2.dbo.table1 newsurveys 
WHERE 
newsurveys.column1 = 'something' 
AND newsurveys.column2 >= '2014-01-01 00:00:00' 
ORDER BY [something2], [something1] 

如果我跑,我得到兩個數據表返回幾乎瞬間。如果我在兩個select語句之間添加UNION ALL,請註釋掉第一個ORDER BY並嘗試再次運行它只是運行並運行並運行,無結果...

任何想法我在做什麼錯?這些表是否在不同的數據庫中導致這種情況,如果是這樣,是否有解決方法?

+0

執行計劃???? – 2014-09-04 16:03:07

+0

如果您從兩者中刪除訂單,該怎麼辦? – Aret 2014-09-04 16:07:05

+0

如果我完全刪除了'ORDER BY'子句,那麼它會很快得出第一個select語句的所有結果,然後第二個select語句(與它只是無限期地運行相同的問題)沒有任何結果。 – CactusCake 2014-09-04 17:46:46

回答

1

沒有執行計劃,幾乎不可能得到性能問題的確切原因。這裏有一個可能解釋這種現象:

  • 你有指數上[something2][something1]兩個表
  • 當你單獨查詢每個表
  • ,SQL Server使用索引
  • 當你UNION ALL都查詢,SQL Server理論上可以使用每個索引對子查詢的結果進行排序,但不能使用索引對完整的結果集進行排序,因此它必須對完整的結果集進行排序

BTW,(因爲你無論是在你的標題,但在您的文章身體只有一個提到的),有UNIONUNION ALL之間的巨大區別 - 前者可能執行更加惡化,因爲它必須從結果集中刪除重複。

+0

'[something2]'是每個數據庫中的主鍵,'[something1]'是日期時間。不確定是否索引了其中一個或兩個。由於兩個數據庫都是由不同客戶進行的調查填充的,因此不應該有任何重複,所以我一直在使用'UNION ALL'而不是'UNION'進行測試(儘管在我的沮喪之中,我已經試過了,看看它是否會有什麼區別)。我總共使用了10列,並且在查詢2中查詢1和〜260中有約30,600個結果,但即使它沒有索引完成,也不應該很難對很多行進行排序。 :■ – CactusCake 2014-09-04 18:30:22