Perbedaan waktu eksekusi kueri adalah karena eksekusi pertama harus membaca lebih banyak blok 8kB dari disk:bandingkan shared read=631496
dan shared read=30359
.
PostgreSQL memutuskan untuk tidak menggunakan indeks untuk WHERE
kondisi, tetapi indeks yang mendukung ORDER BY
. Perhatikan bahwa karena IN
tidak mungkin menggunakan satu indeks untuk keduanya WHERE
kondisi dan ORDER BY
– itu hanya mungkin untuk WHERE
kondisi yang menggunakan =
sebagai operator pembanding.
Jadi PostgreSQL harus membuat pilihan, dan mungkin membuat pilihan yang salah:karena statistiknya memberi tahu pengoptimal bahwa ada banyak baris yang memenuhi WHERE
kondisi, ia memutuskan untuk membaca baris dalam ORDER BY
pesan dan buang yang tidak sesuai dengan WHERE
kondisi sampai telah ditemukan 100 baris hasil. Sayangnya, sepertinya baris yang cocok tidak dekat dengan awal tabel, dan PostgreSQL harus memindai banyak baris (Rows Removed by Filter: 17276154
).
Untuk membuatnya gunakan pemindaian indeks untuk WHERE
kondisi, ubah ORDER BY
klausa sehingga PostgreSQL tidak dapat menggunakan indeks untuknya:
ORDER BY datetime + INTERVAL '0 seconds' DESC
Karena tidak ada gunanya indeks multi-kolom di sini, indeks terbaik adalah
CREATE INDEX ON report (sensor_id);