Nun, vielleicht bin ich zu alt und möchte Folgendes verstehen.
Abfrage 1.
%Vor%Abfrage 2.
%Vor%die erste Abfrage ist einfacher, aber aus irgendeinem Grund im Profiler, wenn ich beide zur gleichen Zeit ausführen, sagt es, dass Abfrage 2 verwendet 39% der Zeit und Abfrage 1, 61%.
Ich würde gerne den Grund verstehen, vielleicht muss ich alle meine Fragen neu schreiben.
Ihre Abfrage 2 ist eigentlich ein netter Trick. Es funktioniert so: Sie haben einen Index über Geschlecht. Das DBMS kann diesen Index zweimal suchen, um zwei Zeilenbereiche zu erhalten (einen für M und einen für F). Es muss nichts aus diesen Zeilen lesen, nur dass sie existieren. Es kann die Anzahl der Zeilen in den beiden Bereichen zählen.
In der ersten Abfrage muss das DBMS die Zeilen dekodieren, um das Geschlecht zu lesen, dann muss es entweder die Zeilen sortieren oder eine Hashtabelle erstellen, um sie zu aggregieren. Das ist teurer als nur Zeilen zählen.
Bist du sicher? Vielleicht verwendet die zweite Abfrage nur die zwischengespeicherten Ressourcen von der ersten an.
Führen Sie sie in zwei separaten Batches aus, und führen Sie vor jedem% ce_de% aus, um den Cache zu bereinigen. Vergleichen Sie dann die Werte jedes Ausführungsplans.
Die Optimierung einer Abfrage hängt von der Datenbank ab. Was Sie sehen, ist datenbankspezifisch.
Die Union, wie geschrieben, würde naiv zwei Durchläufe durch die Daten erfordern, einen Filter und eine Zählung machen. Grundsätzlich ist kein anderer Speicher notwendig.
Die Aggregation könnte die Daten sortieren und dann zählen. Oder es könnte eine Hash-Tabelle generieren. Angesichts der Leistungsdifferenz würde ich vermuten, dass eine Sorte verwendet wird. Dies ist offensichtlich ein Overkill für diese Art von Abfrage.
Wenn Sie einen Index für das Geschlecht haben, würden beide Methoden den Index im Wesentlichen scannen, damit die Leistung ähnlich sein könnte (die Union-Version könnte es zweimal scannen =.
Bietet die von Ihnen verwendete Datenbank eine Möglichkeit zur Berechnung von Tabellenstatistiken? Wenn ja, sollten Sie die Statistiken aktualisieren und sehen, ob Sie immer noch die gleichen Ergebnisse erhalten.
Können Sie auch die Ergebnisse von "explain" oder den Ausführungsplan posten? Das würde genau erklären, warum man schneller ist als der andere.
Ich habe eine äquivalente Abfrage versucht, aber das gegenteilige Ergebnis gefunden. die Gewerkschaft nahm 65% und die "Gruppe durch" 35%. (Verwenden von SQL Server 2008). Ich habe keinen Index für Geschlecht, daher zeigt mein Ausführungsplan einen Clustered-Index-Scan. Wenn Sie den Ausführungsplan nicht im Detail untersuchen, ist es wirklich nicht möglich, dieses Ergebnis zu erklären.
Das Hinzufügen eines Indexes für diese Abfrage ist wahrscheinlich keine gute Idee, da Sie diese Abfrage wahrscheinlich nicht so oft ausführen werden, wie Sie Datensätze in die Kundentabelle einfügen. In einigen anderen Datenbank-Engines mit Bitmap-Indizes (Oracle, PostgreSQL) kann das Datenbankmodul mehrere Indizes kombinieren, sodass sich der Nutzen von Indizes mit einer einzelnen Spalte ändern kann. In SQL Server müssen Sie die Indizes jedoch so entwerfen, dass sie die häufig verwendeten Abfragen abdecken.
Tags und Links sql