2008-08-22 14 views
34

Von welchen Informationen konnte ich finden, sie beide lösen die gleichen Probleme - esoterische Operationen wie Array Eindämmung und Kreuzung (& &, @>, < @, etc). Allerdings wäre ich an Ratschlägen interessiert, wann ich das eine oder das andere (oder keines von beiden) verwenden sollte.
Die PostgreSQL documentation hat einige Informationen über diese:PostgreSQL: GIN oder GiST Indizes?

  • GIN Index-Lookups sind etwa dreimal schneller als GiST
  • GIN Indizes nehmen etwa drei Mal als GiST
  • GIN Indizes zu bauen länger sind etwa zehnmal langsamer als GiST
  • GIN Indizes zwei bis dreimal größer als würde GiST

aber ich i zu aktualisieren, insbesondere Es ist wichtig zu wissen, ob es einen Leistungseinfluss gibt, wenn das Speicher-Index-Größenverhältnis anfängt, klein zu werden (d. h. die Indexgröße wird viel größer als der verfügbare Speicher)? Mir wurde auf dem #postgresql-IRC-Kanal gesagt, dass GIN den gesamten Index im Speicher behalten muss, sonst wird es nicht effektiv sein, denn im Gegensatz zu B-Tree weiß es nicht, welcher Teil von der Platte eingelesen werden soll eine bestimmte Abfrage? Die Frage wäre: Ist das wahr (weil mir auch das Gegenteil gesagt wurde)? Hat GiST die gleichen Einschränkungen? Gibt es weitere Einschränkungen, auf die ich bei der Verwendung eines dieser Indexierungsalgorithmen achten sollte?

+0

Diese Messungen variieren je nach verwendeter PG-Version. Ich habe gerade einen Test unter 9.6.1 gegen eine Hstore-Spalte ausgeführt und folgendes bekommen: GiST brauchte 4,1 mal länger als GIN und war für Lookups ungefähr 170 mal langsamer. Nicht einmal annähernd die Zahlen, die Sie zitiert haben. – IamIC

Antwort

14

Zunächst müssen Sie sie für die Indexierung der Textsuche verwenden? GIN und GiST sind für einige Datentypen auf den Index spezialisiert. Wenn Sie einfache char- oder Integer-Werte indexieren müssen, ist der normale B-Tree-Index der beste.
Wie auch immer, PostgreSQL Dokumentation hat ein Kapitel auf GIST und eins auf GIN, wo Sie weitere Informationen finden können.
Und zu guter Letzt ist der beste Weg, um herauszufinden, was am besten ist, um Beispieldaten zu generieren (so viel wie Sie ein echtes Szenario sein müssen) und dann einen GIST-Index zu erstellen, der misst, wie viel Zeit benötigt wird Index, fügen Sie einen neuen Wert ein, führen Sie eine Beispielabfrage aus. Dann lassen Sie den Index fallen und machen Sie dasselbe mit einem GIN-Index. Vergleichen Sie die Werte und Sie erhalten die Antwort, die Sie benötigen, basierend auf Ihren Daten.

+8

Ja, aber das Problem ist Zeit, es ist klüger zu fragen, falls jemand bereits weiß ... –

+11

Ich denke, dass das Generieren eigener Daten die einzige Antwort ist. Ich verbrachte ein paar Tage damit, alles zu lesen, was ich im Kontext von Volltext und Spatial über Gist- und Gin-Indizes konnte, Einfügen mit Indizes ein- oder ausgeschaltet, wal-Einstellungen in postgres.sql und Gespräche mit Leuten auf # postgis/# postgresql und schließlich kam zu dem Schluss, dass der einzige Weg, wirklich sicher zu sein, für meine sehr spezifische Verwendung war, Testtabellen mit großen Teilmengen meiner tatsächlichen Daten zu laden und zu testen. Wenn Sie während des Setups hetzen, um einen Tag hier oder da zu sparen, werden Sie in den nächsten Jahren Wochen verschwenden, die ich durch harte Erfahrung gelernt habe. –