Traffine I/O

Bahasa Indonesia

2023-03-14

Cost-Based Optimizer (CBO)

Apa itu Cost-Based Optimizer (CBO)

Cost-Based Optimizer (CBO) dalam sebuah database adalah komponen penting yang bertanggung jawab untuk merancang metode paling efisien, yang dikenal sebagai rencana eksekusi, untuk menjalankan kueri SQL. CBO menggunakan berbagai strategi dan faktor untuk mendapatkan rencana eksekusi optimal, memastikan database berperforma terbaik selama proses kueri.

Prinsip Rencana Eksekusi yang Efisien

Untuk menciptakan rencana eksekusi yang efisien, CBO sangat bergantung pada informasi statistik yang paling mutakhir. Hal ini mencakup data tentang tabel, indeks, dan struktur database lainnya yang digunakan dalam kueri. Dengan mengevaluasi berbagai kemungkinan, CBO menghitung 'biaya' - suatu ukuran efisiensi - untuk setiap rencana, dan akhirnya memilih rencana dengan biaya terendah.

Peran Indeks dan Volume Data

Dalam proses optimisasi berbasis biaya, informasi seperti indeks dan volume data memainkan peran penting. Optimizer menggunakan indeks untuk mempercepat pengambilan data, dan volume data memberikan konteks tentang seberapa banyak data yang perlu diproses oleh rencana eksekusi. Pemahaman mendalam tentang elemen-elemen ini dapat membantu CBO membuat keputusan yang lebih efektif dalam membangun rencana eksekusi.

Informasi Statistik dalam CBO

CBO membutuhkan berbagai informasi statistik agar dapat berfungsi secara efektif. Contoh statistik tersebut meliputi jenis data kolom, volume data, jumlah catatan, indeks dan batasan yang ada pada tabel, serta kardinalitas yang menunjukkan tingkat variasi dalam data.

Jenis Data Kolom, Volume Data, dan Jumlah Catatan

Jenis data kolom, volume data, dan jumlah catatan merupakan informasi statistik penting yang berkontribusi dalam pembangunan rencana eksekusi yang efisien. Misalnya, mengetahui jenis data dari suatu kolom dapat membantu optimizer memilih operasi yang tepat, sedangkan pemahaman tentang volume data dan jumlah catatan dapat membantu perkiraan biaya pembacaan dan pemrosesan data.

Indeks, Batasan, dan Kardinalitas

Indeks dan batasan adalah elemen-elemen penting yang mempengaruhi jalur akses yang mungkin dipilih oleh optimizer untuk sebuah kueri. Misalnya, optimizer dapat menggunakan indeks untuk mempercepat akses data, sedangkan batasan dapat mempengaruhi urutan penggabungan yang dipilih oleh optimizer. Selain itu, kardinalitas atau keunikan data juga memainkan peran penting dalam menentukan biaya operasi yang berbeda.

Pengumpulan Informasi Statistik

Pengumpulan Otomatis vs. Manual

Informasi statistik untuk tabel sering dikumpulkan secara otomatis oleh sistem database. Proses otomatis ini memastikan bahwa optimizer memiliki statistik yang paling mutakhir untuk membuat keputusan berdasarkan data terkini dalam merumuskan rencana eksekusi terbaik untuk sebuah kueri.

Namun, ada situasi di mana proses pengumpulan otomatis tidak mencerminkan perubahan terbaru dalam data, misalnya ketika terjadi peningkatan tiba-tiba dalam volume data pada sebuah tabel. Dalam hal tersebut, pengumpulan statistik secara manual menjadi perlu.

Situasi untuk Pengumpulan Manual

Peningkatan signifikan dalam volume data atau perubahan dalam distribusi data dapat memerlukan pengumpulan statistik secara manual. Pembaruan statistik secara manual memastikan bahwa optimizer dapat secara efektif membuat rencana eksekusi yang efisien berdasarkan keadaan terkini dari data.

MySQL dan PostgreSQL: Perintah untuk Mengumpulkan dan Melihat Statistik

Baik di MySQL maupun PostgreSQL, Anda dapat menggunakan perintah-perintah tertentu untuk mengumpulkan dan melihat informasi statistik. Perintah-perintah tersebut dapat bervariasi tergantung pada database yang digunakan.

Perintah untuk Mengumpulkan Informasi Statistik

Di MySQL, Anda dapat secara manual mengumpulkan statistik tabel menggunakan perintah ANALYZE TABLE. Berikut ini contohnya:

sql
ANALYZE TABLE nama_tabel_anda;

Perintah ini memperbarui distribusi kunci untuk tabel yang ditentukan. Sebagai contoh keluaran, Anda mungkin melihat sesuatu seperti ini:

sql
+----------------+---------+----------+----------+
| Table          | Op      | Msg_type | Msg_text |
+----------------+---------+----------+----------+
| your_database.your_table_name | analyze | status   | OK       |
+----------------+---------+----------+----------+

Di PostgreSQL, Anda dapat menggunakan perintah ANALYZE untuk tujuan yang sama:

sql
ANALYZE nama_tabel_anda;

Perintah ini tidak mengembalikan output kepada pengguna, namun memperbarui statistik tabel di katalog sistem.

Perintah untuk Melihat Informasi Statistik Tabel

Di MySQL, Anda dapat melihat informasi statistik tabel menggunakan perintah SHOW TABLE STATUS:

sql
SHOW TABLE STATUS LIKE 'nama_tabel_anda';

Ini akan menampilkan satu baris informasi untuk tabel yang ditentukan, termasuk jumlah baris, panjang data, panjang indeks, dan lain-lain.

Di PostgreSQL, Anda dapat menggunakan kueri berikut untuk melihat informasi statistik tabel:

sql
SELECT * FROM pg_stat_user_tables WHERE relname = 'nama_tabel_anda';

Ini akan menampilkan satu baris informasi untuk tabel yang ditentukan, termasuk jumlah pemindaian sekuensial dan pemindaian indeks, jumlah baris yang dimasukkan, diperbarui, dihapus, dan lain-lain.

Perintah untuk Melihat Informasi Statistik Indeks

Di MySQL, Anda dapat melihat statistik indeks dengan perintah SHOW INDEX:

sql
SHOW INDEX FROM nama_tabel_anda;

Perintah ini mengembalikan daftar semua indeks untuk tabel yang ditentukan beserta karakteristiknya.

Di PostgreSQL, Anda dapat melihat statistik indeks dengan perintah berikut:

sql
SELECT * FROM pg_stat_user_indexes WHERE relname = 'nama_tabel_anda';

Ini akan memberikan Anda berbagai detail tentang indeks pada tabel yang ditentukan, termasuk jumlah pemindaian indeks, baris yang dibaca, dan baris yang diambil.

Rencana Eksekusi

Rencana eksekusi adalah peta rinci yang digunakan oleh database SQL untuk mengambil data. Rencana ini menjelaskan langkah-langkah spesifik dan urutan operasi yang akan digunakan oleh database untuk menjalankan kueri SQL. Optimisasi berbasis biaya bertanggung jawab dalam menghasilkan rencana ini.

Penggunaan Pernyataan SQL EXPLAIN

Pernyataan SQL EXPLAIN adalah alat yang powerful untuk memahami bagaimana kueri SQL akan dieksekusi tanpa benar-benar menjalankan kueri tersebut. Dengan menambahkan kata kunci EXPLAIN sebelum kueri SQL, database akan mengembalikan representasi dari rencana eksekusi yang akan digunakan untuk menjalankan kueri tersebut. Hal ini sangat membantu dalam menemukan masalah kinerja, karena Anda dapat melihat langkah-langkah yang akan diambil oleh database tanpa harus menjalankan kueri yang mungkin berjalan lambat.

sql
EXPLAIN SELECT * FROM nama_tabel_anda;

Keluaran akan menunjukkan langkah-langkah yang terlibat dalam eksekusi kueri, seperti apakah akan dilakukan pemindaian penuh tabel atau pemindaian indeks.

Penggunaan Pernyataan SQL EXPLAIN ANALYZE

EXPLAIN ANALYZE adalah variasi dari perintah EXPLAIN yang menjalankan kueri dan memberikan statistik eksekusi tambahan, seperti waktu eksekusi dan jumlah baris yang diproses sebenarnya pada setiap langkah kueri. Perintah ini sangat berguna untuk menentukan biaya sebenarnya dari sebuah kueri.

sql
EXPLAIN ANALYZE SELECT * FROM nama_tabel_anda;

Keluaran akan mencakup operasi yang direncanakan beserta waktu eksekusi dan jumlah baris yang diproses.

Menafsirkan Rencana Eksekusi

  • Kardinalitas
    Kardinalitas merujuk pada jumlah nilai unik dalam dataset atau kolom. Dalam rencana eksekusi, kardinalitas dapat memberikan gambaran tentang berapa banyak baris yang akan diambil oleh setiap operasi. Kardinalitas yang tinggi berarti ada banyak nilai unik, yang dapat menghasilkan penggunaan indeks yang lebih efisien.

  • Waktu Eksekusi (Waktu Aktual)
    Dalam rencana eksekusi yang dihasilkan dari perintah EXPLAIN ANALYZE, Anda dapat melihat waktu aktual yang diperlukan untuk menjalankan setiap langkah kueri. Informasi ini dapat membantu mengidentifikasi bottleneck dalam rencana eksekusi.

  • Metode Akses
    Rencana eksekusi juga akan mendetailkan metode yang digunakan oleh database untuk mengakses data. Ini bisa berupa pemindaian penuh tabel, di mana database membaca semua baris dalam tabel, atau pemindaian indeks, di mana database menggunakan indeks untuk dengan cepat menemukan baris yang diperlukan.

  • Metode dan Urutan Gabungan
    Jika sebuah kueri melibatkan penggabungan beberapa tabel, rencana eksekusi akan mendetailkan metode gabungan (seperti hash, sort-merge, atau nested loop) dan urutan penggabungan tabel. Pilihan metode dan urutan gabungan dapat berdampak signifikan pada efisiensi kueri.

  • Partitioning
    Jika sebuah tabel dipartisi, rencana eksekusi dapat menunjukkan apakah dan bagaimana kueri menggunakan partitioning ini. Partitioning seringkali dapat meningkatkan kinerja kueri dengan mengurangi jumlah data yang perlu dipindai.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!