2016-08-03 4 views
0

Ich habe Probleme zu verstehen, wie das Hinzufügen nur das Hinzufügen der oberen Auswahl bewirkt, dass die Abfrage von 48 ms auf 7000 ms übergeht. Grundsätzlich, wenn ich nur die gelb hervorgehobene Abfrage ausführe, dauert es 48 ms. Wenn ich den oberen Teil hinzufüge, dauert es 7000 ms. Die Gesamtzahl der zurückgegebenen Zeilen beträgt nur 60, daher kann ich nicht nachvollziehen, warum das verlangsamt wird. Es fühlt sich an, als würde es alle Zeilen in meinen Teilnehmerdateien ausführen, nicht nur die 60, die in der in-Klausel gefunden werden.Nicht zu verstehen, warum das Hinzufügen von IN eine enorme Leistungseinbuße mit SqlServer 2014 verursacht

Abfrage:

Full Query Including In Clause

Plan for full query above

Plan for just part in yellow

Voll Abfrage Einschließlich In Paragraf Plan für die vollständige Abfrage über Plan für die nur ein Teil in gelb Raw Abfrage:

SELECT Attendees.Id, 
     Attendees.UserFirstName, 
     Attendees.UserLastName, 
     Attendees.Email 
FROM Attendees 
WHERE Id IN (
       SELECT DISTINCT dbo.Attendees.Id 
       FROM dbo.SessionAttendee 
        INNER JOIN dbo.Attendees ON (
        dbo.SessionAttendee.Attendees_username = dbo.Attendees.PKID 
        ) 
        INNER JOIN dbo.Sessions ON (dbo.SessionAttendee.Sessions_id = 
        dbo.Sessions.Id) 
       WHERE dbo.Sessions.CodeCampYearId = 104 AND 
        dbo.SessionAttendee.Interestlevel = 3 
    ) 
+0

Dunno ist. Sie könnten das stattdessen als Join umschreiben, was vielleicht perf hilft. – Will

Antwort

1

Nicht sicher, warum Sie Top-Abfrage benötigen, können Sie nicht einfach alles aus der ersten Abfrage auswählen?

+0

Ja, wenn'Attendees.Id' der Primärschlüssel ist, wird es trotzdem eindeutig sein und zusätzliche Spalten werden das Verhalten von DISTINCT nicht ändern. –

+0

Dies verbesserte die Perf, was die innere Abfrage tat (natürlich). Der einzige Grund, warum ich es getrennt habe, ist, dass ich viele Abfragen habe, die nur einen einzigen Wert (attendes.Id) zurückgeben, den ich dann in eine IN-Klausel setze. Die meisten meiner Abfragen, für die ich diese Funktion verwende, werden maschinell generiert, sodass die in-Klausel das Leben einfacher macht. –

0

Sie könnten stattdessen EXISTS versuchen.

SELECT a.Id, 
     a.UserFirstName, 
     a.UserLastName, 
     a.Email 
FROM Attendees a 
WHERE EXISTS (
    SELECT 1 
    FROM dbo.Sessions s 
      JOIN SessionAttendee sa ON sa.Sessions_id = s.Id 
    WHERE s.CodeCampYearId = 104 
      AND sa.Interestlevel = 3 
      AND sa.Attendees_username = a.PKID 
) 

Der IN Teil vielleicht nicht so viel werden für die Performance als der DISTINCT Teil

+0

Danke @ JamieD77 Ich habe versucht, die distinct zu entfernen und es änderte nicht die Perf. Ich bin immer noch verwirrt, warum es so viel langsamer ist. –

Verwandte Themen