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.