Sebagian besar database perusahaan, termasuk Oracle, menggunakan pengoptimal berbasis biaya untuk menentukan rencana kueri yang sesuai untuk pernyataan SQL yang diberikan. Ini berarti pengoptimal menggunakan informasi tentang data untuk menentukan cara mengeksekusi kueri daripada mengandalkan aturan (inilah yang dilakukan oleh pengoptimal berbasis aturan yang lebih lama).
Misalnya, bayangkan sebuah tabel untuk aplikasi pelacakan bug sederhana
CREATE TABLE issues (
issue_id number primary key,
issue_text clob,
issue_status varchar2(10)
);
CREATE INDEX idx_issue_status
ON issues( issue_status );
Jika saya adalah perusahaan besar, saya mungkin memiliki 1 juta baris di tabel ini. Dari jumlah tersebut, 100 memiliki issue_status
dari ACTIVE, 10.000 memiliki issue_status
ANTRI, dan 989.900 berstatus LENGKAP. Jika saya ingin menjalankan kueri terhadap tabel untuk menemukan masalah aktif saya
SELECT *
FROM issues
WHERE issue_status = 'ACTIVE'
pengoptimal punya pilihan. Itu bisa menggunakan indeks di issue_status
lalu lakukan pencarian baris tunggal pada tabel untuk setiap baris dalam indeks yang cocok atau dapat melakukan pemindaian tabel pada issues
meja. Paket mana yang lebih efisien akan tergantung pada data yang ada di tabel. Jika Oracle mengharapkan kueri untuk mengembalikan sebagian kecil dari data dalam tabel, menggunakan indeks akan lebih efisien. Jika Oracle mengharapkan kueri untuk mengembalikan sebagian besar data dalam tabel, pemindaian tabel akan lebih efisien.
DBMS_STATS.GATHER_TABLE_STATS
adalah apa yang mengumpulkan statistik yang memungkinkan Oracle untuk membuat keputusan ini. Ini memberi tahu Oracle bahwa ada sekitar 1 juta baris dalam tabel, bahwa ada 3 nilai berbeda untuk issue_status
kolom, dan bahwa data tidak terdistribusi secara merata. Jadi Oracle tahu menggunakan indeks untuk kueri untuk menemukan semua masalah aktif. Tetapi ia juga mengetahui bahwa ketika Anda berbalik dan mencoba mencari semua masalah yang tertutup
SELECT *
FROM issues
WHERE issue_status = 'CLOSED'
bahwa akan lebih efisien untuk melakukan pemindaian tabel.
Mengumpulkan statistik memungkinkan rencana kueri berubah seiring waktu seiring dengan perubahan volume data dan distribusi data. Saat pertama kali menginstal pelacak masalah, Anda akan memiliki sedikit masalah SELESAI dan lebih banyak masalah AKTIF dan ANTRIAN. Seiring waktu, jumlah masalah SELESAI meningkat jauh lebih cepat. Saat Anda mendapatkan lebih banyak baris dalam tabel dan fraksi relatif dari baris yang ada dalam berbagai status berubah, rencana kueri akan berubah sehingga, di dunia ideal, Anda selalu mendapatkan rencana yang paling efisien.