Tidak ada tidak mungkin .
Indeks memerlukan IMMUTABLE
ekspresi. Hasil ekspresi Anda tergantung pada string input. Saya tidak melihat cara lain selain mengevaluasi ekspresi untuk setiap baris, yang berarti pemindaian berurutan.
Jawaban terkait dengan detail lebih lanjut untuk IMMUTABLE
sudut:
Hanya saja tidak ada solusi untuk kasus Anda, yang tidak mungkin untuk mengindeks. Indeks perlu menyimpan nilai konstan dalam tupelnya, yang tidak tersedia karena nilai yang dihasilkan untuk setiap baris dihitung berdasarkan input. Dan Anda tidak dapat mengubah input tanpa melihat nilai kolom.
Penggunaan indeks Postgres terikat pada operator dan hanya indeks pada ekspresi kiri operator dapat digunakan (karena batasan logis yang sama). Selengkapnya:
Banyak operator mendefinisikan COMMUTATOR
yang memungkinkan perencana/pengoptimal kueri untuk membalik ekspresi yang diindeks ke kiri. Contoh sederhana:Komutator dari =
adalah =
. komutator dari >
adalah <
dan sebaliknya. Dokumentasi:
Operator pencocokan ekspresi reguler ~
tidak memiliki komutator, sekali lagi, karena itu tidak mungkin. Lihat sendiri:
SELECT oprname, oprright::regtype, oprleft::regtype, oprcom
FROM pg_operator
WHERE oprname = '~'
AND 'text'::regtype IN (oprright, oprleft);
oprname | oprright | oprleft | oprcom
---------+----------+-----------+------------
~ | text | name | 0
~ | text | text | 0
~ | text | character | 0
~ | text | citext | 0
Saya telah mencoba sebelumnya dan harus menerima bahwa itu tidak mungkin pada prinsipnya .