Optimasi Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu

  1. Beranda
  2. Blog
  3. Database & SQL

Database & SQL

Pengoptimalan Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu

Berhentilah menebak mengapa kueri lambat. Belajar membaca rencana eksekusi, lalu terapkan perbaikan yang paling penting, dengan pengukuran sebelum dan sesudah dari tabel nyata yang terdiri dari satu juta baris.

9 menit baca
Pengoptimalan kueri SQL: membaca rencana eksekusi dan memperbaiki kueri yang lambat, dengan pengaturan waktu

Poin penting

  • Mulailah dengan rencana eksekusi. Ini memberi tahu Anda apa yang sebenarnya dilakukan database.
  • Cari pemindaian penuh pada tabel besar, lalu tambahkan indeks yang cocok dengan filter Anda dan gabung.
  • Hindari menggabungkan kolom yang diindeks ke dalam suatu fungsi, karena hal ini dapat menghentikan penggunaan indeks yang efisien.
  • Ukur sebelum dan sesudahnya, karena setiap database dan kumpulan data berperilaku berbeda.

Kueri yang memerlukan waktu milidetik pada tahun lalu dapat memerlukan waktu beberapa menit saat ini, hanya karena tabelnya bertambah. Pengoptimalan kueri SQL bukan tentang trik cerdas dan lebih banyak tentang proses yang berulang: cari tahu apa yang dilakukan database, hapus pekerjaan yang terbuang, dan periksa apakah itu membantu.

Kami menguji setiap teknik di bawah ini pada satu juta baris yang dihasilkan di SQLite 3.50. Pengaturan waktu adalah yang terbaik dari beberapa proses yang dijalankan dari satu laptop, menggunakan database dalam memori. Mereka tidak akan cocok dengan sistem Anda, dan PostgreSQL, MySQL, dan SQL Server masing-masing memiliki pengoptimal dan format paketnya sendiri. Fokus pada ukuran setiap perbaikan dan prinsip di baliknya.

Sekilas tentang hasil

Teknik Sebelumnya Setelah
Indeks pada kolom filter 73 ms 0,01 ms
Rentang, bukan fungsi pada kolom 96 mdtk 33 ms
Indeks komposit untuk dua filter 19 ms 2,2 ms
Keyset daripada OFFSET yang dalam 8,1 ms 0,01 ms

Pengaturan tes

CREATE TABLE customers (
  id INTEGER PRIMARY KEY, name TEXT, city TEXT
);
CREATE TABLE orders (
  id INTEGER PRIMARY KEY, customer_id INT, status TEXT,
  created TEXT, total INT, note TEXT
);
-- 50,000 customers and 1,000,000 orders with random values

Proses optimasi sederhana

  1. Temukan kueri yang penting. Gunakan log atau pemantauan kueri yang lambat. Kueri 200 ms yang dijalankan seribu kali per menit mungkin lebih penting daripada laporan bulanan 10 detik.
  2. Baca rencananya. Lihat apa yang sebenarnya dilakukan database.
  3. Ubah satu hal. Tambahkan indeks atau tulis ulang bagian kueri.
  4. Ukur lagi, pada data realistis. Rencana untuk 100 baris pengujian memberi tahu Anda sedikit tentang satu juta.
  5. Perhatikan seiring berjalannya waktu. Rencana dapat berubah seiring bertambahnya data dan perubahan statistik.

Baca rencana eksekusi

Rencana eksekusi adalah strategi langkah demi langkah database untuk menjalankan kueri, termasuk indeks mana yang digunakan dan urutan penggabungan tabel. Awali kueri untuk melihatnya:

Basis data Perintah
SQLite JELASKAN PILIHAN RENCANA QUERY...
PostgreSQL JELASKAN ANALISIS PILIHAN...
MySQL EXPLAIN SELECT ..., atau EXPLAIN ANALYZE
SQLServer Rencana Eksekusi Aktual di SSMS

Perhatikan bahwa EXPLAIN ANALYZE di PostgreSQL benar-benar menjalankan kueri, jadi berhati-hatilah saat menggunakannya dengan UPDATE atau DELETE. Inilah yang harus dicari terlebih dahulu:

Anda lihat Artinya Biasanya
Pindai atau Seq Pindai Membaca seluruh tabel Kekhawatiran pada tabel besar
Pencarian atau Pencarian Indeks Melompat ke baris yang cocok Bagus
Meliputi indeks Dijawab dari indeks saja Sangat bagus
Temp B-tree atau Sortir Pekerjaan penyortiran ekstra Layak untuk diperiksa

