EXISTS ve JOIN Performansı
Daha hızlı kalıbı seçin.
EXISTS ve JOIN Performansı, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.
Burada Performans Neden Önemli?
Başka bir tabloda ilişkili satırların var olup olmadığını kontrol etmeniz gerektiğinde SQL size çeşitli araçlar sunar: EXISTS, IN ve JOIN. Bunların her biri doğru sonuçlar üretir; ancak verilerinizin boyutuna, dizinlere ve veritabanı motoruna bağlı olarak performansları büyük ölçüde farklı olabilir.
Bu derste her yaklaşımın arka planda nasıl çalıştığını ve hangisini ne zaman kullanmanız gerektiğini öğreneceksiniz.
Örnek Tablolar
Bu ders boyunca iki tablo kullanacağız: customers ve orders. Bir müşterinin hiç siparişi olmayabileceği gibi birçok siparişi de olabilir. Bu, EXISTS ve JOIN kalıplarını denemek için ideal, klasik birden çoğa ilişkidir.
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT REFERENCES customers(id),
total NUMERIC(10,2)
);
INSERT INTO customers (name) VALUES
('Alice'), ('Bob'), ('Carol'), ('Dave');
INSERT INTO orders (customer_id, total) VALUES
(1, 120.00), (1, 85.50), (3, 200.00);JOIN Yaklaşımı
En az bir siparişi olan müşterileri bulmak için INNER JOIN kullanmak yaygın bir kalıptır. Bu işe yarar, ancak soruna dikkat edin: Bir müşterinin beş siparişi varsa, DISTINCT bunları tekilleştirmeden önce sonuç kümesinde beş kez görünür.
Bu yineleme, veritabanının yapması gereken ek bir iştir — önce JOIN işleminin tüm sonucunu oluşturur, ardından yinelemeleri kaldırır.
SELECT DISTINCT c.id, c.name
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;EXISTS Yaklaşımı
EXISTS şu evet-hayır sorusunu yanıtlar: En az bir eşleşen satır var mı? Motor ilk eşleşmeyi bulduğu anda taramayı durdurur — buna kısa devre değerlendirmesi denir.
EXISTS iç satırları gerçekte döndürmediği için yineleme oluşmaz ve DISTINCT gerekmez.
SELECT c.id, c.name
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);Kilit Nokta: Kısa Devre
Kısa devre değerlendirmesi, uygun bir satır bulunur bulunmaz alt sorgunun durması anlamına gelir. Bir müşterinin 1 siparişi de 10.000 siparişi de olsa EXISTS yalnızca ilk eşleşmeye kadar okuma yapar.
Yalnızca varlığı önemsediğiniz durumlarda bile JOIN, sonuç kümesini oluşturmak için tüm eşleşen satırları okumak zorundadır. Çok sayıda alt satır içeren geniş tablolarda bu fark hızla büyür.
-- EXISTS stops after finding row #1
SELECT c.name
FROM customers c
WHERE EXISTS (
SELECT 1 -- 'SELECT 1' is conventional; the value does not matter
FROM orders o
WHERE o.customer_id = c.id
);
-- JOIN scans ALL matching order rows
SELECT DISTINCT c.name
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id;NOT EXISTS ve LEFT JOIN ... IS NULL Karşılaştırması
Ters kontrol için — hiç siparişi olmayan müşterileri bulmak amacıyla — NOT EXISTS veya LEFT JOIN ... WHERE IS NULL kalıbını kullanabilirsiniz. İkisi de yaygındır; ancak NOT EXISTS genellikle daha okunabilirdir ve sorgu iyileştirici çoğu zaman onu tercih eder.
-- NOT EXISTS
SELECT c.id, c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.id
);
-- LEFT JOIN ... IS NULL (equivalent result)
SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;Dizinlerin Rolü
Hem EXISTS hem de JOIN, yabancı anahtar sütunundaki bir dizinden büyük ölçüde yararlanır. orders.customer_id üzerinde bir dizin yoksa her dış satır, orders tablosunun tamamının taranmasını tetikler.
Bu dizini eklemek çoğu zaman performans açısından en büyük kazanımı sağlar — EXISTS ile JOIN arasında seçim yapmaktan daha etkili olabilir.
-- Create an index on the foreign key
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
-- Now both patterns use an index lookup instead of a full scan
EXPLAIN
SELECT c.name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);EXPLAIN Çıktısını Okuma
Bir sorgunun veritabanı tarafından nasıl çalıştırıldığını görmek için EXPLAIN (sorguyu çalıştırmak için ayrıca EXPLAIN ANALYZE) kullanın. Şu ipuçlarını arayın:
- Index Scan — iyi; dizin kullanılıyor.
- Büyük bir tabloda Seq Scan — olası bir uyarı işareti; bir dizin yardımcı olabilir.
- Hash Join / Nested Loop — seçilen JOIN algoritmasıdır; Nested Loop, dizin taramalarıyla iyi çalışır.
EXPLAIN ANALYZE
SELECT c.name
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.name
HAVING COUNT(o.id) > 0;JOIN Ne Zaman Daha İyi?
EXISTS, yalnızca varlık kontrollerinde öne çıkar. Ancak ilişkili tablodan sipariş toplamı veya sipariş tarihi gibi verilere de ihtiyacınız varsa JOIN kullanmanız gerekir. EXISTS alt sorgusunun içinden sütun döndürmenin bir yolu yoktur.
Soruya uygun aracı seçin: "Var mı?" sorusu için EXISTS, "Her iki tablodan da veri getir" sorusu için JOIN.
-- Need order data? JOIN is the only option.
SELECT c.name, o.total, o.id AS order_id
FROM customers c
INNER JOIN orders o ON o.customer_id = c.id
ORDER BY c.name;Büyük Kümelerde IN ve EXISTS Karşılaştırması
IN (subquery) önce alt sorgunun tamamını değerlendirir, bellekte bir değer listesi oluşturur, ardından dış satırların her birini bu listeyle karşılaştırır. Milyonlarca satır olduğunda bu liste belleği tüketebilir.
EXISTS satır satır değerlendirilir ve kısa devre yapar; bu nedenle iç sonuç kümesinin tamamını hiçbir zaman bellekte oluşturmaz. Büyük veri kümelerinde yapılan ilişkili denetimlerde EXISTS neredeyse her zaman IN'den daha hızlıdır.
-- IN builds the full list first
SELECT name
FROM customers
WHERE id IN (
SELECT customer_id FROM orders
);
-- EXISTS evaluates per-row and short-circuits
SELECT name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);Karar Rehberi
Doğru kalıbı seçmeniz için hızlı bir başvuru:
- EXISTS — yalnızca bir eşleşmenin var olup olmadığını bilmeniz gerekiyorsa; büyük alt tablolar için; karşı birleştirme için NOT EXISTS.
- JOIN — ilişkili tablodaki sütunlara ihtiyacınız varsa; her iki tablo üzerinden toplulaştırma yapacaksanız.
- IN — kısa, sabit değer listeleri için (
WHERE status IN ('active', 'pending')); büyük alt sorgular için kullanmaktan kaçının. - Yabancı anahtar sütununu her zaman indeksleyin — bu, sözdizimi seçiminden daha önemlidir.
Hızlı Kontrol
İlişkili satırların varlığını denetlerken EXISTS'in INNER JOIN + DISTINCT'ten daha hızlı olabilmesinin nedenini en iyi hangi ifade açıklar?
Ders Özeti
Bu derste, performansı gözeten SQL sorguları için EXISTS ile JOIN arasında nasıl seçim yapacağınızı öğrendiniz:
- EXISTS kısa devre yapar — ilk eşleşme bulunur bulunmaz taramayı durdurur; DISTINCT gerektirmeden yinelenenleri önler.
- JOIN eşleşen tüm satırları döndürür — ilişkili tablodan verilere ihtiyacınız olduğunda kullanın; yalnızca üst satırla ilgileniyorsanız DISTINCT veya GROUP BY ekleyin.
- NOT EXISTS temiz bir karşı birleştirme kalıbıdır; LEFT JOIN ... IS NULL eşdeğerdir ancak daha uzundur.
- Büyük alt sorgularla IN kullanmaktan kaçının — iç sonuç kümesinin tamamını bellekte oluşturur; EXISTS belleği daha verimli kullanır.
- Yabancı anahtarlarınızı indeksleyin — bu tek adım, hangi sözdizimini seçtiğinizden bağımsız olarak genellikle en büyük performans artışını sağlar.
- Yürütme planını doğrulamak ve indekslerin kullanıldığını onaylamak için EXPLAIN / EXPLAIN ANALYZE kullanın.
Yapay zeka eğitmeniyle SQL öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 46
- Dersler
- 183
Sıkça Sorulan Sorular
“EXISTS ve JOIN Performansı” dersi ücretsiz mi?
Evet — “EXISTS ve JOIN Performansı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.
“EXISTS ve JOIN Performansı” dersinde ne öğreneceğim?
Daha hızlı kalıbı seçin. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
SQL Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“EXISTS ve JOIN Performansı” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İlişkili Alt Sorgular
- EXISTS ve NOT EXISTS
- IN, ANY ve ALL Karşılaştırması
- EXISTS ve JOIN Performansı