SQL Subquery vs JOIN: Hangi Biri Daha Hızlı?

Subquery (alt sorgu) ve JOIN ikisi de ilişkili tablolardan veri çekmek için kullanılır, ama çalışma mantıkları farklıdır. JOIN iki tabloyu birleştirerek tek geçişte sonuç döndürür. Subquery ise iç sorguyu çalıştırıp sonucunu dış sorguya parametre olarak iletir, yani iki ayrı adımda işlem yapılır.

Praktik örnek üzerinden gidelim. Diyelim `musteri` ve `siparis` tablolarımız var.

1CREATE TABLE musteri (
2id INT PRIMARY KEY,
3ad VARCHAR(50)
4);
5
6CREATE TABLE siparis (
7id INT PRIMARY KEY,
8musteri_id INT,
9tutar DECIMAL(10,2)
10);
11
12INSERT INTO musteri VALUES (1, 'Ali'), (2, 'Ayşe'), (3, 'Mehmet');
13INSERT INTO siparis VALUES (101, 1, 500), (102, 1, 300), (103, 2, 800);

Altında en az bir sipariş vermiş müşterileri bulalım:

1SELECT * FROM musteri
2WHERE id IN (
3SELECT musteri_id FROM siparis
4);

Çıktı:

1id | ad
21 | Ali
32 | Ayşe

Veritabanı önce `SELECT musteri_id FROM siparis` çalıştırır (1, 1, 2 döner), sonra dış sorgu bu değerleri kontrol eder.

1SELECT DISTINCT m.* FROM musteri m
2JOIN siparis s ON m.id = s.musteri_id;

Çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1id | ad
21 | Ali
32 | Ayşe

Burada JOIN doğrudan iki tabloyu birleştirir; veritabanı tek bir işlem yapıyor.

Çoğu durumda JOIN daha hızlıdır çünkü:
- Tek geçişte sonuç alır
- Veritabanı motoru JOIN için optimize edilmiştir
- Subquery'de iç sorgu her satır için tekrar çalışabilir (correlated subquery)

Ancak basit `IN` subquery'leri modern veritabanlar tarafından JOIN'e dönüştürülebilir. Karmaşık sorguların performansını test etmek için `EXPLAIN` komutunu kullan:

1EXPLAIN SELECT * FROM musteri
2WHERE id IN (SELECT musteri_id FROM siparis);

- JOIN kullan: İlişkili veriler, çok satır, düzenli sorgular
- Subquery kullan: Tek bir değer döndüren işlemler, karmaşık filtreleme, okunabilirlik önemli

Optimizasyon için test et, çıktıyı (execution plan) oku ve ihtiyaca göre seç.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz