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

Permintaan Oracle menggunakan 'suka' pada kolom nomor yang diindeks, kinerja buruk

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:

  1. Konversi dijalankan untuk setiap baris, yang lambat;
  2. 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:

  1. Buat indeks berbasis fungsi di A1.ID kolom:

    CREATE INDEX people_idx5 ON people (TO_CHAR(id));

  2. 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.

  3. Buat terpisah kolom ID_CHAR jenis VARCHAR2 dan isi dengan TO_CHAR(id) . Indeks dan gunakan sebagai ganti ID di WHERE . 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. gunakan LIKE dan IN dengan subquery di sql

  2. Dilanggar - kunci induk tidak ditemukan 02291. 00000 - batasan integritas

  3. Bagaimana cara memasukkan BLOB ke Oracle dengan Python?

  4. Oracle SQL menghasilkan output acak dengan listaggs

  5. pengecualian keamanan Java:pelanggaran penyegelan saat mencoba terhubung ke database