DB2 Universal Database - Systemverwaltung


Mischen von Operationen

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:

Beispiel - Mischen von Sichten

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.

Beispiel - Umsetzungen von Unterabfragen in 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.

Beispiel - Eliminierung überflüssiger Verknüpfungen

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:

Beispiel - Gemeinsam benutzte Spaltenberechnung

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.


[ Seitenanfang | Vorherige Seite | Nächste Seite | Inhaltsverzeichnis | Index ]