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

Oracle:manfaatkan penggunaan dua indeks

Anda mengatakan CAMPO47 sangat selektif. Tetapi Anda hanya memfilter pada IS NOT NULL. Jadi, tidak peduli berapa banyak nilai berbeda yang dimilikinya, pengoptimal tidak akan menggunakannya sebagai titik masuk.

Dan seberapa selektif itu? Seperti yang dapat Anda lihat dari kardinalitas dalam rencana penjelasan, memilih pada STATO='SC' akan menemukan 12856 baris dalam tabel Anda. 12702 dari baris-baris itu jelas memiliki CAMPO47 dengan nilai, jadi hanya 154 baris yang disaring oleh tes untuk nullity. Jika pengoptimal telah menambah indeks pada CAMPO47, berapa banyak baris yang akan dikembalikan? Mungkin lebih banyak lagi.

Pengoptimal hanya dapat menggunakan satu indeks tumpukan untuk mengakses baris pada tabel. (Mekanismenya berbeda untuk indeks bitmap ketika mereka menerapkan transformasi bintang). Jadi, jika menurut Anda akses tabel tambahan adalah beban yang tak tertahankan, maka Anda memiliki satu opsi:indeks gabungan. Jika STATO benar-benar tidak selektif (relatif sedikit baris) maka Anda mungkin aman mengganti indeks yang ada dengan yang aktif (STATO, CAMPO47).

Ada trik lama untuk mendorong database agar menggunakan indeks untuk mengakses operasi IS NOT NULL, dan itu adalah menggunakan operan yang hanya bisa benar jika kolom berisi nilai. Misalnya, sesuatu seperti ini untuk kolom string (saya berasumsi sesuatu yang disebut CAMPO47 baru saja menjadi string):

AND campo47 >= chr(0)

Itu akan cocok dengan kolom apa pun yang berisi satu atau lebih karakter ascii. Tidak yakin apakah itu akan mengarah pada pengoptimalan "dua indeks" yang Anda gambarkan, tetapi ini patut dicoba. (Saya akan menguji ini sendiri tetapi saya tidak memiliki akses ke database Oracle sekarang, dan SQL Fiddle terlempar ketika saya mencoba untuk melihat Rencana Penjelasan)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih string sebagai nomor di Oracle

  2. ORA-00911:karakter Kodok yang tidak valid

  3. Oracle ROWID sebagai parameter fungsi/prosedur

  4. Periksa apakah tanggal saat ini berada di antara dua tanggal Oracle SQL

  5. ubah format tanggal 'yyyy/mm/dd' menjadi 'mm-dd-yyyy' di Oracle