Warum funktioniert dieser speed up my SQL-Abfrage?

Habe ich gelernt, ein trick, eine Weile zurück von einer DBA-Freund, um die Geschwindigkeit bestimmter SQL-Abfragen. Ich erinnere mich, ihn zu erwähnen, dass es etwas damit zu tun hatte, wie SQL Server kompiliert die Abfrage, und dass die Abfrage Weg ist gezwungen, den indizierten Wert.

Hier ist meine ursprüngliche Abfrage (dauert 20 Sekunden):

select Part.Id as PartId, Location.Id as LocationId
 FROM Part, PartEvent PartEventOuter, District, Location 
WHERE 
    PartEventOuter.EventType = '600'   AND PartEventOuter.AddressId = Location.AddressId  
    AND Part.DistrictId = District.Id   AND Part.PartTypeId = 15   
    AND District.SubRegionId = 11   AND PartEventOuter.PartId = Part.Id  
    AND PartEventOuter.EventDateTime <= '4/28/2009 4:30pm'   
    AND NOT EXISTS (
            SELECT PartEventInner.EventDateTime  
            FROM PartEvent PartEventInner
            WHERE PartEventInner.PartId = PartEventOuter.PartId
                AND PartEventInner.EventDateTime > PartEventOuter.EventDateTime 
                AND PartEventInner.EventDateTime  <= '4/30/2009 4:00pm')

Hier ist die "optimierte" Abfrage (weniger als 1 Sekunde):

select Part.Id as PartId, Location.Id as LocationId
 FROM Part, PartEvent PartEventOuter, District, Location 
WHERE 
    PartEventOuter.EventType = '600'   AND PartEventOuter.AddressId = Location.AddressId  
    AND Part.DistrictId = District.Id   AND Part.PartTypeId = 15   
    AND District.SubRegionId = 11   AND PartEventOuter.PartId = Part.Id  
    AND PartEventOuter.EventDateTime <= '4/28/2009 4:30pm'   
    AND NOT EXISTS (
            SELECT PartEventInner.EventDateTime  
            FROM PartEvent PartEventInner
            WHERE PartEventInner.PartId = PartEventOuter.PartId
                **AND EventType = EventType**
                AND PartEventInner.EventDateTime > PartEventOuter.EventDateTime 
                AND PartEventInner.EventDateTime  <= '4/30/2009 4:00pm')

Kann mir jemand im detail erklären, warum läuft so viel schneller? Ich versuche nur, um ein besseres Verständnis dieser.

  • Haben Sie versucht, suchen Sie die Abfrage-plan?
  • Denn es gibt einen index auf eventtype?
  • Haben Sie nicht ein index auf diesem Feld?
  • Abhängig von Ihrer Datenbank-engine, ich bin davon ausgegangen, dass Sie SQL 2005/2008
  • Ja ich habe es angeschaut, aber es bedeutet nicht nichts zu mir. Die Kosten für die ursprüngliche Serie um 31% auf einen Clustered Index Scan (neben vielen anderen Clustered Index Scans). Die höchsten Kosten in der "optimierten" version ist ein 8% "Clustered Index Scan".
  • Beachten Sie, dass, wenn Typ null-Werte zulässt, dann 2 Abfragen sind nicht das gleiche (wie EventType = EventType wäre nicht wahr, wenn Typ NULL IST).
  • Eigentlich ist dieses "Feld" ist eine Spalte in einer Ansicht. @hova - ja, das ist SQL Server 2005 Express.
  • P. S. Es gibt keine Indizes auf der PartEvent Ansicht-Spalten.
  • Ich denke, dass der Punkt über der hinzugefügten Bedingung ohne Null-Werte kann die Erklärung dafür sein. Was ist, wenn Sie ersetzen, dass die Bedingung mit EventType IS NOT NULL?
  • Erfassen Sie eine XML-query für jeden, und diese buchen. Dann können wir spezifische. technet.microsoft.com/en-us/library/ms190646.aspx
  • Überprüfung EventType IST NICHT NULL, nicht Beschleunigung der Abfrage.

InformationsquelleAutor Keith | 2009-08-06
Schreibe einen Kommentar