sebuah implisit konversi dapat mencegah indeks digunakan oleh pengoptimal. Pertimbangkan:
SQL> CREATE TABLE a (ID VARCHAR2(10) PRIMARY KEY);
Table created
SQL> insert into a select rownum from dual connect by rownum <= 1e6;
1000000 rows inserted
Ini adalah tabel sederhana tetapi tipe datanya tidak 'benar', yaitu jika Anda menanyakannya seperti ini, ia akan memindai penuh:
SQL> select * from a where id = 100;
ID
----------
100
Kueri ini sebenarnya setara dengan:
select * from a where to_number(id) = 100;
Itu tidak dapat menggunakan indeks karena kami mengindeks id
dan bukan to_number(id)
. Jika kita ingin menggunakan indeks, kita harus eksplisit :
select * from a where id = '100';
Sebagai balasan atas komentar pakr: Ada banyak aturan tentang konversi implisit. Satu tempat yang baik untuk memulai adalah dokumentasi . Antara lain, kita belajar bahwa:
Ini berarti bahwa ketika konversi implisit terjadi selama "WHERE column=variable"
klausa, Oracle akan mengonversi tipe data kolom dan BUKAN variabel, oleh karena itu mencegah indeks digunakan. Inilah sebabnya mengapa Anda harus selalu menggunakan tipe data yang tepat atau mengonversi variabel secara eksplisit.
Dari dokumen Oracle: