Frage

Ich habe meine Postgres-Datenbanken vor kurzem an der Optimierung gearbeitet und traditionell, habe ich immer nur B-Tree-Indizes verwenden. Aber ich sah, dass GiST Indizes suport nicht eindeutiges, mehrspaltigen Indizes in der Postgres 8.3-Dokumentation.

Ich konnte aber nicht sehen, was der eigentliche Unterschied zwischen ihnen ist. Ich hatte gehofft, dass meine Kolleginnen und Programmierer könnte zu erklären beable, was die Vor- und Nachteile zwischen ihnen sind, und was noch wichtiger ist, die Gründe, warum sollte ich einen über den anderen verwenden?

War es hilfreich?

Lösung

Auf den Punkt gebracht: B-Tree-Indizes eine bessere Leistung, aber GiST Indizes sind flexibler. Normalerweise wollen Sie B-Tree-Indizes, wenn sie werden für Ihren Datentyp arbeiten. Es gab einen kürzlich erschienenen Beitrag auf der PG über eine große Leistung Trefferlisten GiST Indizes für die Verwendung; sie erwarten langsamer als B-Trees zu sein (so ist der Preis der Flexibilität), aber nicht , die viel langsamer ... Arbeit ist, wie man erwarten könnte, noch nicht abgeschlossen.

einen Beitrag von Tom Lane , einen Kern PostgreSQL Entwickler:

  

Der wichtigste Punkt von GIST ist zu indizieren Abfragen in der Lage sein, die einfach   nicht Wende in btree. ... Man würde voll   erwarten btree zu schlagen GIST für btree-Wende Fälle. Ich denke der   hier wichtiger Punkt ist, dass es um einen Faktor von ein paar gewinnt   hundert; das ist ziemlich schrecklich, und könnte bis zu einem gewissen Punkt Implementierung   Problem dar.

Andere Tipps

Im Grunde jeder das Recht - btree ist Standard-Index, da es sehr gut funktioniert. GiST sind etwas andere Tiere - es eher eine ist als ein Indextyp auf seinem eigenen „Rahmenindextypen zu schreiben“. Sie haben, um benutzerdefinierten Code hinzufügen (Server), es zu benutzen, aber auf der anderen Seite - sie sind sehr flexibel

.

Generell - Sie verwenden GiST nicht, wenn der Datentyp Sie Sie verwenden sind sagen, dies zu tun. Beispiel für Datentypen, die GiST benutzen. Ltree (von contrib), tsvector (contrib / tsearch bis 8,2, in Kern seit 8.3) und andere

Es ist gut bekannt, und ziemlich schnell geographische extenstion zu PostgreSQL - PostGIS ( http://postgis.refractions.net/ ), die verwendet GiST für seine Zwecke.

GiST Indizes in einem Umfang verlustbehaftet sind, was bedeutet, dass das DBMS mit Fehlalarme / Negative zu tun hat, das heißt:.

  

GiST Indizes sind verlustbehaftete, da jedes Dokument im Index durch eine fest vertreten   Länge Unterschrift. Die Signatur ist   erzeugt, indem jedes Wort in ein Hashing   Zufallsbit in einem n-Bit-String, mit   All diese Bits ODER-ed zusammen   ein n-Bit-Signatur-Dokument erzeugen.   Wenn zwei Wörter Hash auf das gleiche Bit   Position wird es eine falsche Übereinstimmung sein.   Wenn alle Wörter in der Abfrage haben Streichhölzer   (Real oder falsch), dann die Tabellenzeile   muss, wenn das Spiel zu sehen, abgerufen werden   ist richtig.   b-Bäume dieses Verhalten nicht haben, so abhängig von den Daten indiziert, kann es einige Performance-Unterschied zwischen den beiden sein.

Sehen Sie für die Textsuche Verhalten http: //www.postgresql. org / docs / 8.3 / static / Volltextsuche-indexes.html und

GiST sind allgemeine Indizes. Sie können sie für eine breitere Zwecke verwenden, die die, die Sie mit B-Baum verwenden würde. Einschließlich der Fähigkeit, einen B-Baum mit GiST zu bauen.

IE: Sie GiST indizieren auf geographische Punkte oder geografischen Gebieten verwenden können, etwas, das man mit B-Tree-Indizes nicht in der Lage sein zu tun, denn das einzige, was auf einem B-Baum-Rolle ist der Schlüssel (oder Tasten) Sie indizieren auf.

scroll top