2013-09-27 115 views
0

我已經給出了一個任務來優化下面的sql查詢。目前查詢超時並導致大量阻塞。我剛開始使用t-sql,所以請幫助我優化查詢。Sql Server聯合查詢優化

select ExcludedID 
from OfferConditions with (NoLock) 
where OfferID = 27251 
    and ExcludedID in (210,223,409,423,447,480,633,...lots and lots of these..., 
    13346,13362,13380,13396,13407,1,2) 

union 

select CustomerGroupID as ExcludedID 
from CPE_IncentiveCustomerGroups ICG with (NoLock) 
inner join CPE_RewardOptions RO with (NoLock) 
on RO.RewardOptionID = ICG.RewardOptionID 
where RO.IncentiveID = 27251 
    AND ICG.Deleted = 0 and RO.Deleted = 0 and 
    and ExcludedUsers = 1 
    and CustomerGroupID in (210,223,409,423,447,480,633,...lots and lots of these..., 
    13346,13362,13380,13396,13407,1,2); 
+2

這個硬編碼ID的大列表來自哪裏?你確定你需要UNION而不是UNION ALL嗎?你看過實際執行計劃,看看瓶頸在哪裏嗎? –

+0

ID是來自代碼,代碼實際上構建一個字符串,我想它是通過它,我沒有細節爲什麼他們選擇UNION而不是聯盟所有 – user2041076

+1

此外,我不知道我明白這個查詢可能是如何造成很多阻塞... –

回答

0

解決您的問題的關鍵不是修復SQL,而是修復您的表上的索引。例如,您應該在OfferConditions表上有OfferID和ExcludedID的複合索引。

當您在其他表上創建索引時,請記住,如果該字段位於where或聯接篩選器中,它應該是您的複合索引的一部分。

+2

我不太同意。從「OfferID」索引開始,如果能夠提供足夠的性能,我會停下來。避免使索引比他們需要的更寬泛,並且不要僅僅因爲它在'WHERE'子句中而對索引進行索引。 – 2013-09-27 22:49:57

1

您可以嘗試將這些ID插入臨時表並加入它而不是使用IN語句。