Pemindaian penuh tidak otomatis buruk. Jika kueri memerlukan sebagian besar tabel kecil, pemindaian bisa menjadi pilihan tercepat. Di EXPLAIN ANALYZE PostgreSQL, bandingkan juga baris perkiraan dengan baris sebenarnya. Perbedaan besar sering kali berarti statistik tabel sudah ketinggalan zaman.

Tambahkan indeks yang tepat

Kueri ini menemukan pesanan satu pelanggan:

SELECT id, total FROM orders WHERE customer_id = 123;

Sebelum menambahkan indeks, rencananya adalah pemindaian penuh:

SCAN orders
-- 20 rows in 73 ms

Kemudian kami menambahkan indeks pada kolom filter:

CREATE INDEX idx_orders_customer ON orders(customer_id);

SEARCH orders USING INDEX idx_orders_customer (customer_id=?)
-- 20 rows in 0.01 ms

20 baris yang sama muncul ribuan kali lebih cepat, karena database tidak lagi membaca satu juta baris untuk menemukannya. Tidak ada teknik lain dalam artikel ini yang memberi kami kemenangan lebih besar. Kandidat pertama yang baik adalah kolom yang digunakan di WHERE, JOIN dan ORDER BY, terutama ketika kolom tersebut mempersempit hasilnya menjadi beberapa baris. Panduan kami untuk indeks SQL menjelaskan cara kerjanya.

Jangan bungkus kolom yang diindeks dalam fungsi

Berikut dua cara untuk menemukan pesanan bulan Maret, dengan indeks pada created:

-- Function on the column
SELECT id FROM orders WHERE substr(created, 1, 7) = '2026-03';
-- SCAN orders USING COVERING INDEX idx_orders_created
-- 84,961 rows in 96 ms

-- Plain range
SELECT id FROM orders
WHERE created >= '2026-03-01' AND created < '2026-04-01';
-- SEARCH orders USING COVERING INDEX idx_orders_created (created>? AND created<?)
-- 84,961 rows in 33 ms

Keduanya menghasilkan baris yang sama, namun baris pertama membutuhkan waktu sekitar tiga kali lebih lama. Rencana tersebut menunjukkan alasannya: dengan fungsi pada kolom, database tidak dapat melompat ke posisi dalam indeks yang diurutkan, sehingga harus SCAN menelusuri setiap entri. Versi rentang dapat SEARCH langsung ke tempat yang tepat. Kondisi yang dapat menggunakan indeks dengan cara ini disebut sargable.

Masalah yang sama muncul dengan pola umum berikut:

Hindari Lebih suka
DIMANA TAHUN(dibuat) = 2026 DIMANA dibuat >= '01-01-2026' DAN dibuat < '01-01-2027'
DIMANA harga *2 > 100 DIMANA harga > 50
DIMANA RENDAH(email) = 'a@b.com' Indeks berbasis fungsi, atau susunan yang tidak peka huruf besar-kecil
DIMANA nama SEPERTI '%99' Pencarian awalan, atau pencarian teks lengkap

Kami memeriksa yang terakhir juga. Wildcard terdepan dihasilkan SCAN customers, karena indeks yang diurutkan dari huruf pertama tidak dapat membantu kecocokan di akhir.

Indeks komposit

Saat kueri memfilter pada dua kolom, indeks satu kolom hanya melakukan sebagian pekerjaan:

SELECT id FROM orders
WHERE status = 'paid'
  AND created >= '2026-03-01' AND created < '2026-03-08';

-- Using only the created index: 6,198 rows in 19 ms

CREATE INDEX idx_status_created ON orders(status, created);

-- SEARCH orders USING COVERING INDEX idx_status_created
--   (status=? AND created>? AND created<?)
-- 6,198 rows in 2.2 ms

Urutan kolom sangat penting. Indeks pada (status, created) berfungsi seperti buku telepon yang diurutkan berdasarkan nama belakang dan kemudian nama depan. Anda dapat mencari nama keluarga saja, tetapi tidak hanya nama depan saja. Permintaan kami pada status saja dapat menggunakan indeks ini. Memfilter pada created saja umumnya tidak dapat menggunakannya secara efisien. Sebagai aturan praktis, letakkan kolom yang diuji dengan kesetaraan terlebih dahulu dan kolom rentang setelahnya.

