2016-11-18 6 views
2

영원히 회전하는 쿼리가 있습니다. 저는 DBA 관련 일을 처음 접했습니다. 나는 그런 문제를 다루는 첫 번째 일이 무엇인지 알고 싶습니까? 실행 계획을 살펴 보았습니다 테이블에 ClassCode에 클러스터되지 않은 인덱스가 1 개만 있습니다. SSRS 보고서 매개 변수 @ClassCode가 기본적으로 200 개가 넘는 여러 값이 될 수 있기 때문에 많은 ClassCode를 사용하고있는 이유입니다.쿼리 성능을 향상시키는 방법

SELECT PolicyNumber 
FROM tblClassCodesPlazaCommercial 
WHERE PolicyNumber NOT IN (
          SELECT PolicyNumber 
          FROM tblClassCodesPlazaCommercial 
          WHERE ClassCode IN (
                33489,31439,41894,68189,,01199,68528,67139,68128,739889, 
                33428,5561,68428,01484,5281,67227,01184,50199,23528,33283,03228, 
                50499,41594,50427,5181,31484,03199,6481,68239,50439,68489,36127,  
                50472,67128,23149,33439,03149,5452,23189,50228,01428,69183,50527, 
                67499,739189,50159,31183,33499,01283,33128,50239,6451,33159, 
                21199,67272,67127,69427,5451,23239,67199,67449,67189,01599,40228, 
                50184,5551,33299,7398,40179,40128,50139,7381,33199,50497,23428,33129, 
                738299,67149,40184,23128,69199,68499,50299,31449,40497,68169,67197, 
                5191,67259,5252,03489,67459,21299,5262,01181,03428,31483,68183,68228, 
                31199,40484,738199,03499,31499,40189,7382,67439,21527,50449,01427, 
                68199,5453,50528,36228,50259,68299,50227,23459,33528,40199,40427, 
                21289,42594,5283,34489,5251,21228,50197 
                ) 
          ) 

enter image description here

답변

3

사용 조건 집합이

SELECT PolicyNumber 
FROM tblClassCodesPlazaCommercial 
group by PolicyNumber 
having count(case when ClassCode IN (33489,31439,41894,..) then 1 end) = 0 

Case 문은 다른 NULL가 생성됩니다 목록에 존재하는 ClassCode 1을 생성 할 수 있습니다. 이제 집계 집계는 각 PolicyNumber에 대해 1을 계산합니다. = 0을 설정하면 PolicyNumber에 주어진 목록에 ClassCode이 없는지 확인할 수 있습니다.

Count은 ClassCode 및 PolicyNumber에 인덱스를 추가한다 할

SUM(case when ClassCode IN (33489,31439,41894,..) then 1 else 0 end) = 0 
+0

다른 경우가 필요합니까? 목록에없는 값이 0이 아닌 NULL이 될 것으로 기대합니다. 그러나 나는 잘못 될 수 있습니다. 어느 쪽이든, OP보다 훨씬 좋은 아이디어. – scsimon

+0

@scsimon - 단순한 사실은'Count' 집계가'NULL' 값을 계산하지 않는다는 것입니다. else 부분에'0'을 추가하면 count는 값으로 간주하고 카운트합니다. 그러면 논리가 toss로 갈 것입니다 –

+0

고마워요. 'NULL'' ClassCode'가 없습니다. 그래서 나는 그것을 '1 끝'으로 남겨 두어야한다. 옳은? – Oleg

0

우선으로 대체 할 수있다. 이러한 열에 클러스터되지 않은 인덱스를 추가 할 수 있습니다.

인덱스를 추가 한 후 SQL을 여러 번 실행하여 SQL에서 실행 계획을 세울 수 있도록하십시오.

귀하의 질문에 도움이 될 것입니다.