SQL'de dinamik filtreleme sıklıkla gereklidir — örneğin, raporlar veya aramalarda, filtreler kullanıcı tarafından belirlenir. Temel yaklaşımlar:
(@param IS NULL OR alan = @param) yapısını kullanarak, parametre verilmezse fazla koşulların sonucu etkilemesini önleyin. Bu yöntem güvenlidir, ancak bazen indekslerin verimsiz kullanılmasına neden olabilir.Sipariş arama için şablon örneği:
SELECT * FROM Orders WHERE (@CustomerID IS NULL OR CustomerID = @CustomerID) AND (@Status IS NULL OR Status = @Status) AND (@DateFrom IS NULL OR OrderDate >= @DateFrom) AND (@DateTo IS NULL OR OrderDate <= @DateTo);
Soru: Neden (@param IS NULL OR Column = @param) yöntemini kullanırken performans zaman zaman düşebilir — Column üzerinde bir indeks olmasına rağmen?
Cevap: Böyle bir şablon, optimizasyoncunun indeksi verimli bir şekilde kullanmasını engeller çünkü koşulda bir değişken bulunur, ve sorgu tam bir tablo taramasına dönüşür. Büyük veri hacimlerinde bu kritiktir.
Örnek:
WHERE (@name IS NULL OR name = @name)
Bu koşul, yalnızca name = @name yazmakla aynı değildir, bu da DBMS'in indeksi kolayca kullanmasını engeller.
Hikaye
Müşteri veritabanında arama hizmetinde "esnek filtreler" (@par IS NULL OR Field = @par) şablonu ile uygulandı ve sipariş miktarları arttıkça arama hızı saniyelerden dakikalara düştü — indeksler çalışmamaya başladı çünkü optimizasyoncu belirli bir değeri belirleyemedi.
Hikaye
E-ticaret projesinde filtreleme, değerleri doğrudan ekleyerek parametresiz dinamik SQL ile toplandı. Enjeksiyonlar kullanıcıların tüm müşteri listesine erişim sağlamasına izin verdi, çünkü filtre savunmasızdı — parolalar acilen değiştirilmek zorunda kaldı.
Hikaye
BI raporları, OR koşullarının indeks taramalarını kaldırdığı göz önünde bulundurulmadan parametreli bir şablonla inşa edildi. Milyonlarca setlik raporlarda raporlar "dondu", ta ki filtreleme, zorunlu koşullar ve farklı parametre kombinasyonları için ayrı bir mantıkla yeniden yazılıncaya kadar.