Frage Postgres verwendet keinen Index mit "ORDER BY"


  • Ich habe einen sehr großen Tisch.
  • Ich habe einen Index für Spalten col1.
  • Ich möchte die von col1 bestellten Daten erhalten.
  • Aus dem Abfrageplan kann ich sagen, dass er den Index nicht verwendet.
  • Wenn ich "LIMIT" hinzufüge, beginnt es den Index zu verwenden
  • Bei einem großen Wert für "LIMIT" wird der Index nicht mehr verwendet.

Irgendeine Ahnung?

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

VIELEN DANK !!


5
2017-11-19 16:47


Ursprung


Antworten:


Wenn Sie alle Zeilen aus der Tabelle zurückgeben, ist eine Indexsuche langsamer als eine Tabellensuche. Warum brauchen Sie die Indexnutzung?

Sie könnten versuchen zu verwenden

set enable_seqscan = false  

um den sequentiellen Scan zu deaktivieren, bin ich mir aber sicher, dass das langsamer ist als beim sequentiellen Scan.

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

Bearbeiten
Um Dinge zu klären: tue ich nicht empfehlen, seq scan auszuschalten. 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.


5
2017-11-19 16:58



Zusätzlich zur Antwort von a_horse_with_no_name:

Bei der Verwendung eines Indexes handelt es sich eigentlich um zwei verschiedene Operationen: Zuerst wird im Index nach dem gewünschten Wert 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 ohnehin alle oder die meisten Datensätze verwenden möchten, 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).


4
2017-11-19 17:11