Der SQL-Optimierer versucht, nur dann Ergebnistabellen zu bilden, wenn es unbedingt notwendig ist.
Wenn keine Ergebnistabelle aufgebaut werden muss, kann die Suche auf den FETCH-Zeitpunkt verlagert werden. Dadurch wird kein Speicher für Ergebnisse belegt, und auf die ersten Ergebnisse kann schnell zugegriffen werden.
Die Suche kann jedoch nicht immer auf den FETCH-Zeitpunkt verlagert werden, da in einigen Fällen immer eine Ergebnistabelle aufgebaut werden muss:
● SELECT auf mehrere Tabellen (Join)
● SELECT ... FOR REUSE
In den folgenden Fällen muss meistens eine Ergebnistabelle aufgebaut werden:
● SELECT DISTINCT ...
● SELECT ... ORDER BY ...
Wenn alle folgenden Bedingungen zutreffen, muss keine Ergebnistabelle aufgebaut werden:
● Weder eine DISTINCT-Spezifikation (bis auf einige Ausnahmen) noch das Syntaxelement FOR REUSE sind angegeben.
● Die Spalten, nach denen sortiert werden soll, bilden zusammen in der angegebenen Reihenfolge und Sortierung (aufsteigend oder absteigend) einen Index.
Die bei den Erläuterungen zum SQL-Optimierer verwendeten Beispiele stützen sich auf die Demo-Datenbank DEMODB und ihre Demo-Daten im Schema HOTEL.
Konzepte des Datenbanksystems, Objekte im Schema HOTEL
Mit Hilfe der EXPLAIN-Anweisung können Sie herausfinden, ob eine Ergebnistabelle erstellt wird (Eintrag in Spalte STRATEGY: RESULT IS COPIED) oder nicht (Eintrag in Spalte STRATEGY: RESULT IS NOT COPIED).
SELECT zip, name FROM hotel.city
WHERE ROWNO < 5
ORDER BY name, zip DESC
Qualifikation: ROWNO < 5
ORDER BY name, zip DESC
Primärschlüssel der Tabelle CITY: zip
Indizes über qualifizierte Spalten: keine
genutzte Suchstrategie: TABLE
SCAN
Ergebnis der EXPLAIN-Anweisung
TABLENAME |
COLMUN_OR_INDEX |
STRATEGY |
PAGECOUNT |
CITY |
|
TABLE SCAN |
11 |
|
|
RESULT IS COPIED |
|
Es wird eine Ergebnistabelle erstellt (RESULT IS COPIED).
Weitere einfache Beispiel-SQL-Anweisungen
finden Sie im SQL-Tutorial.
Siehe auch:
Suchstrategien für Joins
SQL-Referenzhandbuch, FETCH-Anweisung (fetch_statement), DISTINCT-Spezifikation (distinct_spec), SELECT-Anweisung (select_statement)