Jika Anda pernah mencoba mempercepat query yang lambat, mungkin ada yang menyarankan Anda untuk “coba periksa rencana eksekusi saja.” Saran yang bagus, tetapi jika Anda belum pernah membacanya sebelumnya, hasilnya bisa terlihat seperti bahasa asing. Artikel ini akan menjelaskan apa itu rencana eksekusi, cara memahaminya, dan bagaimana alat-alat modern dapat mempermudah proses tersebut.
Apakah itu Rencana Eksekusi Query?
Saat Anda menjalankan query SQL, database Anda tidak langsung bertindak dan mulai memindai tabel secara acak. Sebaliknya, pengoptimal query—sebuah komponen yang terintegrasi dalam setiap mesin database utama—mengevaluasi puluhan atau bahkan ratusan strategi yang mungkin untuk mengambil data Anda, memperkirakan biaya masing-masing, dan memilih strategi yang dinilai paling cepat. Rencana eksekusi adalah catatan tertulis dari keputusan tersebut.
Ini mirip dengan rute GPS. Jika Anda meminta petunjuk untuk pergi dari A ke B, GPS akan menghitung urutan jalan terbaik yang harus dilalui; petunjuk arah belokan demi belokan yang diberikan kepada Anda adalah rencana tersebut. Memahami rencana tersebut memberi tahu Anda apakah Anda berada di jalan raya atau jalan tanah, dan yang lebih penting, di mana letak kemacetan.
Bagaimana Menghasilkan sebuah Rencana Eksekusi
Di sebagian besar database, Anda dapat menghasilkan rencana eksekusi dengan menambahkan kata kunci EXPLAIN di awal query Anda. MySQL, PostgreSQL, MariaDB, dan SQLite semuanya mendukung syntax ini, sedangkan SQL Server menggunakan perintah SET SHOWPLAN_ALL ON atau tombol rencana eksekusi grafis dalam antarmuka pengguna. Hasil yang ditampilkan bervariasi tergantung pada database, namun konsep dasarnya tetap konsisten di semua database tersebut.
Misalnya, menjalankan EXPLAIN SELECT * FROM orders WHERE customer_id = 42 tidak akan benar-benar menjalankan query tersebut. Sebaliknya, perintah ini akan mengembalikan deskripsi tentang bagaimana database bermaksud untuk menjalankannya. Anda kemudian dapat menggunakan deskripsi tersebut untuk memutuskan apakah diperlukan optimasi.
Hal-Hal Penting yang Perlu Diperhatikan
Rencana eksekusi mungkin terasa menakutkan pada awalnya karena menampilkan banyak informasi sekaligus. Untungnya, sebagian besar masalah kinerja muncul melalui beberapa tanda yang jelas:
Hal pertama yang perlu diperhatikan adalah pemindaian tabel penuh (full table scan), yang sering diberi label ALL di MySQL atau Seq Scan di PostgreSQL. Ini berarti database membaca setiap baris dalam sebuah tabel untuk menemukan baris yang dibutuhkan — sama seperti mencari seluruh buku di perpustakaan satu per satu daripada menggunakan katalog. Pada tabel kecil hal ini tidak berbahaya, tetapi pada tabel besar hampir selalu menjadi masalah.
Selanjutnya, perhatikan perkiraan jumlah baris. Perkiraan optimizer menentukan keputusannya, jadi ketika perkiraan tersebut jauh dari kenyataan, rencana yang dipilih mungkin tidak efisien. Perbedaan yang besar biasanya menandakan statistik yang usang, yang dapat Anda perbaiki dengan menjalankan perintah ANALYZE atau UPDATE STATISTICS tergantung pada database Anda.
Terakhir, perhatikan jenis join. Nested loop join bekerja dengan baik ketika salah satu sisi join berukuran kecil, sedangkan hash join lebih baik untuk kumpulan data yang lebih besar. Jika rencana memilih nested loop di dua tabel besar, menambahkan indeks yang sesuai atau merestrukturisasi query dapat meyakinkan pengoptimal untuk menggunakan strategi yang lebih efisien.
Membaca hasil EXPLAIN mentah dalam bentuk teks biasa membutuhkan latihan dan kesabaran. Navicat 17 mengatasi hal ini dengan fitur Visual Explain yang telah ditingkatkan secara signifikan, yang mengubah data rencana eksekusi menjadi representasi grafis, sehingga jauh lebih mudah dipahami sekilas.
Alih-alih mengurai baris-baris teks, Anda akan melihat rencana eksekusi ditampilkan sebagai alur visual, dengan setiap operasi ditampilkan sebagai sebuah node. Navicat menyoroti operasi yang memakan waktu atau tidak efisien, sehingga mata Anda langsung tertuju pada bagian rencana yang perlu diperhatikan — tanpa perlu menghitung secara mental! Bagi yang lebih suka bekerja dengan data mentah, Navicat juga menyajikan rencana yang sama dalam berbagai format: tampilan visual, JSON, teks, dan statistik semuanya tersedia, sehingga Anda dapat beralih di antara format tersebut sesuai kebutuhan.
Pendekatan multi-format ini sangat berguna saat Anda bekerja di berbagai platform database, karena setiap mesin memformat output EXPLAIN-nya secara berbeda. Navicat menstandarkan pengalaman tersebut sehingga, baik Anda bekerja dengan MySQL, PostgreSQL, atau database lain yang didukung, alur kerja untuk memeriksa rencana eksekusi tetap konsisten.
Pendekatan Praktis untuk Perencanaan Analisis
Cara terbaik untuk membangun kepercayaan diri dalam memahami rencana eksekusi adalah dengan memulai dari kueri yang sudah Anda pahami, menghasilkan rencananya, lalu menelusurinya langkah demi langkah. Tambahkan indeks dan jalankan EXPLAIN lagi. Anda akan melihat rencana tersebut berubah secara real-time, yang akan membantu Anda mengembangkan pemahaman intuitif tentang bagaimana pengoptimal merespons perubahan skema.
Seiring waktu, mengenali pemindaian tabel penuh atau perkiraan baris yang buruk akan menjadi hal yang wajar. Rencana eksekusi tidak lagi terasa seperti kumpulan data internal yang membingungkan, melainkan mulai terasa seperti apa adanya: penjelasan yang jelas tentang apa yang dilakukan basis data Anda dan mengapa.
Kesimpulan
Rencana eksekusi merupakan salah satu alat paling ampuh dalam perangkat kinerja seorang pengembang atau DBA — dan alat ini jauh lebih mudah dipahami daripada yang terlihat pada awalnya. Begitu Anda memahami seperti apa tampilan pemindaian tabel penuh, apa arti perkiraan jumlah baris, dan bagaimana perbedaan jenis join, Anda sudah memiliki sebagian besar hal yang dibutuhkan untuk mendiagnosis sebagian besar masalah kinerja query. Padukan pengetahuan tersebut dengan alat visual seperti visualisasi explain bawaan Navicat, dan Anda dapat beralih dari kebingungan ke diagnosis yang percaya diri dalam waktu yang jauh lebih singkat daripada yang Anda duga.

