Dalam artikel ini, kita akan melihat bagaimana indeks dapat meningkatkan kinerja kueri.
Pengantar
Indeks di Oracle dan database lainnya adalah objek yang menyimpan referensi ke data di tabel lain. Mereka digunakan untuk meningkatkan kinerja kueri, paling sering pernyataan SELECT.
Mereka bukan "peluru perak" - mereka tidak selalu memecahkan masalah kinerja dengan pernyataan SELECT. Namun, mereka pasti bisa membantu.
Mari kita pertimbangkan ini pada contoh tertentu.
Contoh
Untuk contoh ini, kita akan menggunakan satu tabel bernama Pelanggan yang berisi kolom seperti ID, Nama Depan, Nama Belakang, nilai kredit maksimum, nilai tanggal pembuatan, dan kolom lain yang tidak akan kita gunakan.
SELECT customer_id,first_name,last_name, max_credit, created_date FROM customer;
Ini contoh tabelnya.
[id tabel=38 /]
Sekarang, kita akan menemukan yang berikut:
- Siapa klien yang ditambahkan ke tabel pada tanggal yang sama dengan pelanggan pertama
- Klien difilter menurut nama_belakang dalam urutan menaik
- Menampilkan ID pelanggan, Nama Depan, Nama Belakang, kredit maksimal, dan tanggal pembuatan
Untuk melakukannya, buat kueri berikut:
SELECT customer_id, first_name, last_name, max_credit, created_date FROM customer WHERE created_date = ( SELECT MIN(created_date) FROM customer ) ORDER BY last_name;
Outputnya terlihat seperti ini:
[id tabel=39 /]
Ini menunjukkan data yang kita inginkan.
Kinerja sebelum Indeks Diterapkan
Sekarang, mari kita lihat rencana penjelasan untuk kueri ini. Saya memperoleh ini dengan menjalankan EXPLAIN PLAN FOR untuk pernyataan SELECT dan perintah berikut:
SELECT * FROM TABLE(dbms_xplan.display);
Anda juga bisa mendapatkan hasil keluaran yang serupa menggunakan fitur Explain Plan di dalam IDE Anda.
Kita dapat melihat bahwa ia melakukan Akses Tabel Penuh di dua titik, yaitu di subquery dan di kueri luar. Ini karena tidak ada indeks pada tabel yang akan digunakan.
Ini memiliki biaya 2934. Ketika saya menjalankannya, kueri mengambil 785 baris dalam 1,9 detik. Ini mungkin terlihat cepat, tetapi ini hanyalah contoh yang dapat kami tingkatkan. Kueri dalam sistem nyata bisa memakan waktu lebih lama.
Salah satu cara kami dapat meningkatkan kinerja kueri ini adalah dengan menambahkan indeks ke kolom Created_date. Kolom ini digunakan baik dalam klausa WHERE dari kueri luar dan dalam fungsi MIN dari kueri dalam.
Tambahkan Indeks
Kami dapat menambahkan indeks ke tabel ini untuk meningkatkan kinerja kueri. Index ini akan disimpan pada kolom create_date sehingga kodenya akan terlihat seperti ini:
CREATE INDEX idx_cust_cdate ON customer (created_date);
Sekarang, indeks dibuat hanya pada kolom ini. Ini akan memberi kami peningkatan kinerja dalam kueri kami, tetapi kami harus memeriksanya terlebih dahulu.
Kami telah membuat indeks b-tree, yang mungkin hanya itu yang kami butuhkan di kolom ini. Kami akan segera mengonfirmasinya dalam rencana penjelasan. Saya telah menulis panduan tentang indeks Oracle termasuk cara mengetahui jenis indeks apa yang akan digunakan, serta banyak informasi berharga lainnya.
Kinerja Setelah Indeks Ditambahkan
Mari kita jalankan kembali rencana penjelasan pada kueri ini.
Kita dapat melihat bahwa indeks telah digunakan pada langkah terakhir. Ini menunjukkan bahwa Pemindaian Penuh telah dijalankan dengan indeks idx_cust_cdate, yang baru saja kita buat.
Ini juga menunjukkan biaya keseluruhan 1472 dan mengambil 785 catatan dalam 0,9 detik.
Waktu proses hanya sedikit meningkat (dari 1,9 menjadi 0,9 detik), tetapi itu meningkat sekitar 50% hanya dengan menambahkan indeks ke kumpulan data kecil ini.
Seperti disebutkan sebelumnya, kueri nyata akan lebih rumit daripada yang ini dan akan membutuhkan lebih banyak waktu untuk dieksekusi. Namun, ini adalah contoh bagaimana indeks dapat meningkatkan rencana kueri dan waktu proses kueri.