Jawabannya tergantung pada banyak faktor seperti versi Postgres, encoding dan lokal - LC_COLLATE
khususnya.
Ekspresi telanjang lower(description) LIKE '%abc%'
biasanya sedikit lebih cepat dari description ILIKE '%abc%'
, dan keduanya sedikit lebih cepat daripada ekspresi reguler yang setara:description ~* 'abc'
. Ini penting untuk pemindaian berurutan di mana ekspresi harus dievaluasi untuk setiap baris yang diuji.
Tapi untuk tabel besar seperti yang Anda tunjukkan dalam jawaban Anda, seseorang pasti akan menggunakan file index. Untuk pola arbitrer (tidak hanya berlabuh kiri) saya menyarankan indeks trigram menggunakan modul tambahan pg_trgm
. Kemudian kita berbicara tentang milidetik, bukan detik, dan perbedaan antara ekspresi di atas dihilangkan.
Indeks GIN dan GiST (menggunakan gin_trgm_ops
atau gist_trgm_ops
kelas operator) mendukung ILIKE
(~~
), ILIKE
(~~*
), ~
, ~*
(dan beberapa varian lainnya) sama. Dengan indeks GIN trigram pada description
(biasanya lebih besar dari GiST, tetapi lebih cepat untuk dibaca), kueri Anda akan menggunakan description ILIKE 'case_insensitive_pattern'
.
Terkait:
- Variasi kinerja kueri SEPERTI PostgreSQL
- String UTF-8 serupa untuk bidang pelengkapan otomatis
Dasar-dasar untuk pencocokan pola di Postgres:
- Pencocokan pola dengan LIKE, SIMILAR TO atau ekspresi reguler di PostgreSQL
Saat bekerja dengan indeks trigram tersebut biasanya lebih praktis untuk bekerja dengan:
description ILIKE '%abc%'
Atau dengan operator regexp peka huruf besar/kecil (tanpa %
wildcard):
description ~* 'abc'
Indeks pada (description)
tidak mendukung kueri di lower(description)
seperti:
lower(description) LIKE '%abc%'
Dan sebaliknya.
Dengan predikat di lower(description)
secara eksklusif , indeks ekspresi adalah opsi yang sedikit lebih baik.
Dalam semua kasus lain, indeks pada (description)
lebih disukai karena mendukung keduanya predikat case-sensitive dan -insensitive.