2016-11-18 5 views
2

Ich habe ein Stück Abfrage, die für immer dreht. Ich bin neu in Sachen DBA. Ich würde gerne wissen, was als erstes mit solchen Problemen umgehen würde. Ich schaute auf den Ausführungsplan Die Tabelle hat nur 1 nicht gruppierten Index auf ClassCode. Der Grund, warum ich so viele Klassencodes verwende, ist, dass im SSRS-Berichtsparameter @ClassCode standardmäßig mehrere Werte sind, also über 200.Wie kann ich die Abfrage-Performance verbessern

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

Antwort

3

Verwendung bedingtes Aggregat dieser

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

Case-Anweisung zu tun, wird 1 für die ClassCode erzeugen, die sonst in der Liste vorhanden ist, wird NULL erzeugt werden. Jetzt zählt das Zählaggregat 1 für jede PolicyNumber. Mit der Einstellung = 0 können wir sicherstellen, dass die PolicyNumber keine ClassCode in der angegebenen Liste vorhanden ist. zu tun ist, fügen Sie Indizes und Classcode PolicyNumber

Count mit

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

Benötigen Sie eine else 0 in dem Fall? Ich würde erwarten, dass Werte, die nicht in der Liste sind, NULL sind, was nicht = 0 ist. Ich könnte mich jedoch irren. So oder so, viel bessere Idee als OP. – scsimon

+0

@scsimon - Einfache Tatsache ist, dass 'Count' Aggregat nicht' NULL' Werte zählt. Wenn ich "0" in "else" Teil hinzufüge, dann wird die Zählung es als einen Wert betrachten und es ebenso zählen, dann wird die Logik zum Werfen gehen –

+0

Danke. Es gibt keinen 'NULL'' ClassCode'. Also sollte ich es "dann 1 Ende" lassen. Richtig? – Oleg

0

Das erste, was ersetzt werden. Sie können diesen Spalten nicht gruppierte Indizes hinzufügen.

Nachdem Sie Indizes hinzugefügt haben, stellen Sie sicher, dass Sie sie mehrmals ausführen, damit SQL einen Ausführungsplan für Sie erstellen kann.

Das wird definitiv Ihre Abfrage helfen.

Verwandte Themen