2013-09-27 2 views
0

아래의 SQL 쿼리를 최적화하는 작업을 제공했습니다. 현재 쿼리가 시간 초과되어 차단이 많이 발생합니다. 방금 t-sql을 사용하기 시작 했으므로 쿼리를 최적화하는 데 도움을주십시오.Sql Server Union 쿼리 최적화

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 ALL보다는 UNION이 필요한가요? 실제 실행 계획을 보면서 병목 현상이 어디인지 확인 했습니까? –

+0

ID 코드에서오고있다, 실제로 문자열을 작성하는 코드 나는 그것을 전달하는 것 그리고 그들이 UNION 대신 UNION을 선택하는 이유가 무엇인지 모르겠다 ALL – user2041076

+1

또한이 쿼리가 어떻게 될 수 있는지 잘 모르겠다. 차단이 많이 발생합니다. –

답변

0

문제를 해결하는 열쇠는 SQL을 수정하는 것이 아니라 테이블의 색인을 수정하는 것입니다. 예를 들어, OfferID 및 ExcludedID를 사용하여 OfferConditions 테이블에 복합 인덱스를 가져야합니다.

다른 테이블에 인덱스를 만들 때 필드가 where 또는 join 필터에 있으면 해당 인덱스가 복합 인덱스의 일부 여야합니다.

+2

나는 꽤 동의하지 않는다. 'OfferID'에 대한 색인으로 시작하십시오. 그리고 그 것이 적절한 성능을 제공한다면 저는 거기에서 멈출 것입니다. 인덱스가 필요한 것보다 넓게 만드는 것을 피하고 WHERE 절에 있기 때문에 필드를 인덱싱하지 마십시오. –

1

이러한 ID를 임시 테이블에 삽입하고 IN 문을 사용하는 대신이를 조인 할 수 있습니다.