EXISTS ve IN Performans Karşılaştırması
EXISTS'in ne zaman kısa devre yaptığını ve IN'den daha iyi performans gösterdiğini öğrenin.
EXISTS ve IN Performans Karşılaştırması, CoddyKit'te ücretsiz bir Coding Interview Prep 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, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.
EXISTS Aslında Neyi Sınar
EXISTS, bir alt sorgu alır ve bu alt sorgu en az bir satır üretir üretmez doğru sonucunu döndürür. Döndürülen değerlerle ilgilenmez — yalnızca herhangi bir satırın var olup olmadığına bakar.
- Bu,
WHEREiçinde kullanılan bir mantıksal sınamadır. - Neredeyse her zaman ilişkilidir: iç sorgu dış satıra başvurur.
Bu tek soruluk değerlendirme, orta ve kıdemli SQL mülakatlarının neredeyse tamamında karşınıza çıkar.
Temel Bir EXISTS Sorgusu
En az bir sipariş vermiş müşterileri bulunuz. İç sorgu, o.customer_id = c.id ile ilişkilidir; EXISTS, eşleşen tek bir sipariş bulunur bulunmaz doğru sonucunu döndürür.
SELECT 1 ifadesine dikkat ediniz — seçilen değer önemsizdir; bu nedenle çoğu mühendis 1 veya * yazar. Mülakatçılar her ikisini de kabul eder; iyileştirici, EXISTS içindeki seçme listesini yok sayar.
SELECT c.name
FROM customers c
WHERE EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);Kısa Devre Davranışı
Mülakatçıların duymak istediği anahtar kelime kısa devredir. EXISTS, eşleşen tek bir satır bulduğu anda iç sorguyu taramayı durdurur. Eşleşmelerin tamamını oluşturması veya yinelenenleri kaldırması hiçbir zaman gerekmez.
Buna karşılık IN, kavramsal olarak alt sorgudaki değerler kümesini somutlaştırır ve ardından üyeliği denetler. Büyük veya çok sayıda yinelenen iç kümelerde bu fark önemlidir.
IN Kullanılan Aynı Sorgu
İşte müşterileri ve siparişlerini getiren sorgunun IN eşdeğeri. Mantıksal olarak sonuç aynıdır, ancak işleyiş farklıdır: alt sorgu ilişkisizdir ve dış sorgunun karşılaştırdığı müşteri kimlikleri listesini üretir.
Modern iyileştiricilerde bunlar çoğu zaman aynı planı üretir — ancak büyük ve çok sayıda yinelenen kayıt içeren orders tablolarında EXISTS, ilk eşleşmede durabildiği için daha iyi performans gösterebilir.
SELECT c.name
FROM customers c
WHERE c.id IN (
SELECT o.customer_id FROM orders o
);NOT EXISTS, NOT IN'den Daha İyidir
Bu, tüm dersin ana fikridir. NOT EXISTS, karşı birleştirmeyi ifade etmenin güvenli yoludur. NOT IN ifadesinin aksine, iç sorgudaki NULL değerleri yüzünden bozulmaz.
orders.customer_id NULL değerleri içerse bile siparişi olmayan tüm müşterileri güvenilir biçimde bulur.
SELECT c.name
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM orders o
WHERE o.customer_id = c.id
);NOT EXISTS Neden NULL Güvenlidir
NOT EXISTS yalnızca ilişkili alt sorgu eşleşen herhangi bir satır buldu mu? sorusunu sorar — bu, temiz bir evet/hayır denetimidir. NULL değerindeki customer_id, o.customer_id = c.id koşulunu hiçbir zaman sağlamaz; dolayısıyla ne eşleşir ne de mantığı bozar.
NULL değerinin listedeki varlığının UNKNOWN sonucunu zorunlu kılarak tüm satırları elediği NOT IN ile karşılaştırınız. Kıdemli mülakatçıların karşı birleştirmeler için NOT EXISTS kullanmayı tercih etmesinin nedeni budur.
IN Aslında Ne Zaman Daha İyidir
Dengeli olunuz — IN her zaman daha kötü değildir. Alt sorgu küçük, sabit ve farklı değerlerden oluşan bir liste döndürdüğünde IN hem açık hem de hızlıdır:
- Birkaç sabit değer veya küçük bir arama tablosu.
- İyileştiricinin bir kez çalıştırıp önbelleğe alabileceği ilişkisiz bir sorgu.
Aşağıdaki sorgu tamamen yerleşik kullanıma uygundur; burada EXISTS kullanmaya yönelmek gereksiz mühendislik olur.
SELECT name
FROM products
WHERE category_id IN (
SELECT id FROM categories WHERE active = true
);Günümüzde Verilebilecek Dürüst Yanıt
Olgun iyileştiriciler (Postgres, yeni SQL Server sürümleri ve MySQL), IN ile EXISTS ifadelerini sıklıkla aynı yarı-birleştirme planına dönüştürür. Bu nedenle düz pozitif üyelik denetimlerinde performans çoğu zaman aynıdır.
Hâlâ önem taşıyan farklar şunlardır:
NOT INileNOT EXISTSarasındaki fark — NULL değerleriyle doğruluk (yalnızca hız değil, gerçek doğruluk).- Çok büyük veya dizinlenmemiş iç tablolar — EXISTS kısa devre yapar.
Varlık Denetiminde EXISTS ve JOIN
Mülakatçıların gündeme getirdiği başka bir yaklaşım da şudur: neden yalnızca JOIN kullanmıyoruz? Yalnızca varlığı denetleyen bir birleştirme, sağ tarafta yinelenen değerler varsa satırları çoğaltabilir ve bu da DISTINCT gerektirir. EXISTS dış satırı hiçbir zaman çoğaltmaz.
Bu nedenle yalnızca varlık denetimi yapıyorsanız EXISTS, JOIN ... DISTINCT kullanımından daha temizdir. Diğer tablodaki sütunlara gerçekten ihtiyacınız olduğunda birleştirme kullanınız.
SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON o.customer_id = c.id;Dizinleme Başarıyı Belirler
Dizinler olmadan performans yanıtı eksik kalır. İlişkili bir EXISTS, iç aramayı her dış satır için çalıştırır; dolayısıyla ilişkide kullanılan sütun üzerindeki bir dizin — burada orders(customer_id) — sorguyu hızlı yapan unsurdur.
"Alt sorgunun ilişki kurduğu birleştirme sütununu dizinlerdim" demek, ders kitabı yanıtını mülakatçıların saygı duyacağı pratik bir yanıta dönüştürür.
CREATE INDEX idx_orders_customer_id
ON orders (customer_id);Mülakat İçin Kısa Yanıt
Şöyle söyleyiniz: "EXISTS, ilk eşleşen satırda kısa devre yapan ilişkili bir mantıksal sınamadır; IN ise bir değer listesinde üyeliği denetler. Pozitif denetimlerde modern iyileştiriciler çoğu zaman aynı yarı-birleştirme planını üretir. Asıl fark NOT EXISTS ile NOT IN arasındadır: NOT EXISTS NULL değerlerine karşı güvenlidir; bu nedenle karşı birleştirmelerde onu tercih ederim ve ilişkili sütunun dizinlendiğinden emin olurum."
Hızlı Kontrol
EXISTS ile IN tartışmasının özü.
Özet
EXISTS ile IN karşılaştırması artık net:
EXISTS, ilk eşleşen satırda kısa devre yapan ilişkili bir mantıksal sınamadır; içindeki seçme listesi önemsizdir.IN, bir değer kümesindeki üyeliği denetler ve küçük, farklı değerlerden oluşan ilişkisiz listeler için idealdir.- Pozitif denetimlerde modern iyileştiriciler çoğu zaman aynı yarı-birleştirme planını seçer.
- Karşı birleştirmelerde
NOT INyerineNOT EXISTSkullanmayı tercih ediniz — NULL değerlerine karşı güvenlidir. İlişkili sütunu dizinleyiniz.
Alt Sorgulara Derinlemesine Bakış kursu burada sona eriyor.
Sıkça Sorulan Sorular
“EXISTS ve IN Performans Karşılaştırması” dersi ücretsiz mi?
Evet — “EXISTS ve IN Performans Karşılaştırması” 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 Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.
“EXISTS ve IN Performans Karşılaştırması” dersinde ne öğreneceğim?
EXISTS'in ne zaman kısa devre yaptığını ve IN'den daha iyi performans gösterdiğini öğrenin. Coding Interview Prep 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.
Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, 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 IN Performans Karşılaştırması” 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 Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Coding Interview Prep 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
- SELECT ve WHERE İçinde Skaler Alt Sorgular
- FROM Yan Tümcesinde Alt Sorgular (Türetilmiş Tablolar)
- IN, ANY ve ALL Alt Sorguları
- EXISTS ve IN Performans Karşılaştırması