Sehr einfaches Beispiel - eine Tabelle, ein Index, eine Abfrage:
CREATE TABLE book
(
id bigserial NOT NULL,
"year" integer,
-- other columns...
);
CREATE INDEX book_year_idx ON book (year)
EXPLAIN
SELECT *
FROM book b
WHERE b.year > 2009
gibt mir:
Seq Scan on book b (cost=0.00..25663.80 rows=105425 width=622)
Filter: (year > 2009)
Warum wird stattdessen KEIN Index-Scan durchgeführt? Was vermisse ich?
quelle
Hast du ANALYSIERT? die Tabelle / Datenbank ? Und was ist mit den Statistiken ? Wenn es viele Datensätze mit einem Jahr> 2009 gibt, ist ein sequentieller Scan möglicherweise schneller als ein Index-Scan.
quelle
Beim Index-Scan springt der Lesekopf von einer Zeile zur nächsten, was 1000-mal langsamer ist als beim Lesen des nächsten physischen Blocks (beim sequentiellen Scan).
Wenn also die (Anzahl der abzurufenden Datensätze * 1000) geringer ist als die Gesamtzahl der Datensätze, wird der Index-Scan besser ausgeführt.
quelle
@a_horse_with_no_name hat es ganz gut erklärt. Auch wenn Sie wirklich einen Index-Scan verwenden möchten, sollten Sie im Allgemeinen begrenzte Bereiche in der where-Klausel verwenden. zB - Jahr> 2019 und Jahr <2020.
In vielen Fällen werden Statistiken für eine Tabelle nicht aktualisiert, und dies ist aufgrund von Einschränkungen möglicherweise nicht möglich. In diesem Fall weiß der Optimierer nicht, wie viele Zeilen er im Jahr> 2019 benötigen soll. Daher wählt er anstelle des vollständigen Wissens einen sequentiellen Scan aus. Begrenzte Partitionen lösen das Problem meistens.
quelle