PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Dampak kinerja LIKE kosong dalam pernyataan yang disiapkan

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghasilkan kolom secara dinamis di PostgreSQL

  2. Pemicu umum untuk membatasi penyisipan berdasarkan jumlah

  3. Penghentian NGINX TLS untuk PostgreSQL

  4. Bagaimana justify_days() Bekerja di PostgreSQL

  5. Pilih N Baris Dengan Nilai Campuran