Überprüft eine WHERE-Abfrage einfachere Vergleiche (z. B. Bit), bevor schwierigere Vergleiche (z. B. Varchar) ausgeführt werden?

12

Wenn ich eine Abfrage schreibe, die eine zusammengesetzte WHEREKlausel enthält, zB:

SELECT *
FROM MyTable
WHERE BitField = 1
    AND VarcharField = 'asdf'

und die Einbeziehung dieses bitVergleichs schließt einfach die gleichen Felder aus, die der varcharVergleich ausschließt. Wird das Vorhandensein dieses bitFeldvergleichs zu einer Leistungsverbesserung führen?

andrewb
quelle

Antworten:

22

Es ist wichtig zu erkennen, dass SQL eine deklarative Sprache ist. Die SELECTAbfrage, die Sie geschrieben haben, gibt die logischen Ergebnisse an, die zurückgegeben werden sollen. Es ist Sache des Datenbankmoduls, insbesondere des Abfrageoptimierers, eine effiziente physikalische Strategie für die Rückgabe dieser Ergebnisse zu bestimmen.

Der endgültige physische Ausführungsplan hängt von den Argumentationsfähigkeiten des Optimierers, dem Zeitaufwand für das Problem, der Verfügbarkeit geeigneter Zugriffsmethoden (hauptsächlich Indizes und materialisierte Ansichten), repräsentativen Statistikinformationen und dem jeweiligen Codepfad ab Die Abfragespezifikation erfolgt über den Optimierungscode.

Wenn Ihr Datenbankdesign relational ist, Sie gute Zugriffsmethoden und genaue statistische Informationen bereitstellen und die Abfrage gut geschrieben ist, findet das Optimierungsprogramm normalerweise eine vernünftige physische Ausführungsstrategie, ohne dass Sie sich über die geschriebene Form von Gedanken machen müssen die Abfragespezifikation zu viel.

Es wird immer Fälle geben, in denen das Ausdrücken derselben logischen Anforderung unter Verwendung einer anderen (aber semantisch identischen) Syntax den physischen Ausführungsplan beeinflusst, dies sollte jedoch zweitrangig sein. Auch hier sollten Sie generell nur in Betracht ziehen, die Abfrage anders auszudrücken, wenn die Laufzeitmerkmale nicht akzeptabel sind, sobald alle oben genannten Grundlagen abgedeckt wurden.

Es ist äußerst selten, dass die schriftliche Reihenfolge der WHEREPrädikate für einfache Konjunktivklauseln (wie in der Frage) den physischen Ausführungsplan in messbarer Weise beeinflusst. Kurz gesagt, dies ist nichts, worüber Sie sich Sorgen machen sollten. Holen Sie sich das Datenbankdesign, die Indizes und statistischen Informationen gleich zu Beginn.

Zur Beantwortung der Frage direkt (schließlich!), Die zusätzliche redundante Bedingung Hinzufügen könnte die Leistung verbessern, aber nur , wenn sie ermöglicht die Verwendung eines effizienteren Zugriffsverfahrens - zum Beispiel , wenn es nur um einen Index auf (BITFIELD, VarcharField) ist. Wenn es bereits einen Index für (VarcharField) gäbe, würde nur Overhead hinzugefügt.

Nein, als Implementierungsdetail berücksichtigt SQL Server nicht die Kosten für Vergleiche in Abhängigkeit vom Datentyp oder der offensichtlichen Komplexität der Berechnungen. Tatsächlich sind die Kosten für skalare Operationen sehr gering , aber das führt zu einem ganz anderen Thema.

Verwandte Fragen:

Logische Operatoren ODER UND in Bedingung und Reihenfolge der Bedingungen in WHERE
SQL Server 2008 und konstante Ausdrücke
Bitweise Operatoren, die sich auf die Leistung auswirken
Merkwürdiges SQL-Anweisungsverhalten

Paul White 9
quelle
5

Binäre Partitionen (wie eine Bitspalte) klingen wie gute Kandidaten für gefilterte Indizes.

CREATE NONCLUSTERED INDEX MyTableWithBitFieldTrue
ON MyTable (VarcharField)
INCLUDE Id, <other columns you're selecting>
WHERE BitField = 1 ;
GO

Wenn Sie sich explizit mit Ihren Optimierungen befassen, ist Ihr Code robuster gegenüber Änderungen anderer Personen, sei es in Ihrer Codebasis oder in SQL Server.

Greg
quelle