2016-11-18 5 views
2

J'ai une requête qui tourne pour toujours. Je suis nouveau en matière de DBA. Je voudrais savoir quelle serait la première chose à faire face à de tels problèmes? J'ai regardé le plan d'exécution La table a seulement 1 index non groupé sur ClassCode. La raison pour laquelle j'utilise tellement de ClassCode, car dans le paramètre de rapport SSRS @ClassCode par défaut, ce sont des valeurs multiples, qui sont plus de 200 d'entre elles.Comment puis-je améliorer les performances des requêtes?

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

Répondre

3

utilisation globale sous condition de le faire

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

déclaration de cas va générer 1 pour la ClassCode qui est présent dans la liste d'autre NULL sera généré. Maintenant, l'agrégat compte comptera 1 pour chaque PolicyNumber. En réglant = 0 nous pouvons nous assurer que le PolicyNumber n'a aucun ClassCode présent dans la liste donnée.

Count peut être remplacé par

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

Avez-vous besoin d'un 0 supplémentaire dans le cas? Je m'attendrais à ce que les valeurs qui ne sont pas dans la liste soient NULL, ce qui ne vaut pas 0. Je peux me tromper. De toute façon, bien meilleure idée que OP. – scsimon

+0

@scsimon - Fait simple: l'agrégat 'Count' ne comptera pas les valeurs' NULL'. Si j'ajoute '0' dans la partie' else', le compte le considèrera comme une valeur et le comptera aussi alors la logique ira pour lancer –

+0

Merci. Il n'y a pas de 'NULL'' ClassCode'. Donc je devrais le laisser 'puis 1 fin'. Correct? – Oleg

0

La première chose à faire est d'ajouter des index à ClassCode et PolicyNumber. Vous pouvez ajouter des index non clusterisés à ces colonnes. Après avoir ajouté des index, assurez-vous de l'exécuter plus d'une fois afin que SQL puisse créer un plan d'exécution pour vous.

Cela va certainement aider votre requête.