Rencana tersebut juga menyatakan mencakup indeks, artinya indeks menampung semua kueri yang diperlukan, sehingga tabel itu sendiri tidak perlu dibaca. Memilih hanya kolom yang Anda perlukan membuat hal ini lebih mungkin terjadi, yang merupakan alasan lain untuk dihindari SELECT *.

Penomoran halaman lebih cepat

Menggunakan OFFSET untuk halaman dalam adalah biaya tersembunyi, karena database masih harus melewati semua baris yang dilewati:

-- Page deep into the results
SELECT id FROM orders ORDER BY id LIMIT 20 OFFSET 500000;
-- 8.1 ms

-- Keyset pagination: continue from the last id seen
SELECT id FROM orders WHERE id > 500000 ORDER BY id LIMIT 20;
-- 0.01 ms

Penomoran halaman keyset tetap cepat tidak peduli seberapa dalam Anda melakukannya. Ini juga menghindari perpindahan baris antar halaman saat data baru ditambahkan. Kerugiannya adalah pengguna tidak dapat langsung membuka halaman 5.000, yang jarang merupakan kebutuhan nyata. Pada tabel dengan baris yang lebar, atau dengan lebih banyak baris yang harus dilewati, jaraknya bisa jauh lebih besar dibandingkan dengan pengujian kami.

Kiat: Pengaturan waktu kami mengukur satu kueri pada satu waktu pada mesin yang menganggur. Di bawah beban sebenarnya, kueri yang tidak efisien menimbulkan lebih banyak kerusakan, karena kueri tersebut juga mengunci dan bersaing memperebutkan memori, disk, dan CPU dengan yang lainnya.

Tulis pertanyaan yang lebih ramping

  • Pilih hanya kolom yang Anda perlukan. SELECT * mengirimkan lebih banyak data, dan ini dapat mencegah indeks menutupi kueri.
  • Filter lebih awal. Gunakan WHERE untuk menghapus baris sebelum mengelompokkan, dan HAVING hanya untuk kondisi agregat. Lihat SQL GROUP BY dan HAVING.
  • Gunakan LIMIT bila Anda hanya memerlukan beberapa baris.
  • Pilih UNION ALL bila Anda tidak perlu menghapus duplikat. Pengujian UNION vs UNION ALL kami menunjukkan apa yang dapat dihemat.
  • Hindari DISTINCT yang tidak perlu. Seringkali menyembunyikan gabungan yang menghasilkan duplikat.
  • Gunakan EXISTS untuk pemeriksaan keberadaan. Ini bisa berhenti pada kecocokan pertama, seperti yang dijelaskan dalam panduan kami untuk subkueri SQL.
  • Perhatikan N+1 kueri. Satu kueri per baris dalam satu loop, biasanya disebabkan oleh kode aplikasi, sering kali merupakan masalah sebenarnya. Satu kueri gabungan atau kumpulan dapat menggantikan ratusan perjalanan bolak-balik.

Bergabung

Indeks kolom tempat Anda bergabung. Kami menjalankan laporan total pembelanjaan untuk pelanggan di satu kota, dan rencana tersebut sesuai dengan harapan Anda:

SELECT c.name, SUM(o.total)
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE c.city = 'Goa'
GROUP BY c.id;

-- SCAN c
-- SEARCH o USING COVERING INDEX idx_cover (customer_id=?)
-- 9,900 rows in 34 ms

Ini memindai pelanggan, lalu menggunakan indeks untuk menemukan pesanan masing-masing. Tanpa indeks pada orders.customer_id, database harus melakukan lebih banyak pekerjaan untuk setiap pelanggan. Indeks pada kunci asing adalah salah satu tambahan paling umum dan berharga yang dapat Anda buat. Untuk menyegarkan kembali pemahaman Anda tentang dasar-dasarnya, lihat penjelasan gabungan SQL.

Ketika indeks merugikan Anda

Indeks tidak gratis, jadi jangan tambahkan satu indeks untuk setiap kolom:

  • Penulisan lebih lambat. Setiap penyisipan, pembaruan, dan penghapusan juga harus memperbarui setiap indeks.
  • Lebih banyak penyimpanan dan memori. Indeks dapat bertambah besar di tabel besar.
  • Sedikit manfaat pada kolom yang tidak selektif. Indeks pada kolom benar atau salah mungkin tidak membantu jika sebagian besar baris cocok.
  • Redundansi. Indeks pada (a) sering kali tidak diperlukan jika Anda sudah memilikinya di (a, b).

