Bei einem Auswertungsplan (engl.: query evaluation plan (QEP), kurz: query plan), auch Ausführungsplan genannt, handelt es sich um eine Beschreibung, in welchen Einzelschritten ein relationales Datenbankmanagementsystem eine Datenbankabfrage ausführt und in welcher Reihenfolge dies geschieht. Er wird vom Anfrageoptimierer des Datenbankmanagementsystems generiert, wenn eine Datenbankabfrage gestellt wird.

Anfragebearbeitung

Bearbeiten

Eine Datenbankabfrage wird mit einer Datenbanksprache wie SQL gestellt. Eine solche ist bei einem relationalen Datenbanksystem deklarativ, das heißt, es wird spezifiziert, was als Ergebnismenge generiert werden soll und nicht, wie der Zugriff auf die Daten im Einzelnen erfolgt. Die Abfrage ist also nicht von der physischen Speicherstruktur der Datenbank abhängig (Datenunabhängigkeit); den physischen Datenzugriff bewerkstelligt das Datenbankmanagementsystem (DBMS). Im Allgemeinen sind zu einer deklarativen Abfrage mehrere Möglichkeiten gegeben, wie der physische Datenzugriff erfolgen kann, von denen das DBMS eine auswählen muss. Verschiedene Strategien beim Datenzugriff unterscheiden sich im Allgemeinen in ihrer Effizienz. Die Komponente „Anfrageoptimierer“ des DBMS ist dafür verantwortlich, die effizienteste Möglichkeit zu identifizieren; sie generiert dafür mehrere mögliche Auswertungspläne – eine Beschreibung, in welchen Einzelschritten und in welcher Reihenfolge einzelne Operationen ausgeführt werden – und versucht, den effizientesten davon für die Ausführung der Abfrage auszuwählen. Der so ausgewählte Auswertungsplan kann anschließend kompiliert werden oder kann bei interaktiven Anfragen direkt mittels eines Interpreters ausgeführt werden.[1]

Da es dem Anfrageoptimierer im Allgemeinen nicht möglich ist, ohne großen Aufwand den effizientesten der möglichen Auswertungspläne zu identifizieren, arbeitet der Anfrageoptimierer mit Heuristiken bei der Auswahl eines Auswertungsplans. Softwareentwicklern und Datenbankadministratoren obliegt die Aufgabe, beim Auftreten von Performance-Problemen bei der Anfragebearbeitung den vom Anfrageoptimierer gewählten Auswertungsplan zu interpretieren und seine Effizienz zu beurteilen, denn oftmals entscheidet sich der Anfrageoptimierer nicht für die effizienteste Möglichkeit der Anfragebearbeitung oder der Auswertungsplan offenbart das Fehlen von geeigneten Zugriffsstrukturen, deren sich das DBMS beim Datenzugriff bedienen kann. Der Softwareentwickler bzw. der Datenbankadministrator kann dann ggf. dem Anfrageoptimierer neben der zu bearbeitenden Abfrage weitere Informationen liefern, welche die Generierung eines Auswertungsplans beeinflusst, er kann die Abfrage anders formulieren oder die Datenbank um weitere Zugriffsstrukturen, zum Beispiel um einen Datenbankindex, ergänzen.

Beispiel

Bearbeiten

Sei KUNDEN eine Datenbanktabelle mit der Spalte (Attribut) KUNDENNUMMER, welche als Primärschlüssel fungiert und mittels eines Indexes (KUNDEN_PK) referenziert wird, sowie der Spalte ANZAHL_KAEUFE. Nun werde folgende Anfrage gestellt:

select ANZAHL_KAEUFE 1
from   KUNDEN
where  KUNDENNUMMER = 4

Auf Grundlage dessen könnte der Anfrageoptimierer eines DBMS folgenden Auswertungsplan generieren[2]:

---------------------------------------------------------------------------------
| Id | Operation        | Options        | Object    | Rows | Access Predicates |
---------------------------------------------------------------------------------
| 0  | SELECT STATEMENT |                |           | 1    |                   |
| 1  |   TABLE ACCESS   | BY INDEX ROWID | KUNDEN    | 1    |                   |
| 2  |     INDEX        | UNIQUE SCAN    | KUNDEN_PK | 1    | KUNDENNUMMER = 4  |
---------------------------------------------------------------------------------

Bei diesem Auswertungsplan lässt sich zum Beispiel folgendes ablesen:

  • Die Generierung des Ergebnisses der Abfrage geht durch das Ausführen von drei verschiedenen Operationen (Spalte „Operation“) vonstatten; die Einrückung einer Operation bedeutet, dass diese Operation eine Kindoperation der darüberstehenden Operation ist und dass das Ergebnis dieser Operation der Input für seine Vateroperation ist. Die Operationen im Einzelnen sind:
  • Zuerst wird die Operation mit der Id=2 ausgeführt; diese greift auf den Index KUNDEN_PK zu und liefert die Adresse des gesuchten Datensatzes (die so genannte ROWID) an die Vateroperation mit der Id=1. Bei dieser Operation wird das Prädikat KUNDENNUMMER=4 der Anfrage ausgewertet (Spalte „Access Predicates“)
  • Danach wird die Operation mit der Id=1 ausgeführt. Dabei wird mithilfe der ROWID direkt auf den gesuchten Datensatz der Tabelle KUNDEN zugegriffen; dieser wird nun an die Operation mit der Id=0 geliefert
  • Schließlich greift die Operation mit der Id=0 den Wert der Spalte ANZAHL_KAEUFE aus dem Input-Datensatz ab und bildet die Summe des Werts der Spalte ANZAHL_KAEUFE und der Zahl 1. Die Summe wird als Ergebnis an den Aufrufer der obigen Abfrage zurückgeliefert.
  • Die geschätzte Anzahl an Zeilen, die von der jeweiligen Operation generiert wird, ist jeweils 1 (Spalte „Rows“). Der Anfrageoptimierer sammelt im produktiven Betrieb statistische Informationen, mithilfe derer sich Schätzungen zur Größe von (Zwischen-)Ergebnissen vornehmen lassen.

Ein Auswertungsplan kann noch mehr Informationen als beim obigen Beispiel beinhalten, mit denen sich die Effizienz des Auswertungsplans detailliert analysieren lässt. Es existieren auch Programme, die einen solchen Auswertungsplan statt in einer textuellen in einer grafischen Darstellung generieren können.

Siehe auch

Bearbeiten

Anmerkungen und Einzelnachweise

Bearbeiten
  1. Alfons Kemper, André Eickler: Datenbanksysteme. Oldenbourg Verlag 2004, ISBN 3-486-25706-4, Seite 229
  2. Der vorliegende Teil eines Auswertungsplans wurde vom DBMS der XE-Edition einer Oracle-Datenbank, Version 10.2.0.1.0, erzeugt