Verlagerung der Suche auf den
FETCH-Zeitpunkt
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)