ORA-01795: IN listesindeki 1000 ifade sınırı
Oracle bir literal IN listesinde en fazla 1000 ifadeye izin verir. Bir tablodan 1200 kimlik yapıştırdığınızda sorgu ORA-01795 ile başarısız olur — yavaşlayarak ya da kısmen değil, doğrudan ayrıştırma anında. Sınır yalnızca literal listelere aittir; bir tabloya ya da koleksiyona karşı yazılan IN (SELECT …) böyle bir tavan taşımaz.
Alt sorgu kullanamadığınız durumlarda — tek seferlik bir inceleme, bir destek kaydı, yalnızca bir e-postada duran kimlikler — çözüm listeyi bölüp parçaları OR ile birleştirmektir. Bu araç bölmeyi yapıyor, tekrarları atıyor, her tablo yapıştırmasının sonunda kalan boş satırı temizliyor ve her değeri yalnızca gerekiyorsa tırnaklıyor.
Son madde göründüğünden önemli. 007 gibi bir kod, 7 sayısı değildir: tırnaksız bırakırsanız Oracle baştaki sıfırları düşürür, karşılaştırma sessizce tutmaz ve aradığınız satır sonuçta hiç görünmez. Sayı gibi görünen ama sıfırla başlayan değerler tırnaklı kalıyor.
Listeyi bölmek tek IN'den yavaş mı?
- Biraz, ama alternatif hiç çalışmayan bir sorgu. Liste büyük ve tekrar eden bir işse kimlikleri geçici bir tabloya yükleyip join yapın — bu her uzunlukta ölçeklenir ve optimize ediciye gerçek bir kardinalite verir.
SQL Server'da da aynı sınır var mı?
- Sabit bir 1000 sınırı yok, ama çok uzun IN listeleri orada da zarar veriyor: her biri ayrı bir sorgu planı üretip plan önbelleğini dolduruyor. Birkaç bin değerin üstünde parçalamak yine mantıklı.