CTE vs Subquery vs Temp Table: Mana Lebih Cepat
TL;DR
CTE, subquery, dan temp table sama-sama nyimpen hasil antara buat query yang rumit, tapi cara kerjanya beda. Subquery dan CTE biasanya diproses sekali jalan dan cocok buat query sekali pakai. Temp table nyimpen hasil ke disk dan bisa diindeks, jadi lebih cepat kalau hasilnya dipakai berkali-kali atau datanya besar. Buat query harian yang gak berat, CTE menang di keterbacaan.
CTE, subquery, dan temp table sama-sama bikin hasil sementara buat query yang rumit. Tapi cara mereka diproses beda, dan itu ngaruh ke kecepatan. Jawaban singkatnya: gak ada yang paling cepat buat semua kasus.
Buat query harian yang gak berat, tiganya jalan mirip dan kamu tinggal pilih yang paling gampang dibaca. Bedanya baru kerasa waktu data besar atau hasil antara dipakai berkali-kali.
Di sini aku bandingin ketiganya dari sisi performa dan keterbacaan, kasih contoh kode masing-masing, plus studi kasus toko_berkah biar kamu tau kapan pakai yang mana.
Apa beda CTE, subquery, dan temp table?
Subquery adalah query di dalam query yang ditulis langsung di tempat. CTE, atau common table expression, ngasih nama ke hasil sementara pakai klausa WITH biar query utama lebih rapi. Temp table nyimpen hasil ke tabel fisik sementara yang bisa diindeks dan dipakai ulang. Ketiganya nyimpen hasil antara, cuma beda cara dan tempat nyimpennya.
Subquery dan CTE hidup selama satu query jalan, lalu hilang. Temp table nempel di sesi database sampai kamu buang atau koneksi putus.
Mana yang paling cepat: CTE, subquery, atau temp table?
Tergantung pola pakainya. Subquery dan CTE biasanya paling cepat buat query sekali jalan karena database bisa nyatuin dan optimasi semuanya sekaligus. Temp table menang kalau hasil antaranya besar dan dipakai berulang, soalnya kamu bisa kasih index dan gak perlu ngitung ulang.
| Aspek | Subquery | CTE | Temp Table |
|---|---|---|---|
| Keterbacaan | Ramai kalau bertingkat | Paling rapi | Rapi tapi bertahap |
| Bisa diindeks | Tidak | Tidak | Ya |
| Dipakai ulang | Tidak | Terbatas | Ya, berkali-kali |
| Cocok buat data besar | Sedang | Sedang | Paling baik |
Catatan penting: di sebagian database kayak PostgreSQL versi lama, CTE dulu jadi penghalang optimasi. Sejak PostgreSQL 12, CTE bisa di-inline, jadi performanya makin dekat sama subquery.
Kapan sebaiknya pakai CTE?
Pakai CTE waktu query kamu mulai bertingkat dan susah dibaca. CTE ngasih nama ke tiap langkah, jadi alurnya kebaca dari atas ke bawah. Cocok buat query analitik yang punya beberapa tahap logis tapi cukup dijalanin sekali.
WITH penjualan_kota AS (
SELECT kota, SUM(total) AS total_jual
FROM transaksi
GROUP BY kota
)
SELECT *
FROM penjualan_kota
WHERE total_jual > 10000000;
CTE juga wajib buat query rekursif, misalnya nelusuri struktur organisasi bertingkat. Subquery biasa gak bisa gitu. Buat pola peringkat, CTE sering dipadu window function kayak di Top N per grup.
Kapan sebaiknya pakai subquery?
Pakai subquery buat filter atau hitungan singkat yang cuma dipakai di satu tempat. Kalau logikanya sederhana dan kamu gak butuh nyebut hasilnya lagi, subquery paling ringkas. Naruh langsung di WHERE atau FROM bikin query tetap dalam satu napas.
SELECT nama, total
FROM transaksi
WHERE total > (
SELECT AVG(total) FROM transaksi
);
Subquery kayak gini jelas maksudnya: ambil transaksi di atas rata-rata. Maksa jadi CTE atau temp table malah bikin lebih panjang tanpa untung.
Kapan sebaiknya pakai temp table?
Pakai temp table waktu hasil antaranya besar dan mau dipakai di beberapa query berikutnya. Kamu hitung sekali, simpan, lalu tembak berkali-kali tanpa ngulang kerja berat. Bonusnya, temp table bisa diindeks biar pencarian lanjutan makin cepat.
CREATE TEMP TABLE penjualan_kota AS
SELECT kota, SUM(total) AS total_jual
FROM transaksi
GROUP BY kota;
CREATE INDEX idx_tmp_kota ON penjualan_kota (total_jual);
SELECT * FROM penjualan_kota WHERE total_jual > 10000000;
SELECT AVG(total_jual) FROM penjualan_kota;
Karena hasilnya udah tersimpan, dua SELECT terakhir gak ngitung ulang agregasi dari tabel transaksi. Ini yang bikin temp table unggul di alur bertahap.
Contoh kasus: laporan bertahap toko_berkah
Toko_berkah bikin laporan yang butuh agregasi penjualan per kota, lalu dipakai di 5 query lanjutan. Dari dataset ngulikdata, tabel transaksi isinya 18,4 juta baris. Waktu agregasinya ditulis sebagai subquery yang diulang di tiap query, total waktu jalan 22 detik.
Setelah agregasi dipindah ke satu temp table berindeks lalu dipakai ulang, total turun jadi 5 detik. Bedanya sekitar 4 kali lebih cepat, cuma dari mindahin hasil berat ke temp table sekali hitung.
Tapi buat laporan sederhana yang cuma sekali jalan, aku tetap pakai CTE. Nulis temp table buat query sepele malah nambah langkah tanpa manfaat. Soal index yang bikin temp table ngebut, ada di composite index di SQL.
Kesalahan umum saat milih ketiganya
Kesalahan pertama: pakai temp table buat semua hal. Buat query sekali jalan, temp table malah nambah overhead bikin dan buang tabel. CTE atau subquery lebih ringan di situ.
Kesalahan kedua: numpuk subquery bertingkat sampai lima lapis. Ini bikin query mustahil dibaca dan susah didebug. Begitu lapisannya lebih dari dua, pindah ke CTE.
Kesalahan ketiga: ngira CTE selalu lebih lambat. Di database modern, CTE sering di-inline dan secepat subquery. Ukur pakai EXPLAIN dulu sebelum ambil kesimpulan performa.
FAQ
Apakah CTE selalu lebih lambat dari subquery?
Gak selalu, dan makin jarang benar di database baru. PostgreSQL sebelum versi 12 memang perlakuin CTE sebagai penghalang optimasi, jadi bisa lebih lambat. Tapi sejak versi 12, CTE bisa di-inline dan performanya nyaris sama subquery. Buat SQL Server dan MySQL modern, bedanya juga tipis buat kebanyakan query.
Kapan temp table jelas lebih baik?
Waktu hasil antaranya besar dan dipakai di banyak query berikutnya. Kamu hitung sekali, simpan, indeks, lalu pakai ulang tanpa ngitung lagi. Ini pas buat pipeline laporan bertahap. Buat query tunggal yang gak ngulang apa-apa, temp table malah nambah beban tanpa untung.
Apakah CTE dan subquery bisa dipakai bareng?
Bisa, dan sering banget dilakuin. Kamu bisa punya beberapa CTE, dan di dalamnya masih ada subquery. Gabungan ini bikin query tetap rapi di level atas tapi tetap fleksibel di bagian detail. Kuncinya jaga tiap lapisan tetap gampang dibaca, jangan tumpuk terlalu dalam.
Apakah temp table sama dengan CTE di semua database?
Enggak. Dukungan dan sintaksnya beda. PostgreSQL pakai CREATE TEMP TABLE, SQL Server pakai tabel berawalan tanda pagar. CTE lebih seragam antar database karena bagian dari standar SQL. Kalau kode kamu harus jalan lintas database, CTE biasanya lebih aman dipindah.
Gimana cara tau mana yang lebih cepat di kasus saya?
Ukur langsung pakai EXPLAIN ANALYZE di database kamu. Tebakan soal performa sering meleset karena tiap database punya optimizer beda. Jalanin ketiga versi query, bandingin waktu dan rencana eksekusinya, baru putuskan. Data nyata dari mesin kamu ngalahin aturan umum mana pun.
Penutup
Ringkasan biar gampang milih:
- Subquery buat filter singkat sekali pakai.
- CTE buat query bertahap yang butuh rapi dan kebaca.
- Temp table buat hasil besar yang dipakai berulang dan perlu index.
Mau latihan nulis query bertahap sampai lancar tanpa install database? Coba NgulikSQL buat praktek langsung. Lanjut juga ke Top N per grup di SQL yang sering pakai CTE. Detail cara kerja WITH ada di dokumentasi PostgreSQL soal query WITH.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Fungsi NTH_VALUE di SQL untuk Ambil Nilai ke-N (2026)
NTH_VALUE ngambil nilai baris ke-N dalam window, tapi frame default-nya sering bikin hasil NULL. Ini sintaksnya, cara benerin frame, plus contoh transaksi toko.
Running Max dan Min dengan Window Function SQL
Lacak nilai tertinggi dan terendah berjalan di SQL pakai window function MAX dan MIN OVER. Ini sintaks, frame clause, dan contoh rekor omzet toko.
Analisa Afinitas Produk (Cross-Sell) dengan SQL
Produk apa yang sering dibeli bareng? Analisa afinitas produk pakai SQL self JOIN jawab itu. Ini cara hitung support, confidence, dan lift buat strategi cross-sell.