select value
from persons p join persons2 p2
on left(p.lastname,1) = left(p2.lastname,1)
SQL Server. Gibt es eine Möglichkeit, dieses SARGable / Run schneller zu machen? Ich kann keine Spalten für die Personentabelle erstellen, aber ich kann Spalten für Personen2 erstellen.
sql-server
lastchancexi
quelle
quelle
Antworten:
Erstellen Sie eine Ansicht der Tabellen mit einer persistierten berechneten Spalte, die als die
LEFT(lastname, 1)
jeder Tabelle definiert ist, und vergleichen Sie dann die berechneten persistierten Spaltenwerte.Hier ist ein Prüfstand, der zeigt, wie das geht:
Hier fügen wir einige Beispieldaten ein:
Hier ist die
SELECT
Abfrage:Und die Ergebnisse:
Der Ausführungsplan mit nur zwei Zeilen pro Tabelle (zugegebenermaßen nicht viele Zeilen!)
quelle
Wenn die
lastname
Spalte in mindestens einer der Tabellen indiziert ist, können Sie sie auch verwendenLIKE
Der Plan hierfür kann eine Suche in der Tabelle enthalten, die links davon angegeben ist.
dh
ON p.lastname LIKE LEFT(p2.lastname, 1) + '%'
wäre nicht in der Lage, den oben verwendeten Index zupersons2
verwenden, könnte aber einen suchenpersons
.Der Vorschlag in der anderen Antwort, eine berechnete Spalte auf beiden Seiten zu indizieren, ist jedoch flexibler. Bei einem Plan für verschachtelte Schleifen kann sich jede Tabelle auf der Innenseite befinden, und es können auch viele bis viele Zusammenführungsverbindungen erstellt werden, ohne dass eine Sortierung erforderlich ist.
quelle
Ich habe zufällig eine Tabelle mit 3.423 Zeilen und 195 verschiedenen Werten in
Name
. Ich werde diese TabelleP
(Person) aufrufen und sie duplizieren, um sieP2
(Person2) zu erstellen . In einer Ganzzahl-ID-Spalte befindet sich ein eindeutiger, gruppierter Primärschlüssel. Ich verwende Microsoft SQL Server 2016 (KB3194716) Developer Edition (64-Bit) unter Windows 10 Pro 6.3 mit 32 GB RAM.Mit der Basisabfrage
Ich erhalte 1,5 Millionen Zeilen in 3200-3300 ms (aus Statistik io).
Durch Umschreiben also -
verstrichen reduziert sich auf 50-60ms und der Plan ist:
Aufgrund des Übereinstimmungsalgorithmus werden weniger Zeilen zurückgegeben (3.423). Die gleiche Plan- und Zeilenanzahl wird erreicht, indem die Basisabfrage in geändert wird
select distinct
.Durch Erstellen einer indizierten, berechneten Spalte
Die verstrichene Zeit sinkt auf 45-50 ms.
quelle