Keluaran EXPLAIN PLAN adalah keluaran debug dari pengoptimal kueri Oracle. BIAYA adalah hasil akhir dari Pengoptimal Berbasis Biaya (CBO), yang tujuannya adalah untuk memilih yang mana dari banyak rencana berbeda yang mungkin harus digunakan untuk menjalankan kueri. CBO menghitung Biaya relatif untuk setiap paket, lalu memilih paket dengan biaya terendah.
(Catatan:dalam beberapa kasus, CBO tidak memiliki cukup waktu untuk mengevaluasi setiap rencana yang mungkin; dalam kasus ini, CBO hanya memilih rencana dengan biaya terendah yang ditemukan sejauh ini)
Secara umum, salah satu kontributor terbesar untuk kueri lambat adalah jumlah baris yang dibaca untuk melayani kueri (memblokir, lebih tepatnya), sehingga biayanya akan didasarkan sebagian pada jumlah baris perkiraan pengoptimal perlu dibaca.
Misalnya, katakanlah Anda memiliki kueri berikut:
SELECT emp_id FROM employees WHERE months_of_service = 6;
(months_of_service
kolom memiliki batasan NOT NULL di atasnya dan indeks biasa di atasnya.)
Ada dua paket dasar yang mungkin dipilih oleh pengoptimal di sini:
- Rencana 1:Baca semua baris dari tabel "karyawan", untuk setiap baris, periksa apakah predikatnya benar (
months_of_service=6
). - Rencana 2:Baca indeks di mana
months_of_service=6
(ini menghasilkan satu set ROWID), lalu akses tabel berdasarkan ROWID yang dikembalikan.
Bayangkan tabel "karyawan" memiliki 1.000.000 (1 juta) baris. Mari kita bayangkan lebih jauh bahwa nilai untuk month_of_service berkisar dari 1 hingga 12 dan didistribusikan secara merata untuk beberapa alasan.
Biaya Paket 1 , yang melibatkan FULL SCAN, akan menjadi biaya membaca semua baris dalam tabel karyawan, yang kira-kira sama dengan 1.000.000; tetapi karena Oracle akan sering dapat membaca blok menggunakan pembacaan multi-blok, biaya sebenarnya akan lebih rendah (tergantung pada bagaimana database Anda diatur) - mis. mari kita bayangkan jumlah pembacaan multi-blok adalah 10 - biaya yang dihitung dari pemindaian penuh adalah 1.000.000 / 10; Biaya keseluruhan =100.000.
Biaya Paket 2 , yang melibatkan INDEX RANGE SCAN dan pencarian tabel oleh ROWID, akan menjadi biaya pemindaian indeks, ditambah biaya mengakses tabel dengan ROWID. Saya tidak akan membahas bagaimana pemindaian rentang indeks dihitung biayanya, tetapi mari kita bayangkan biaya pemindaian rentang indeks adalah 1 per baris; kami berharap menemukan kecocokan dalam 1 dari 12 kasus, jadi biaya pemindaian indeks adalah 1.000.000 / 12 =83.333; ditambah biaya mengakses tabel (asumsikan 1 blok baca per akses, kami tidak dapat menggunakan pembacaan multi-blok di sini) =83.333; Biaya keseluruhan =166.666.
Seperti yang Anda lihat, biaya Paket 1 (pemindaian penuh) KURANG dari biaya Paket 2 (pemindaian indeks + akses oleh rowid) - yang berarti CBO akan memilih pemindaian LENGKAP.
Jika asumsi yang dibuat oleh pengoptimal di sini benar, maka sebenarnya Paket 1 akan lebih disukai dan jauh lebih efisien daripada Paket 2 - yang menyangkal mitos bahwa pemindaian LENGKAP "selalu buruk".
Hasilnya akan sangat berbeda jika tujuan pengoptimal adalah FIRST_ROWS(n) alih-alih ALL_ROWS - dalam hal ini pengoptimal akan menyukai Paket 2 karena sering kali akan mengembalikan beberapa baris pertama lebih cepat, dengan biaya kurang efisien untuk keseluruhan kueri .