Postgres 9.2 atau lebih baru umumnya cukup pintar untuk menyadari bahwa kondisi
WHERE name LIKE '%%'
tidak selektif dan menggunakan pemindaian berurutan dengan mengabaikan indeks GiST - bahkan dengan pernyataan yang disiapkan. Anda melakukannya membayar harga kecil untuk kondisi yang tidak berguna.
Di Postgres 9.1 atau sebelumnya saya akan membuat kueri terpisah untuk kasus khusus.
Bandingkan Catatan bagian untuk PREPARE
pernyataan dalam manual untuk versi 9.1
, 9.2
dan 9.3
.
Verifikasi diri Anda
Siapkan pernyataan dan jalankan EXPLAIN ANALYZE
untuk menguji:
PREPARE plan1 (text) AS
SELECT * FROM file
WHERE name LIKE $1;
EXPLAIN ANALYZE EXECUTE plan1('%123%');
EXPLAIN ANALYZE EXECUTE plan1('%%');
Rencana umumnya di-cache selama sesi berlangsung.
Kueri alternatif
Terlepas dari versi yang Anda jalankan, jika Anda selalu melakukan pencarian teks lengkap (wildcard kiri dan kanan), kueri ini akan lebih cepat untuk pernyataan yang disiapkan:
SELECT * FROM files WHERE name LIKE ('%' || $1 || '%');
Dan teruskan polanya tanpa menambahkan wildcard (%
), tentu saja. Dengan cara ini, Postgres mengetahui pola yang dilampirkan dalam wildcard pada waktu perencanaan.
->Demo SQLfiddle.
Perhatikan pemindaian berurutan untuk LIKE yang kosong dan perbedaan kinerja antara kedua paket.
SQLfiddle sangat bervariasi, tergantung pada beban dll. Satu kali proses mungkin tidak dapat diandalkan. Uji lebih baik di lingkungan Anda dan jalankan setiap pernyataan beberapa kali untuk menjenuhkan cache dan menghilangkan noise.