Frage

Ich versuche, einige schrecklich komplizierte SQL -Abfragen zu optimieren, weil es zu lange dauert, bis es fertig ist.

In meinen Abfragen habe ich dynamisch SQL -Anweisungen mit vielen der gleichen Funktionen erstellt, daher habe ich eine temporäre Tabelle erstellt, in der jede Funktion nur einmal anstelle von vielen, viele Male aufgerufen wird - dies verkürzte meine Ausführungszeit um 3/4.

Meine Frage ist also, kann ich erwarten, einen großen Unterschied zu sehen, wenn beispielsweise 1.000 datierte Berechnungen auf 100 eingeschränkt werden?

Bearbeiten: Die Abfrage sieht folgendermaßen aus:

SELECT DISTINCT M.MID, M.RE FROM #TEMP INNER JOIN M ON #TEMP.MID=M.MID 
WHERE ( #TEMP.Property1=1 ) AND 
DATEDIFF( year, M.DOB, @date2 ) >= 15  AND  DATEDIFF( year, M.DOB, @date2 ) <= 17 

Wo diese dynamisch als Zeichenfolgen erzeugt werden (zusammengestellt in Bits und Stücke) und dann ausgeführt werden, damit verschiedene Parameter entlang jeder Iteration geändert werden können - hauptsächlich die letzten Zeilen, die alle möglichen datierten Abfragen enthalten.

Es gibt ungefähr 420 Abfragen wie diese, bei denen diese veralteten datierten wie dies berechnet werden. Ich weiß, dass ich sie alle leicht in einen Temperaturtisch ziehen kann (1.000 datierte 50 werden 50) - aber lohnt es sich, wird es einen Unterschied in Sekunden machen? Ich hoffe auf eine Verbesserung besser als in den Zehntel von Sekunden.

War es hilfreich?

Lösung

Es hängt genau davon ab, was Sie tun, um ehrlich zu sein, was den Leistungsverlust betrifft.

Wenn Sie beispielsweise datierte (oder tatsächlich eine andere Funktion) innerhalb einer WO -Klausel verwenden, ist dies eine Ursache für eine schlechtere Leistung, da ein Index für diese Spalte verwendet wird.

ZB grundlegendes Beispiel, alle Aufzeichnungen im Jahr 2009 finden

WHERE DATEDIFF(yyyy, DateColumn, '2009-01-01') = 0

Würde einen Index im DATECOLUMN nicht gut nutzen. Eine bessere Lösung, die einen optimalen Indexverbrauch bereitstellt, wäre:

WHERE DateColumn >= '2009-01-01' AND DateColumn < '2010-01-01'

ich Kürzlich gebloggt Über den Unterschied, den dies ausmacht (mit Leistungsstatistiken/Ausführungsplan -Vergleiche), wenn Sie interessiert sind.

Das wäre teurer als beispielsweise bei der Rückgabe von Datediff als Spalte im Ergebnis.

Ich würde zunächst die einzelnen Abfragen identifizieren, die die meiste Zeit in Anspruch nehmen. Überprüfen Sie die Ausführungspläne, um zu sehen, wo das Problem liegt, und stimmen Sie von dort aus.

Bearbeiten:Basierend auf der von Ihnen angegebenen Beispielabfrage können Sie versuchen, die Verwendung von datediff in der Where -Klausel zu entfernen. Grundes Beispiel, um alle zu finden, die 10 Jahre alt waren, an einem bestimmten Datum - ich denken Die Mathematik hat Recht, aber Sie haben trotzdem die Idee! Gab es einen kurzen Test und scheint in Ordnung zu sein. Sollte einfach genug sein, sich an Ihr Szenario anzupassen. Wenn Sie Menschen zwischen (z. B. 15 und 17 Jahren zu einem bestimmten Datum zwischen (z. B.) finden möchten, ist dies auch bei diesem Ansatz möglich.

-- Assuming @Date2 is set to the date at which you want to calculate someone's age 
DECLARE @AgeAtDate INTEGER
SET @AgeAtDate = 10  

DECLARE @BornFrom DATETIME
DECLARE @BornUntil DATETIME
SELECT @BornFrom = DATEADD(yyyy, -(@AgeAtDate + 1), @Date2)
SELECT @BornUntil = DATEADD(yyyy, -@AgeAtDate , @Date2)

SELECT DOB
FROM YourTable
WHERE DOB > @BornFrom AND DOB <= @BornUntil

Ein wichtiger Hinweis, der hinzugefügt werden muss, ist für Alterskakulate aus DOB, dieser Ansatz ist genauer. Ihre aktuelle Implementierung berücksichtigt nur das Geburtsjahr, nicht den tatsächlichen Tag (z. B. würde jemand, der am 1. Dezember 2009 geboren wurde, als 1 Jahr alt am 1. Januar 2010, wenn sie erst 1. Dezember 2010 sind).

Hoffe das hilft.

Andere Tipps

Datediff ist im Vergleich zu anderen Methoden zur Behandlung von DateTime -Werten wie Zeichenfolgen sehr effizient. (Sehen Sie diese Antwort auf).

In diesem Fall hört sich es so an, als würden Sie immer wieder die gleichen Daten haben, was wahrscheinlich teurer ist als die Verwendung einer Temp -Tabelle. Beispielsweise werden Statistiken generiert.

Eine Sache, die Sie möglicherweise tun können, um die Leistung zu verbessern, könnte darin bestehen, einen Index auf die Temperaturtabelle aufzunehmen.

Überprüfen Sie Ihren Ausführungsplan, um festzustellen, ob er hilft (kann von der Anzahl der Zeilen in der TEMP -Tabelle abhängen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top