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

Apa implikasi kinerja Oracle IN Clause tanpa bergabung?

Jika statistik pada tabel Anda akurat, kecil kemungkinannya pengoptimal akan memilih untuk melakukan pemindaian tabel daripada menggunakan indeks kunci utama saat Anda hanya memiliki 1000 elemen hard-code di WHERE ayat. Pendekatan terbaik adalah mengumpulkan (atau mengatur) statistik yang akurat pada objek Anda karena hal itu akan menyebabkan hal-hal baik terjadi secara otomatis daripada mencoba melakukan banyak senam untuk mengatasi statistik yang salah.

Jika kami berasumsi bahwa statistik tidak akurat sejauh pengoptimal akan percaya bahwa pemindaian tabel akan lebih efisien daripada menggunakan indeks kunci utama, Anda berpotensi menambahkan DYNAMIC_SAMPLING petunjuk yang akan memaksa pengoptimal untuk mengumpulkan statistik yang lebih akurat sebelum mengoptimalkan pernyataan atau CARDINALITY petunjuk untuk mengganti perkiraan kardinalitas default pengoptimal. Tak satu pun dari mereka yang perlu mengetahui apa pun tentang indeks yang tersedia, itu hanya perlu mengetahui alias tabel (atau nama jika tidak ada alias). DYNAMIC_SAMPLING akan menjadi pendekatan yang lebih aman, lebih kuat, tetapi akan menambah waktu untuk langkah penguraian.

Jika Anda sedang membangun pernyataan SQL dengan sejumlah variabel parameter hard-code di IN klausa, Anda mungkin akan menciptakan masalah kinerja untuk diri sendiri dengan membanjiri kumpulan bersama Anda dengan SQL yang tidak dapat dibagikan dan memaksa database menghabiskan banyak waktu untuk menguraikan setiap varian secara terpisah. Akan jauh lebih efisien jika Anda membuat satu pernyataan SQL yang dapat dibagikan yang dapat diuraikan satu kali. Tergantung di mana IN your Anda nilai klausa berasal, yang mungkin terlihat seperti

SELECT *
  FROM table_name
 WHERE primary_key IN (SELECT primary_key
                         FROM global_temporary_table);

atau

SELECT *
  FROM table_name
 WHERE primary_key IN (SELECT primary_key
                         FROM TABLE( nested_table ));

atau

SELECT *
  FROM table_name
 WHERE primary_key IN (SELECT primary_key
                         FROM some_other_source);

Jika Anda memiliki satu pernyataan SQL yang dapat dibagikan, maka selain menghindari biaya untuk terus-menerus menguraikan ulang pernyataan tersebut, Anda akan memiliki sejumlah opsi untuk memaksakan rencana tertentu yang tidak melibatkan modifikasi pernyataan SQL. Versi Oracle yang berbeda memiliki opsi yang berbeda untuk stabilitas paket-- ada garis besar yang tersimpan , Pengelolaan paket SQL , dan profil SQL di antara teknologi lainnya tergantung pada rilis Anda. Anda dapat menggunakan ini untuk memaksa rencana tertentu untuk pernyataan SQL tertentu. Namun, jika Anda terus membuat pernyataan SQL baru yang harus diurai ulang, akan menjadi sangat sulit untuk menggunakan teknologi ini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa GETDATE() merupakan pengidentifikasi yang tidak valid

  2. Cara melihat badan Fungsi Tersimpan PL/SQL di Oracle

  3. Bagaimana cara menggunakan tipe tabel dalam pernyataan SELECT FROM?

  4. Hubungan terlarang akademi Oracle

  5. Aplikasi mogok saat berbicara dengan Oracle kecuali jalur yang dapat dieksekusi berisi spasi