Der Optimierer unterstützt eine besondere Optimierung zur Nutzung der IN-Prädikate in Spalten mit Index. Diese Optimierung betrifft auch mehrere Prädikate für ein und dieselbe Spalte mit Index, die über OR verbunden sind, da sie semantisch gleichwertig sind. Um die Optimierung zu aktivieren, darf die IN-Liste nur Konstanten oder Werte enthalten, die während der Ausführung eines Abfrageblocks konstant bleiben, wie z.B. äußere Referenzen.
Wenn der Optimierer ein qualifizierendes IN-Listen-Prädikat antrifft und das IN-Listen-Prädikat ausreichend selektiv ist, um einen Abruf mit Index in Betracht zu ziehen, konvertiert der Optimierer das IN-Listen-Prädikat in einen Nested-Loops-Join (Join mit verschachtelten Schleifen). Das folgende Beispiel zeigt die Funktionsweise der Optimierung.
Angenommen, Sie haben die folgende Abfrage, die alle Bestellungen zweier Vertriebsmitarbeiter auflistet:
SELECT * FROM SalesOrders WHERE SalesRepresentative = 902 OR SalesRepresentative = 195; |
Die Abfrage ist semantisch gleichwertig mit Folgendem:
SELECT * FROM SalesOrders WHERE SalesRepresentative IN (195, 902); |
Der Optimierer schätzt die kombinierte Selektivität der IN-Listen-Prädikate als niedrig genug ein, um einen Abruf über einen Index zu ermöglichen. Daher behandelt der Optimierer die IN-Liste als virtuelle Tabelle und verknüpft diese virtuelle Tabelle über das Attribut "SalesRepresentative" mit der Tabelle "SalesOrders". Das Nettoergebnis der Optimierung besteht zwar darin, dass ein zusätzlicher Join in den Zugriffsplan eingefügt wird, aber der Join-Grad der Abfrage wird nicht erhöht, sodass die Optimierungszeit wahrscheinlich nicht beeinflusst wird.
Diese Optimierung weist zwei Hauptvorteile auf. Erstens kann das IN-Listen-Prädikat als sargable (als Suchargument nutzbar) behandelt und für den Abruf über den Index genutzt werden. Zweitens kann der Optimierer die IN-Liste sortieren, damit sie mit der Sortierfolge des Indexes übereinstimmt, was einen effizienteren Abruf zur Folge hat.
Der Zugriffsplan (Kurzform) für die neu geschriebene Abfrage lautet:
SalesOrders<FK_SalesRepresentative_EmployeeID> |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |