Tsql sqlserver联合查询优化

Tsql sqlserver联合查询优化,tsql,sql-server-2008-r2,query-performance,Tsql,Sql Server 2008 R2,Query Performance,我已经给了一个任务来优化下面的sql查询。当前,查询超时并导致大量阻塞。我刚刚开始使用t-sql,所以请帮助我优化查询 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

我已经给了一个任务来优化下面的sql查询。当前,查询超时并导致大量阻塞。我刚刚开始使用t-sql,所以请帮助我优化查询

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);

解决问题的关键不是修复SQL,而是修复表上的索引。例如,在OfferConditions表上应该有一个包含OfferID和ExcludedID的复合索引


在其他表上创建索引时,请记住,如果字段位于where或join筛选器中,则它应该是复合索引的一部分。

您可以尝试将这些ID插入临时表并将其联接,而不是使用in语句。

硬编码ID的大列表来自何处?你确定你需要联合而不是全体联合吗?你看过实际的执行计划了吗,看看瓶颈在哪里?ID来自代码,代码实际上构建了一个字符串,我猜它正在传递它,我不知道他们为什么选择UNION而不是UNION Allal。所以,我不确定我是否理解这个查询是如何导致大量阻塞的……独立运行它们。问题出在哪里?总数比总数长吗?请张贴执行计划,这可能会有所帮助。我不太同意。从提供的
索引开始,如果这能提供足够的性能,我就到此为止。避免使索引比需要的更宽,也不要仅仅因为字段位于
WHERE
子句中就对其进行索引。