Konu geçmişi:
EXISTS ve IN operatörleri, alt sorgulara dayalı kayıtları filtrelemek için kullanılır. SQL'in ilk ortaya çıktığından bu yana, geliştiriciler bu iki arasında seçim yapmaya çalışmakta ve hangi yöntemlerin daha hızlı çalıştığını, hangi durumlarda tercih edilmesi gerektiğini anlamakta zorlanmışlardır.
Sorun:
Ana görev, dış veya iç tabloda eşleşen yalnızca o satırları almaktır, bu her zaman büyük veri setlerinde performans için kritiktir. EXISTS ve IN arasında seçim yapmak, alt sorgunun yapısına, dönen değerlerin sayısına ve benzersizliğine ve kullanılan DBMS'ye bağlıdır.
Çözüm:
IN, genellikle alt sorgu az sayıda benzersiz değer döndürdüğünde daha etkilidir.EXISTS, eşleşen satırların varlığına önem verildiğinde tercih edilir; bu, binlerce ve milyonlarca satır döndüren büyük alt sorgular için uygundur.Kod örneği:
-- IN kullanımı SELECT name FROM students WHERE id IN (SELECT student_id FROM enrollments WHERE course = 'SQL'); -- EXISTS kullanımı SELECT name FROM students WHERE EXISTS (SELECT 1 FROM enrollments WHERE enrollments.student_id = students.id AND enrollments.course = 'SQL');
Anahtar özellikler:
IN alt sorgusunda NULL varsa ne olur?
Birçok kişi, IN'in NULL'ı sadece yok sayacağını düşünse de, NULL varsa sonuç tahmin edilemez hale gelebilir. Örneğin, sorgu:
SELECT id FROM orders WHERE client_id IN (1, NULL, 2);
teknik olarak client_id 1 veya 2'ye eşit olmayan satırları dahil etmeyecek, ancak alt sorguda yalnızca NULL olduğunda sonuç boş olacaktır.
EXISTS ve IN tam olarak birbirinin yerine geçebilir Mi?
Hayır. EXISTS kullanımı genellikle daha hızlıdır çünkü tüm alt sorguyu analiz etmek gerekmez. Ayrıca, IN birden fazla sütunlu alt sorgularla çalışmazken, EXISTS çalışır; çünkü karşılaştırma WHERE koşuluna göre yapılır. Örneğin:
SELECT col1 FROM t1 WHERE (col1, col2) IN (SELECT col3, col4 FROM t2);
Bu alternatif çoğu zaman desteklenmez, oysa benzer EXISTS desteklenir.
IN, indeksli alanlarla çalışırken EXISTS'ten daha hızlı çalışabilir mi?
Evet, alt sorgu küçükse ve karşılaştırılan alanda indeks varsa, IN daha hızlı olabilir. Ancak büyük veri setlerinde veya indeks yoksa tam tersi geçerlidir.
Bir analist, IN yöntemiyle rapor oluşturdu, ancak alt sorgunun yüz binlerce satır döndüğünü hesaba katmadı. Raporda yanıt süreleri dakikalara çıkıp, bazen veriler kayboldu.
Artılar:
Aynı sorgu EXISTS ile yeniden yazıldı ve ek koşul eklenip indeksler yeniden hesaplandı.
Artılar: