ProgramlamaSQL geliştirici

SQL'de dinamik olarak belirlenen arama parametreleriyle veri filtrelemesini doğru ve etkili bir şekilde nasıl gerçekleştirebilirim (örneğin, herhangi bir koşul seti ile web filtresi)?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

SQL'de dinamik filtreleme sıklıkla gereklidir — örneğin, raporlar veya aramalarda, filtreler kullanıcı tarafından belirlenir. Temel yaklaşımlar:

  1. Dinamik SQL — sorgu dizesi, yalnızca boş olmayan parametreler için koşullar ile anında oluşturulur. Bu esnek fakat SQL enjeksiyonlarından korunma konusunda dikkat edilmesi gerekir (parametreler/kacış kullanılması).
  2. OR ile koşullu filtreleme(@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);

Kandırmaca Soru.

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.