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

Variasi kinerja kueri SEPERTI PostgreSQL

FTS tidak mendukung LIKE

Jawaban yang diterima sebelumnya salah. Pencarian Teks Lengkap dengan indeks teks lengkapnya tidak untuk LIKE operator sama sekali, ia memiliki operatornya sendiri dan tidak berfungsi untuk string yang berubah-ubah. Ini beroperasi pada kata berdasarkan kamus dan stemming. Itu memang mendukung pencocokan awalan untuk kata , tetapi tidak dengan LIKE operator:

  • Dapatkan kecocokan sebagian dari kolom TSVECTOR yang diindeks GIN

Indeks trigram untuk LIKE

Instal modul tambahan pg_trgm yang menyediakan kelas operator untuk indeks trigram GIN dan GiST untuk mendukung semua LIKE dan ILIKE pola , bukan hanya yang berlabuh ke kiri:

Contoh indeks:

CREATE INDEX tbl_col_gin_trgm_idx  ON tbl USING gin  (col gin_trgm_ops);

Atau:

CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
  • Perbedaan antara indeks GiST dan GIN

Contoh kueri:

SELECT * FROM tbl WHERE col LIKE '%foo%';   -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%';  -- works case insensitively as well

Trigram? Bagaimana dengan string yang lebih pendek?

Kata dengan kurang dari 3 huruf dalam nilai yang diindeks masih berfungsi. Panduan:

Setiap kata dianggap memiliki dua spasi awalan dan satu spasi saat menentukan himpunan trigram yang terkandung dalam string.

Dan pola pencarian dengan kurang dari 3 huruf? Panduan:

Untuk keduanya LIKE dan pencarian ekspresi reguler, perlu diingat bahwa pola tanpa trigram yang dapat diekstrak akan berubah menjadi pemindaian indeks penuh.

Artinya, pemindaian indeks / indeks bitmap masih berfungsi (rencana kueri untuk pernyataan yang disiapkan tidak akan rusak), itu tidak akan memberi Anda kinerja yang lebih baik. Biasanya tidak ada kerugian besar, karena string 1 atau 2 huruf hampir tidak selektif (lebih dari beberapa persen dari tabel yang mendasari cocok) dan dukungan indeks tidak akan meningkatkan kinerja untuk memulai, karena pemindaian tabel penuh lebih cepat.


text_pattern_ops untuk pencocokan awalan

Hanya untuk berlabuh ke kiri pola (tidak ada wildcard terkemuka) Anda mendapatkan yang optimal dengan kelas operator yang sesuai untuk indeks btree:text_pattern_ops atau varchar_pattern_ops . Kedua fitur bawaan Postgres standar, tidak diperlukan modul tambahan. Performa serupa, tetapi indeks jauh lebih kecil.

Contoh indeks:

CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);

Contoh kueri:

SELECT * FROM tbl WHERE col LIKE 'foo%';  -- no leading wildcard

Atau , jika Anda harus menjalankan database Anda dengan 'C' lokal (secara efektif tidak locale), maka semuanya diurutkan menurut urutan byte dan indeks btree biasa dengan kelas operator default melakukan pekerjaan itu.

Detail lebih lanjut, penjelasan, contoh, dan tautan dalam jawaban terkait ini di dba.SE:

  • Pencocokan pola dengan LIKE, SIMILAR TO, atau ekspresi reguler di PostgreSQL
  • Bagaimana LIKE diterapkan?
  • Menemukan string serupa dengan PostgreSQL dengan cepat


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Webinar :Fitur Baru di PostgreSQL 11 [Tindak lanjut]

  2. Tidak dapat menemukan titik masuk bernama 'InterlockedIncrement' di DLL 'kernel32.dll' - [dilindungi email] 64 bit

  3. Cara mengganti basis data menggunakan PostgreSQL

  4. Tipe Hibernasi, Postgres &Array

  5. IN Klausa dengan NULL atau IS NULL