Periksa statistik penggunaan secara berkala, dan hapus indeks yang tidak ada gunanya. Dan selalu perbarui statistik dengan ANALYZE atau database Anda yang setara, karena pengoptimal mengandalkan statistik tersebut untuk memilih paket yang baik. Terkadang bagian yang lambat adalah pertikaian, bukan pertanyaan. Penguncian transaksi yang berjalan lama dapat membuat kueri cepat terasa lambat.

Kesalahan umum

  • Mengoptimalkan tanpa mengukur. Banyak tebakan yang meyakinkan ternyata salah.
  • Menguji dengan data kecil. Rencana dan waktu berubah secara dramatis seiring bertambahnya tabel.
  • Mempercayai tip untuk database lain. Saran untuk satu mesin mungkin tidak berlaku untuk mesin lainnya.
  • Menambahkan indeks secara membabi buta. Masing-masing memperlambat penulisan.
  • Mengabaikan efek pengoperasian pertama. Cache membuat pengoperasian kedua lebih cepat, jadi jalankan beberapa kali.

Penutup

Sebagian besar kueri lambat memiliki penyebab biasa: indeks hilang, fungsi pada kolom, atau terlalu banyak data yang diambil. Ambil kueri nyata Anda yang paling lambat minggu ini, jalankan EXPLAIN di atasnya, dan cari pemindaian penuh pada tabel besar. Perbaiki satu hal, ukur lagi, dan catat apa yang Anda ubah.

Pertanyaan yang sering diajukan

Apa itu optimasi kueri SQL?

Ini adalah proses membuat kueri menggunakan lebih sedikit waktu dan sumber daya, biasanya dengan memeriksa rencana eksekusi, menambahkan indeks yang sesuai, dan menulis ulang kueri yang tidak efisien.

Apa yang dimaksud dengan rencana eksekusi?

Ini adalah strategi yang dipilih database untuk menjalankan kueri, termasuk cara database membaca tabel, indeks apa yang digunakan, dan urutan penggabungannya.

Bagaimana cara menemukan pertanyaan yang lambat?

Aktifkan log kueri lambat database Anda atau gunakan alat seperti pg_stat_statements di PostgreSQL. Kemudian fokus pada kueri dengan total waktu tertinggi.

Apakah menambahkan indeks selalu membuat kueri lebih cepat?

Tidak. Ini membantu pembacaan selektif tetapi memperlambat penulisan dan menggunakan penyimpanan. Pengoptimal juga dapat mengabaikannya jika sebagian besar baris cocok dengan kondisi tersebut.

Apakah SELECT * buruk untuk kinerja?

Itu bisa saja. Ini mentransfer data yang tidak diperlukan dan dapat menghentikan indeks untuk mencakup kueri. Biasanya lebih baik hanya mencantumkan kolom yang Anda perlukan.

Teruslah belajar

Bekerja dengan Stack Quora

Butuh bantuan dengan pengujian, WordPress atau SEO?

Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.

Teruslah membaca

Panduan lebih lanjut tentang pengujian, AI & pengembangan modern

Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.

Kecerdasan buatan

Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya

Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…

Baca artikel →
DevOps

Penjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar

Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan

Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…

Baca artikel →
Otomatisasi pengujian

Mengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong

Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…

Baca artikel →
Pengujian perangkat lunak

Penjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya

Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…

Baca artikel →
Basis data & SQL

DELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing

DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…

Baca artikel →
Basis data & SQL

Penjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh

Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…

Baca artikel →
Pengembangan perangkat lunak

Antarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler

Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas

Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…

Baca artikel →
Pengembangan perangkat lunak

Fungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan

Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…

Baca artikel →
Kecerdasan buatan

Apa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan

Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…

Baca artikel →
DevOps

Pemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak

Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…

Baca artikel →
DevOps

Volume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar

Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…

Baca artikel →
Otomatisasi pengujian

TDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing

TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…

Baca artikel →
Pengujian perangkat lunak

User Acceptance Testing (UAT): Proses, Checklist dan Contoh Nyata

Pengujian penerimaan pengguna menjelaskan: siapa yang menjalankannya, perbedaannya dengan QA, proses tujuh langkah, templat kasus uji UAT, daftar pe…

Baca artikel →
Basis data & SQL

Penjelasan Nilai NULL SQL: IS NULL, COALESCE, NULLIF dan Jebakan yang Harus Dihindari

Nilai SQL NULL dijelaskan dengan kueri yang kami jalankan: logika tiga nilai, IS NULL, COALESCE, NULLIF, cara agregat, penggabungan, dan pengurutan …

Baca artikel →
Basis data & SQL

