Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Indeks tidak digunakan karena konversi jenis?

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql (Oracle) untuk memilih 10 catatan pertama, lalu 10 berikutnya, dan seterusnya

  2. Oracle:Hapus dari bawah ke atas

  3. Di mana kelas Java disimpan di Oracle?

  4. Bagaimana cara mengembalikan beberapa baris dari prosedur tersimpan Oracle dari beberapa kursor?

  5. Oracle SQL mendapatkan elemen ke-n regexp