Ich wurde beauftragt, die Leistung einer SQL Server 2008 R2-Abfrage (innerhalb einer gespeicherten Prozedur) zu verbessern, die im folgenden Link zum Ausführungsplan für Abfragen angezeigt wird.
Es wird derzeit in ca. 7 Sekunden ausgeführt und muss nach Möglichkeit in 1-2 Sekunden abgeschlossen werden. Jede Ausführung der langsamen Abfrage dauert immer etwa 7 Sekunden. Die Ergebnisse der Abfrage fließen durch. Die abgefragten Tabellen sind groß, aber nicht Milliarden von Zeilen.
Zeilenanzahl
Abhängig von den übergebenen Parametern können die Ergebnisse entweder einige hundert Zeilen (die in Sekundenschnelle ausgeführt werden) bis> 300 KB Zeilen (dies ist langsam) sein.
Ich habe den Ausführungsplan für langsame Abfragen und die Indizes aufgenommen, die vom Optimierer verwendet werden. Dies ist der Plan für die schnellere Ausführung und STATISTICS IO, TIME
:
Es werden zwei Abfragen ausgeführt. Der erste ist nicht das Problem. Es ist das zweite, bei dem ich Hilfe brauche. Obwohl dies erforderlich ist, wirkt sich das Entfernen des nicht SARGable-Prädikats ( AND FT.TripDistance < ( CONVERT(NUMERIC(10,0),FT.TripTime) * 83.33 )
) geringfügig auf die Geschwindigkeit aus
Entfernen die Funktion [FN_GetLocalTime_FromUTC_BasedOnTZId] macht geringfügigen Unterschied zu der Geschwindigkeit, ist hier die STATISTICS IO TIME
beide nicht SARG entfernen where - Klausel und Funktion: Hier sind die Planausführung
Hier ist die Ausgabe für die unveränderte Abfrage, außer dass ein LOOP JOIN
Hinweis hinzugefügt wird . Das ist langsamer.
Ich habe festgestellt, dass im langsamen, unveränderten Abfrageplan die tatsächliche Anzahl der Zeilen (300330) für die Indexsuche in der FACT_trip_Statuses
Tabelle nahe an der endgültigen Ausgabe (299887) liegt. Jedoch sucht die tatsächliche Anzahl der Zeilen (4.87m) auf den Index für die xFactTrip_Annex
, FACT_Trip
und FACT_Trip_Attributes
ist Ausweg. Wie behebe ich das? Hinzufügen OPTION RECOMPILE
macht wenig Unterschied
Ich habe versucht, das Trace-Flag 4199 DBCC TRACEON (4199, -1);
hinzuzufügen und es mit und ohne JOIN
Hinweise erneut zu versuchen , hat nicht geholfen.
HASH Join Hinweis und TF 4199
LOOP Join Hinweis und TF 4199
Keine Join-Hinweise und TF 4199
Indizes
CREATE NONCLUSTERED INDEX IDX_FACT_Trip_StartDateUTC_VehicleKey_Includes ON dbo.FACT_Trip
(
StartDateUTC ASC,
VehicleKey ASC,
EndDateUTC ASC
)
INCLUDE ( DriverKey,
DrivingTime,
TripDistance,
TripTime)
CREATE NONCLUSTERED INDEX IX_xFactTrip_Annex_StartDateUTC_MonthlyProcessing ON dbo.xFactTrip_Annex
(
StartDateUTC ASC
)
INCLUDE ( VehicleKey,
Spd20Count, Spd20Distance,
Spd30Count, Spd30Distance,
Spd40Count, Spd40Distance,
Spd50Count, Spd50Distance,
Spd60Count, Spd60Distance,
Spd70Count, Spd70Distance,
SpdCat1,SpdCat2,SpdCat3,
TotalIdling,
PTOTime,
TripFuel)
CREATE NONCLUSTERED INDEX IX_FACT_Trip_Attributes_StartDateUTC_VehicleKey_Includes ON dbo.FACT_Trip_Attributes
(
StartDateUTC ASC,
VehicleKey ASC,
EndDateUTC ASC
)
INCLUDE ( Attribute0Distance,
Attribute1Distance,
Attribute2Distance,
Attribute3Distance,
Attribute4Distance,
Attribute5Distance,
Attribute6Distance,
Attribute7Distance,
Attribute8Distance,
Attribute9Distance,
Attribute10Distance)
CREATE NONCLUSTERED INDEX IDX_FACT_Trip_Statuses_StartDateUTC_VehicleKey_Includes ON dbo.FACT_Trip_Statuses
(
VehicleKey ASC,
StartDateUTC ASC,
EndDateUTC ASC
)
INCLUDE ( HarshAccelerationCount,
HarshBrakeCount,
HarshBumpCount,
HarshCorneringCount,
ExcessIdleDuration,
ExcessIdleCount,
OverspeedCount)
CREATE NONCLUSTERED INDEX IX_StartDateUTC_VehicleKey_IsBP ON dbo.FACT_TripComments
(
StartDateUTC ASC
)
INCLUDE ( VehicleKey, IsBusinessPrivate)
FN_GetLocalTime_FromUTC_BasedOnTZId
Funktion dort ist, wo der Großteil der Zeit vergeht. Es sieht auch so aus, als würden die Werte dieser Funktion nur in derSELECT
Liste verwendet. Könnten Sie diese Funktion posten? Außerdem: Könnten Sie diese Datumstransformation nicht in der Funktion selbst ausführen, sondern direkt in derSELECT
Liste selbst ausführen (die Veröffentlichung der Funktion kann diese Frage beantworten)?Antworten:
Wahrscheinlich kann Ihnen ein Clustered-Index über der temporären Tabelle #xMobiles beim letzten Join helfen
Die beste Option ist, den Index nach dem Auffüllen der Tabelle zu erstellen.
quelle
Diese Abfrage weist immer noch Fehler auf und ich kann sie nicht mit Ihren Daten testen. Würde dies jedoch zu denselben Ergebnissen führen und etwas schneller ausgeführt werden?
quelle