2010-11-19 8 views
5
  • Ich habe eine sehr große Tabelle.
  • Ich habe einen Index für Spalten col1.
  • Ich möchte die von col1 geordneten Daten erhalten.
  • Aus dem Abfrageplan kann ich sagen, dass es den Index nicht verwendet.
  • Wenn ich "LIMIT" hinzufüge, beginnt es den Index zu verwenden
  • Für großen Wert für "LIMIT", stoppt es die Verwendung des Index.

Irgendwelche Hinweise?Postgres verwendet keinen Index mit "ORDER BY"

P.S. Ich möchte die Daten gruppiert durch Werte von col1 (nicht unbedingt sortiert), alle Vorschläge anders als "ORDER BY".

DANKE !!

+2

Wo ist das Ergebnis von EXPLAIN ANALYSE? Ohne sie hat niemand eine Ahnung, warum die Dinge nicht so funktionieren, wie Sie denken. –

Antwort

5

Wenn Sie alle Zeilen aus der Tabelle zurückgeben, ist ein Index-Scan langsamer als ein Tabellen-Scan. Warum brauchen Sie die Indexnutzung?

Sie könnten versuchen,

set enable_seqscan = false

zu verwenden, um die sequentielle Scan zu deaktivieren, aber ich bin sicher, dass langsamer als mit der sequentiellen Scan sein wird.

ORDER BY ist die nur Methode zum Sortieren Ihrer Daten. Jede andere Sortierung Sie könnten sehen, ist reiner Zufall

bearbeiten
Dinge zu klären: Ich mache nicht empfehlen seq, um die Anspiel ab. Ich habe dies gerade als eine Möglichkeit veröffentlicht, um zu zeigen, dass der Seq-Scan tatsächlich schneller ist als der Index-Scan. Nach dem Ausschalten ist der Ausführungsplan mit der Indexsuche wahrscheinlich langsamer als der Seq-Scan, der dem OP anzeigt, dass kein Index-Scan erforderlich ist.

+0

Nehmen wir an, dies ist eine Schlüssel-> Wertetabelle. Ich möchte alle Zeilen zurückgeben, aber Datensätze mit dem gleichen Schlüssel sollten in der Ergebnismenge konsekutiv sein, aber die Sortierung spielt keine Rolle. –

+3

Fügen Sie dann eine "ORDER BY the_key_column" -Klausel hinzu. Es ist der * einzige * zuverlässige Weg, um Ihre Daten zu sortieren –

+0

Sehr schlechte Idee, enable_seqscan auszuschalten, löst das eigentliche Problem nicht. –

4

Neben der Antwort von a_horse_with_no_name:

einen Index zu verwenden ist tatsächlich zwei verschiedene Operationen: Zuerst wird der Wert, den Sie wünschen, ist für im Index gesucht. Im Index steht die Adresse des vollständigen Datensatzes, der dann dereferenziert wird. Beide Operationen sind sehr schnell für spezifische Abfragen.

Wenn Sie beabsichtigen, alle oder die meisten Datensätze trotzdem zu verwenden, geht der Vorteil verloren. Wenn Sie alle Datensätze und den Index durchsuchen möchten, dauert es länger, da für jeden Datensatz zwei Suchvorgänge ausgeführt werden. Es ist einfacher, einfach über die ganze Tabelle ohne den Index zu laufen, da dies eine Suche pro Spalte erfordert (ja, ich weiß, tatsächlich ist es weniger als das, weil ganze Blöcke gelesen werden usw. Ich möchte es einfach halten).

+0

Aber die Verwendung des Index spart die Sortierzeit, nehme ich an. –

+0

Nein und die ganze Erklärung ist warum nicht. –

+3

Lesen Sie auch den Abschnitt ["Indizes und ORDER BY"] (http://www.postgresql.org/docs/current/static/indexes-ordering.html) des Handbuchs für eine ähnliche Erklärung. –

Verwandte Themen