Perencana kueri PostgreSQL cerdas, tetapi bukan AI. Untuk membuatnya gunakan indeks pada ekspresi gunakan bentuk ekspresi yang sama persis dalam kueri.
Dengan indeks seperti ini:
CREATE INDEX t_a_lower_idx ON t (lower(substring(a, 1, 4)));
Atau lebih sederhana di PostgreSQL 9.1:
CREATE INDEX t_a_lower_idx ON t (lower(left(a, 4)));
Gunakan kueri ini:
SELECT * FROM t WHERE lower(left(a, 4)) = 'abcd';
Yang 100% secara fungsional setara dengan:
SELECT * FROM t WHERE lower(a) LIKE 'abcd%'
Atau:
SELECT * FROM t WHERE a ILIKE 'abcd%'
Tapi tidak :
SELECT * FROM t WHERE a LIKE 'abcd%'
Ini adalah kueri yang berbeda secara fungsional dan Anda membutuhkan berbeda indeks:
CREATE INDEX t_a_idx ON t (substring(a, 1, 4));
Atau lebih sederhana dengan PostgreSQL 9.1:
CREATE INDEX t_a_idx ON t (left(a, 4));
Dan gunakan kueri ini:
SELECT * FROM t WHERE left(a, 4) = 'abcd';
Istilah penelusuran berlabuh kiri dengan panjang variabel
Tidak peka huruf besar/kecil. Indeks:
Sunting :Hampir lupa:Jika Anda menjalankan db dengan lokal selain 'C' default, Anda perlu menentukan kelas operator secara eksplisit
- text_pattern_ops
dalam contoh saya:
CREATE INDEX t_a_lower_idx
ON t (lower(left(a, <insert_max_length>)) text_pattern_ops);
Pertanyaan:
SELECT * FROM t WHERE lower(left(a, <insert_max_length>)) ~~ 'abcdef%';
Dapat memanfaatkan indeks dan hampir secepat varian dengan panjang tetap.
Anda mungkin tertarik dengan postingan di dba.SE dengan detail selengkapnya tentang pencocokan pola
, terutama bagian terakhir tentang operator ~>=~
dan ~<~
.