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);56CREATE TABLE siparis (7id INT PRIMARY KEY,8musteri_id INT,9tutar DECIMAL(10,2)10);1112INSERT 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 siparis4);Çıktı:
1id | ad21 | Ali32 | AyşeVeritabanı ö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 m2JOIN siparis s ON m.id = s.musteri_id;Çıktı:
1id | ad21 | Ali32 | AyşeBurada 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ç.
0 yorum