Pernyataan SQL CASE WHEN: Sintaks, Contoh Nyata dan Kesalahan Umum

SQL CASE KETIKA dijelaskan dengan kueri yang kami jalankan: formulir sederhana dan dicari, urutan kondisi, pivot dengan SUM, trik COUNT, pengurutan …

Baca artikel →
Pengembangan perangkat lunak

Apa itu JWT? Token Web JSON Dijelaskan Dengan Contoh Kerja

Apa itu JWT? JSON Web Tokens menjelaskan: tiga bagian, token yang dibuat dan dirusak dalam kode yang kami jalankan, sesi JWT vs, penyimpanan, token …

Baca artikel →
Pengembangan perangkat lunak

Penjelasan Loop Acara JavaScript: Call Stack, Microtasks, dan Timer Dengan Contoh

Perulangan peristiwa JavaScript dijelaskan dengan kode yang kami jalankan: tumpukan panggilan, antrian tugas dan tugas mikro, mengapa setTimeout 0 t…

Baca artikel →
Pengembangan perangkat lunak

Generator Python dan Penjelasan Hasil: Menghemat Memori Dengan Contoh Nyata

Generator dan hasil Python dijelaskan dengan kode yang kami jalankan: bagaimana mereka menjeda dan melanjutkan, mengukur penghematan memori, saluran…

Baca artikel →
Kecerdasan buatan

Apa itu Embedding? Kesamaan Vektor dan Kosinus Dijelaskan Secara Sederhana

Apa itu embeddings? Panduan bahasa sederhana tentang vektor, kesamaan kosinus, dan penelusuran semantik, dengan contoh kecil yang kami jalankan, pen…

Baca artikel →
DevOps

Penerapan Biru-Hijau vs Canary: Perbedaan, Kompromi, dan Cara Memilih

Penjelasan penerapan blue-green vs canary: cara kerja masing-masing, biaya, risiko dan rollback, pengelompokan pengguna stabil yang kami uji, migras…

Baca artikel →
Otomatisasi pengujian

Tes Tidak Stabil: Apa Penyebabnya dan Cara Memperbaikinya untuk Kebaikan

Pengujian yang tidak stabil dijelaskan dengan demo yang kami jalankan: penyebab utama, cara mengonfirmasi dan mendiagnosisnya, perbaikan waktu yang …

Baca artikel →
Pengujian perangkat lunak

Load Testing vs Stress Testing: Perbedaan, Metrik dan Contoh k6

Penjelasan pengujian beban vs pengujian stres: apa yang dibuktikan masing-masing, pengujian lonjakan dan rendam, metrik yang penting, mengapa rata-r…

Baca artikel →
Pengujian perangkat lunak

Kasus Uji vs Skenario Uji: Perbedaan Utama, Contoh, dan Kapan Menggunakan Masing-masing

Penjelasan kasus uji vs skenario pengujian: definisi yang jelas, tabel berdampingan, satu fitur pengaturan ulang kata sandi yang diambil dari skenar…

Baca artikel →
Basis data & SQL

Optimasi Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu

Pengoptimalan kueri SQL diuji pada sejuta baris: membaca rencana eksekusi, menambahkan indeks yang tepat, memperbaiki filter yang tidak dapat disarg…

Baca artikel →
Basis data & SQL

SQL UNION vs UNION ALL: Perbedaan, Contoh dan Kinerja Diuji

SQL UNION vs UNION ALL dijelaskan dengan kueri yang kami jalankan: duplikat, aturan yang diikuti keduanya, bug data nyata, kinerja terukur, INTERSEC…

Baca artikel →
Pengembangan perangkat lunak

Tutorial API Pengambilan JavaScript: GET, POST, Penanganan Kesalahan, dan Batas Waktu

Tutorial JavaScript Fetch API diuji pada server lokal: GET dan POST, mengapa 404 tidak muncul, bantuan yang dapat digunakan kembali, string kueri, b…

Baca artikel →
Pengembangan perangkat lunak

Penanganan File Python: Baca, Tulis, CSV, JSON dan pathlib Dengan Contoh

Penanganan file Python dijelaskan dengan kode yang kami jalankan: mode terbuka, dengan, membaca file besar, CSV, JSON, pathlib, file biner, penulisa…

Baca artikel →
Pengembangan perangkat lunak

Git merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing

Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.

Baca artikel →
Pengembangan perangkat lunak

List Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari

List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.

Baca artikel →
Basis data & SQL

Penjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)

Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.

Baca artikel →