Contoh yang sangat sederhana - satu tabel, satu indeks, satu permintaan:
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
memberi saya:
Seq Scan on book b (cost=0.00..25663.80 rows=105425 width=622)
Filter: (year > 2009)
Mengapa TIDAK melakukan pemindaian indeks saja? Apa yang saya lewatkan?
sumber
Apakah Anda Menganalisis tabel / database? Dan bagaimana dengan statistik ? Ketika ada banyak catatan di mana tahun> 2009, pemindaian berurutan mungkin lebih cepat dari pemindaian indeks.
sumber
Dalam pemindaian indeks, baca kepala melompat dari satu baris ke baris lain yang 1000 kali lebih lambat daripada membaca blok fisik berikutnya (dalam pemindaian berurutan).
Jadi, jika (jumlah catatan yang akan diambil * 1000) kurang dari jumlah total catatan, pemindaian indeks akan berkinerja lebih baik.
sumber
@a_horse_with_no_name menjelaskannya dengan cukup baik. Juga jika Anda benar-benar ingin menggunakan pemindaian indeks, Anda umumnya harus menggunakan rentang yang dibatasi di mana klausa. mis - tahun> 2019 dan tahun <2020.
Banyak kali statistik tidak diperbarui pada tabel dan itu tidak mungkin dilakukan karena kendala. Dalam hal ini, pengoptimal tidak akan tahu berapa banyak baris yang harus diambil pada tahun> 2019. Dengan demikian ia memilih pemindaian berurutan sebagai pengganti pengetahuan penuh. Partisi terikat akan menyelesaikan masalah sebagian besar waktu.
sumber