Der SQL-Compiler schreibt Abfragen um, um Abfrageoperationen so zu mischen, daß nach Möglichkeit die Abfrage die geringste Anzahl von Operationen, insbesondere SELECT-Operationen, enthält. Die folgenden Beispiele zeigen einige der Operationen, die vom SQL-Compiler gemischt werden können:
Die Verwendung von Sichten in einer Anweisung SELECT kann zu Einschränkungen in der Verknüpfungsfolge der Tabelle führen und außerdem überflüssige Verknüpfungen von Tabellen nach sich ziehen. Durch das Mischen der Sichten während des Umschreibens können diese Einschränkungen aufgehoben werden.
Wenn das Optimierungsprogramm eine Unterabfrage in einer SELECT-Anweisung findet, kann seine Auswahl der Verarbeitungsreihenfolge der Tabellen eingeschränkt werden.
Während des Umschreibens der Abfrage können überflüssige Verknüpfungen entfernt werden, um die Anweisung SELECT, die optimiert wird, noch weiter zu vereinfachen.
Bei Verwendung verschiedener Funktionen kann durch Umschreiben der Abfrage die Zahl der erforderlichen Berechnungen reduziert werden.
Nehmen Sie zum Beispiel an, Sie haben Zugriff auf die beiden folgenden Sichten der Tabelle EMPLOYEE, von denen die eine die Mitarbeiter mit einer hohen Ausbildungsstufe (EDLEVEL) und die andere die Mitarbeiter mit einem Gehalt (SALARY) über 35.000 Dollar zeigt:
CREATE VIEW EMP_EDUCATION (EMPNO, FIRSTNME, LASTNAME, EDLEVEL) AS SELECT EMPNO, FIRSTNME, LASTNAME, EDLEVEL FROM EMPLOYEE WHERE EDLEVEL > 17 CREATE VIEW EMP_SALARIES (EMPNO, FIRSTNAME, LASTNAME, SALARY) AS SELECT EMPNO, FIRSTNME, LASTNAME, SALARY FROM EMPLOYEE WHERE SALARY > 35000
Jetzt wird beispielsweise die folgende Abfrage ausgeführt, um die Mitarbeiter, die eine hohe Ausbildungsstufe haben und deren Gehalt über 35.000 Dollar liegt, aufzulisten:
SELECT E1.EMPNO, E1.FIRSTNME, E1.LASTNAME, E1.EDLEVEL, E2.SALARY FROM EMP_EDUCATION E1, EMP_SALARIES E2 WHERE E1.EMPNO = E2.EMPNO
Während der Phase des Umschreibens könnten diese beiden Sichten gemischt werden, um folgende Abfrage zu erstellen:
SELECT E1.EMPNO, E1.FIRSTNME, E1.LASTNAME, E1.EDLEVEL, E2.SALARY FROM EMPLOYEE E1, EMPLOYEE E2 WHERE E1.EMPNO = E2.EMPNO AND E1.EDLEVEL > 17 AND E2.SALARY > 35000
Durch das Mischen der Anweisungen SELECT der beiden Sichten mit der vom Benutzer geschriebenen Anweisung SELECT kann das Optimierungsprogramm mehr Möglichkeiten bei der Auswahl des Zugriffsplans in Betracht ziehen. Darüber hinaus kann die Abfrage noch weiter umgeschrieben werden, wenn die beiden gemischten Sichten dieselbe Basistabelle verwenden. Eine Beschreibung dieses weiteren Umschreibens finden Sie in Beispiel - Eliminierung überflüssiger Verknüpfungen.
Nehmen Sie an, eine Abfrage enthält die folgende Unterabfrage:
SELECT EMPNO, FIRSTNME, LASTNAME, PHONENO FROM EMPLOYEE WHERE WORKDEPT IN (SELECT DEPTNO FROM DEPARTMENT WHERE DEPTNAME = 'OPERATIONS')
Diese Unterabfrage wird vom SQL-Compiler in eine Verknüpfungsabfrage der folgenden Form umgewandelt:
SELECT DISTINCT EMPNO, FIRSTNME, LASTNAME, PHONENO FROM EMPLOYEE EMP, DEPARTMENT DEPT WHERE EMP.WORKDEPT = DEPT.DEPTNO AND DEPT.DEPTNAME = 'OPERATIONS'
Im allgemeinen ist eine Verknüpfung in der Ausführung wesentlich effektiver als eine Unterabfrage.
Manche geschriebenen oder generierten Abfragen enthalten unnötige Verknüpfungen. Abfragen wie die folgende könnten auch während des Umschreibens einer Abfrage, wie in Beispiel - Mischen von Sichten beschrieben, generiert werden.
SELECT E1.EMPNO, E1.FIRSTNME, E1.LASTNAME, E1.EDLEVEL, E2.SALARY FROM EMPLOYEE E1, EMPLOYEE E2 WHERE E1.EMPNO = E2.EMPNO AND E1.EDLEVEL > 17 AND E2.SALARY > 35000
In dieser Abfrage kann der SQL-Compiler die Verknüpfung eliminieren und die Abfrage auf folgende Form vereinfachen:
SELECT EMPNO, FIRSTNME, LASTNAME, EDLEVEL, SALARY FROM EMPLOYEE WHERE EDLEVEL > 17 AND SALARY > 35000
Im folgenden Beispiel wird davon ausgegangen, daß für die Kostenstelle (WORKDEPT/DEPNO) der Beispieltabellen EMPLOYEE und DEPARTMENT eine referentielle Integritätsbedingung vorhanden ist. Zuerst wird eine Sicht erstellt.
CREATE VIEW PEPLVIEW AS SELECT FIRSTNME, LASTNAME, SALARY, DEPTNO, DEPTNAME, MGRNO FROM EMPLOYEE E DEPARTMENT D WHERE E.WORKDEPT = D.DEPTNO
Eine Abfrage wie die folgende:
SELECT LASTNAME, SALARY FROM PEPLVIEW
wird dann geändert in:
SELECT LASTNAME, SALARY FROM EMPLOYEE WHERE WORKDEPT NOT NULL
Beachten Sie bei dieser Situation, daß der Benutzer die Abfrage eventuell nicht umschreiben kann, weil er keinen Zugriff auf die zugrundeliegenden Tabellen hat. Er hat eventuell nur Zugriff auf die Sicht (siehe oben). Daher muß diese Art von Optimierung im Datenbankmanager ausgeführt werden.
Redundanz in Verknüpfungen mit referentieller Integrität ist in folgenden Fällen wahrscheinlich:
Es gibt zum Beispiel automatische Tools in Abfrage-Managern, die das Schreiben optimierter Abfragen durch Benutzer verhindern.
Bei Verwendung mehrerer Funktionen in einer Abfrage können zahlreiche Berechnungen entstehen, die zeitintensiv sind. Durch Reduzieren der für die Abfrage erforderlichen Anzahl von Berechnungen kann der Zugriffsplan verbessert werden. Eine Abfrage, die mehrere Funktionen verwendet, wie z. B.:
SELECT SUM(SALARY+BONUS+COMM) AS OSUM, AVG(SALARY+BONUS+COMM) AS OAVG, COUNT(*) AS OCOUNT FROM EMPLOYEE;
wird vom SQL-Compiler wie folgt umgewandelt:
SELECT OSUM, OSUM/OCOUNT OCOUNT FROM (SELECT SUM(SALARY+BONUS+COMM) AS OSUM, COUNT(*) AS OCOUNT FROM EMPLOYEE) AS SHARED_AGG;
Durch dieses Umschreiben benötigt die Abfrage statt 2 Summen und 2 Zählern nur noch 1 Summe und 1 Zähler.