2008-09-16 9 views
3

Warum verbessert die Verwendung von temporären Tabellen mit einer SELECT-Anweisung die Anzahl der logischen E/A? Würde es die Anzahl der Treffer in einer Datenbank nicht erhöhen, anstatt sie zu verringern? Liegt das daran, dass das "Problem" in Abschnitte unterteilt ist? Ich würde gerne wissen, was hinter den Kulissen vor sich geht.Temp-Tabellen und SQL SELECT-Leistung

+0

Welche DBMS? Von welcher SQL sprichst du? –

Antwort

2

Es gibt keine allgemeine Antwort. Es hängt davon ab, wie die temporäre Tabelle verwendet wird.

Die temporäre Tabelle kann E/A reduzieren, indem die nach einem komplexen Filter/Join erstellten Zeilen, die später mehrmals im Stapel verwendet werden, zwischengespeichert werden. Auf diese Weise kann die DB vermeiden, mehrfach auf die Basistabellen zu treffen, wenn nur eine Teilmenge der Datensätze benötigt wird.

Die temporäre Tabelle kann IO erhöhen, indem Datensätze gespeichert werden, die später in der Abfrage nicht mehr verwendet werden, oder indem viel Speicherplatz im Cache der Engine belegt wird, der von anderen Daten besser genutzt werden könnte.

Das Erstellen einer temporären Tabelle, um alle Inhalte einmal zu verwenden, ist langsamer als die Abfrage von temp in der Hauptabfrage, da der Abfrageoptimierer die temporäre Tabelle nicht sehen kann und eine (wahrscheinlich) unnötige spool der Daten erzwingt anstatt es aus den Quellentabellen streamen zu lassen.

+0

Erwähnenswert ist, dass normalerweise eine temporäre Tabelle nur dann als Typ MEMORY erstellt wird, wenn Ihr RAM oder Ihre Konfiguration es nicht zulassen, dass eine solche MEMORY-Tabelle die Platte verwendet, was die temporären Tabellen erheblich verlangsamt. – Rufinus

0

AFAIK, zumindest mit mysql, tmp Tabellen werden im RAM gehalten, SELECTs viel schneller als alles, was zu machen, die den HD treffen

0

Es gibt eine Klasse von Problemen, bei denen das Ergebnis in einer Sammlung Struktur bauen auf der Datenbankseite ist viel vorzuziehen, die Teile des Ergebnisses an den Kunden zurückzugeben, Roundtripping für jedes Teil.

Zum Beispiel: beliebiger Tiefe rekursiven Beziehungen (Chef)

Es gibt eine andere Klasse von Abfrage Probleme, bei denen die Daten in einer Art und Weise nicht und werden nicht ist indiziert werden, die effizient die Abfrage ausführen macht. Durch Ziehen von Ergebnissen in eine Sammlungsstruktur, die individuell indiziert werden kann, wird die logische E/A für diese Abfragen reduziert.

1

Ich gehe davon aus, durch temporäre Tabellen meinst du eine Unterauswahl in einer WHERE-Klausel. (Dies wird als Semijoin-Operation bezeichnet und Sie können dies normalerweise im Textausführungsplan für Ihre Abfrage sehen.)

Wenn der Abfrageoptimierer auf eine Unterauswahl/temporäre Tabelle trifft, werden einige Annahmen darüber getroffen, was zu tun ist mit diesen Daten. Im Wesentlichen erstellt das Optimierungsprogramm einen Ausführungsplan, der einen Join für die Ergebnismenge der Unterauswahl ausführt, wodurch die Anzahl der Zeilen verringert wird, die aus den anderen Tabellen gelesen werden müssen. Da weniger Zeilen vorhanden sind, kann die Abfrage-Engine weniger Seiten von der Festplatte/dem Speicher lesen und die Anzahl der erforderlichen E/A reduzieren.