CREATE INDEX

Name

CREATE INDEX -- definiert einen neuen Index

Synopsis

CREATE [ UNIQUE ] INDEX indexname ON tabelle
    [ USING methode ] ( spalte [ ops_name ] [, ...] )
    [ WHERE prädikat ]

CREATE [ UNIQUE ] INDEX indexname ON tabelle
    [ USING methode ] ( funktionsname( spalte [, ... ]) [ ops_name ] )
    [ WHERE prädikat ]

Beschreibung

CREATE INDEX erzeugt einen Index namens indexname für die angegebene Tabelle. Indexe werden hauptsächlich verwendet um die Leistung der Datenbank zu verbessern. Aber unpassende Verwendung kann auch zu schlechterer Leistung führen.

In der ersten oben gezeigten Syntax sind die Schlüsselfelder des Index die angegebenen Spaltennamen. Mehrere Felder können angegeben werden, wenn die Indexmethode mehrspaltige Indexe unterstützt.

In der zweiten oben gezeigten Syntax wird ein Index über die Ergebnisse der angegebenen Funktion funktionsname, die für eine oder mehrere Spalten einer einzelnen Tabelle aufgerufen wird, definiert. Diese Funktionsindexe ermöglichen schnellen Zugriff auf Daten, wenn die Anfragebedingungen die indizierten Daten in Funktionsaufrufen enthalten. Wenn man zum Beispiel einen Funktionsindex über upper(spalte) hätte, dann könnte eine Klausel wie WHERE upper(spalte) = 'FRED' einen Index verwenden.

PostgreSQL bietet die Indexmethoden B-Tree, R-Tree, Hash und GiST. Die B-Tree-Indexmethode ist eine Implementation der hochparallelen B-Trees von Lehman und Yao. Die R-Tree-Indexmethode ist eine Implementation des normalen R-Trees mit dem quadratischen Split-Algorithmus von Guttman. Der Hash-Index ist eine Implementation des linearen Hashs von Litwin. Benutzer können auch eigene Indexmethoden definieren, aber das ist ziemlich schwierig.

Wenn eine WHERE-Klausel angegeben ist, dann wird ein partieller Index erzeugt. Ein partieller Index ist ein Index, der nur Einträge für einen Teil der Tabelle enthält, normalerweise einen Teil, der irgendwie interessanter ist als der Rest der Tabelle. Wenn Sie zum Beispiel eine Tabelle mit Bestellungen haben, wovon für einige schon die Rechnung gestellt wurde und für andere nicht, und die Bestellungen ohne Rechnung ein kleiner Teil der Tabelle sind, aber die Zeilen mit den meisten Zugriffen, dann können Sie die Leistung verbessern, wenn Sie den Index nur über diesen Bereich erstellen. Eine weitere mögliche Anwendung ist, WHERE mit UNIQUE zu verwenden, um die Einmaligkeit der Werte in nur einem Teil der Tabelle zu erreichen.

Der Ausdruck in der WHERE-Klausel kann nur Spalten der zugrunde liegenden Tabelle verwenden (aber alle Spalten, nicht nur die, die indiziert werden). Gegenwärtig sind Unteranfragen und Aggregatausdrücke in der WHERE-Klausel nicht erlaubt.

Alle Funktionen und Operatoren, die in der Indexdefinition verwendet werden, müssen als IMMUTABLE (unveränderlich) markiert sein, das heißt ihre Ergebnisse hängen nur von den Argumentwerten hab und niemals von äußeren Einflüssen (wie zum Beispiel dem Inhalt einer anderen Tabelle oder der aktuelle Zeit). Diese Einschränkung stellt sicher, dass das Verhalten des Index wohldefiniert ist. Um eine benutzerdefinierte Funktion im Index zu verwenden, denken Sie also daran, sie als IMMUTABLE zu markieren.

Parameter

UNIQUE

Damit prüft das System, ob die Tabelle doppelte Werte enthält, sowohl bei der Erzeugung des Index (wenn die Tabelle schon Daten enthält) als auch jedes Mal wenn Daten hinzugefügt werden. Wenn man Daten einfügt oder aktualisiert und sich dadurch doppelte Werte ergeben würden, dann ergibt das einen Fehler.

indexname

Der Name des zu erzeugenden Index. Hier kann kein Schemaname angegeben werden; der Index wird immer im selben Schema wie seine Tabelle erzeugt.

tabelle

Der Name der zu indizierenden Tabelle (möglicherweise mit Schemaqualifikation).

method

Der Name der für den Index zu verwendenden Methode. Zur Auswahl stehen btree, hash, rtree und gist. Die Standardmethode ist btree.

spalte

Der Name einer Spalte in der Tabelle.

ops_name

Eine zugehörige Operatorklasse. Einzelheiten siehe unten.

funktionsname

Eine Funktion, die die zu indizierenden Werte zurückgibt.

prädikat

Definiert den Bedingungsausdruck für einen partiellen Index.

Meldungen

CREATE INDEX

Meldung, wenn der Index erfolgreich erzeugt wurde.

Hinweise

Weitere Informationen darüber, wann Indexe verwendet werden, wann sie nicht verwendet werden und in welchen bestimmten Situationen sie nützlich sein können, finden Sie in Kapitel 11.

Gegenwärtig unterstützen nur die Indexmethoden B-Tree und GiST mehrspaltige Indexe. In der Voreinstellung werden bis zu 32 Felder unterstützt. (Diese Grenze kann beim Kompilieren von PostgreSQL verändert werden.) Nur die B-Tree-Methode unterstützt gegenwärtig die UNIQUE-Option.

Eine Indexdefinition kann für jede Spalte eines Index eine Operatorklasse angeben. Die Operatorklasse bestimmt, welche Operatoren vom Index für diese Spalte verwendet werden sollen. Ein B-Tree-Index für eine Spalte vom Typ int4 würde die Operatorklasse int4_ops verwenden; diese Operatorklasse enthält die Vergleichsfunktionen für Werte vom Typ int4. Normalerweise reicht die vorgegebene Operatorklasse für den Datentyp der Spalte aus. Der Hauptgrund, warum es Operatorklassen gibt, ist, dass es für manche Datentypen mehrere sinnvolle Sortierreihenfolgen geben kann. Zum Beispiel könnte man komplexe Zahlen nach Betrag oder nach dem reellen Teil sortieren. Das könnte man erreichen, indem man zwei Operatorklassen erzeugt und die passende wählt, wenn man den Index definiert. Weitere Informationen über Operatorklassen finden Sie in Abschnitt 11.6 und in Abschnitt 33.14.

Beispiele

Um einen B-Tree-Index für die Spalte titel in der Tabelle filme zu erzeugen:

CREATE UNIQUE INDEX titel_idx ON filme (titel);

Kompatibilität

Der Befehl CREATE INDEX ist eine PostgreSQL-Erweiterung. Im SQL-Standard gibt es keine Bestimmungen über Indexe.

Siehe Auch

DROP INDEX