Der SQL-Compiler schreibt Abfragen um, um vorhandene Vergleichselemente für eine bestimmte Abfrage in eine optimierte Form zu bringen. Die folgenden Beispiele zeigen einige der Vergleichselemente, die vom SQL-Compiler übersetzt werden können:
Während des Umschreibens können Vergleichselemente der Abfrage hinzugefügt werden, um dem Optimierungsprogramm die Möglichkeit zu geben, weitere Tabellenverknüpfungen bei der Auswahl des günstigsten Zugriffsplans für die Abfrage in Betracht zu ziehen.
Während des Umschreibens kann ein Vergleichselement OR in ein Vergleichselement IN übersetzt werden, um die Auswahl eines effektiveren Zugriffsplans zu ermöglichen. Der SQL-Compiler kann auch ein Vergleichselement IN in ein Vergleichselement OR übersetzen, wenn diese Transformation zur Auswahl eines günstigeren Zugriffsplans führen würde.
Die folgende Abfrage erstellt eine Liste der Manager, deren Abteilung an Abteilung "E01" berichten, und der Projekte, für die die Manager verantwortlich sind:
SELECT DEPT.DEPTNAME DEPT.MGRNO, EMP.LASTNAME, PROJ.PROJNAME FROM DEPARTMENT DEPT, EMPLOYEE EMP, PROJECT PROJ WHERE DEPT.ADMRDEPT = 'E01' AND DEPT.MGRNO = EMP.EMPNO AND EMP.EMPNO = PROJ.RESPEMP
Beim Umschreiben der Abfrage wird das folgende implizierte Vergleichselement hinzugefügt:
DEPT.MGRNO = PROJ.RESPEMP
Als Ergebnis dieses Umschreibens kann das Optimierungsprogramm weitere Verknüpfungen in die Berechnung mit einbeziehen, wenn es versucht, den günstigsten Zugriffsplan für die Abfrage auszuwählen.
Neben der oben gezeigten Ausnutzung der Transitivität werden durch das Umschreiben auch zusätzliche lokale Vergleichselemente aufgrund der durch Gleichheitsvergleichselemente implizierten Transitivität abgeleitet. Zum Beispiel stellt die folgende Abfrage eine Liste der Namen der Abteilungen (deren Abteilungsnummer größer als "E00" ist) und der Mitarbeiter, die in der entsprechenden Abteilung arbeiten, zusammen.
SELECT EMPNO, LASTNAME, FIRSTNAME, DEPTNO, DEPTNAME FROM EMPLOYEE EMP, DEPARTMENT DEPT WHERE EMP.WORKDEPT = DEPT.DEPTNO AND DEPT.DEPTNO > 'E00'
Dieser Abfrage wird in der Phase des Umschreibens das folgende implizierte Vergleichselement hinzugefügt:
EMP.WORKDEPT > 'E00'
Das Ergebnis dieses Umschreibens besteht darin, daß das Optimierungsprogramm die Anzahl der Zeilen, die verknüpft werden müssen, verringern kann.
Nehmen Sie an, eine Klausel OR verknüpft zwei oder mehr einfache Gleichheitsvergleichselemente für dieselbe Spalte, wie im folgenden Beispiel:
SELECT * FROM EMPLOYEE WHERE DEPTNO = 'D11' OR DEPTNO = 'D21' OR DEPTNO = 'E21'
Wenn es für die Spalte DEPTNO keinen Index gibt, erlaubt die Umwandlung der Klausel OR in das folgende Vergleichselement IN eine effektivere Verarbeitung der Abfrage:
SELECT * FROM EMPLOYEE WHERE DEPTNO IN ('D11', 'D21', 'E21')
Anmerkung: | In einigen Fällen wandelt der Datenbankmanager ein Prädikat IN in eine Gruppe von Klauseln OR um, so daß OR-Verknüpfungen für Indizes durchgeführt werden können. Weitere Informationen zu OR-Verknüpfungen von Indizes finden Sie in Zugriff über mehrere Indizes. |