SUKAI kondisi pencocokan pola mengharapkan untuk melihat tipe karakter sebagai operan sisi kiri dan kanan. Ketika menemukan NUMBER, itu secara implisit mengubahnya menjadi char. Kueri 1 Anda pada dasarnya ditulis ulang secara diam-diam menjadi ini:
SELECT a1.*
FROM people a1
WHERE TO_CHAR(a1.id) LIKE '119%'
AND ROWNUM < 5
Itu terjadi dalam kasus Anda, dan itu buruk karena 2 alasan:
- Konversi dijalankan untuk setiap baris, yang lambat;
- Karena suatu fungsi (meskipun implisit) dalam predikat WHERE, Oracle tidak dapat menggunakan indeks pada
A1.ID
kolom.
Untuk menyiasatinya, Anda perlu melakukan salah satu hal berikut:
-
Buat indeks berbasis fungsi di
A1.ID
kolom:CREATE INDEX people_idx5 ON people (TO_CHAR(id));
-
Jika Anda perlu mencocokkan catatan pada 3 karakter pertama kolom ID, buat kolom lain dengan tipe NUMBER yang hanya berisi 3 karakter ini dan gunakan = biasa operator di dalamnya.
-
Buat terpisah kolom
ID_CHAR
jenisVARCHAR2
dan isi denganTO_CHAR(id)
. Indeks dan gunakan sebagai gantiID
diWHERE
. Anda kondisi.Tentu saja jika Anda memilih untuk membuat kolom tambahan berdasarkan kolom ID yang ada, Anda harus tetap menyinkronkan 2 kolom tersebut. Anda dapat melakukannya dalam batch sebagai UPDATE tunggal, atau dalam pemicu ON-UPDATE, atau menambahkan kolom itu ke kolom yang sesuai INSERT dan UPDATE pernyataan dalam kode Anda.