EF Core yavaş değil: performansı bozan 5 sorgu deseni
Bir makale, EF Core'da yavaş sorguların çoğuna yol açan beş desen ve hepsini yakalayan tek bir alışkanlığı anlatıyor. Temel fikir, C# kodunu değil üretilen SQL'i okumak. N+1 sorguları, gereksiz satır ve sütun yüklemesi, koleksiyon Include'larında kartezyen patlama ve indeksi devre dışı bırakan fonksiyon çağrıları ele alınıyor. Veri erişim kodu yazan her .NET geliştiricisi için pratik bir kontrol listesi sunuyor.
Kilit noktalar
- Sorgu sayısını saymak için optionsBuilder.LogTo ile EF komutlarını loglayın; ToQueryString() ile SQL'i çalıştırmadan görebilirsiniz.
- N+1 sorunu için lazy loading'i kapatın ve ihtiyacınız olan alanları Select ile projection olarak isteyin.
- Filtreyi ToList() çağrısından önce yazın; IEnumerable<T> tipine çevrilen bir DbSet üzerindeki Where bellekte çalışır.
- Salt okunur sorgularda AsNoTracking() veya doğrudan DTO projection kullanarak izleme yükünü azaltın.
- Birden fazla koleksiyon Include'u kartezyen patlamaya yol açabilir; gerekirse AsSplitQuery() kullanın ve tutarlılık takasını göz önünde bulundurun.
- ToLower() gibi kolon üzerindeki fonksiyonlar indeks kullanımını engelleyebilir; SQL Server'da varsayılan harmanlama genellikle büyük/küçük harfe duyarsızdır.
EF Core'da yavaşlığın çoğu, kodun ürettiği SQL'den kaynaklanır. Makale, sık görülen beş sorgu hatasını ele alıyor: lazy loading ile oluşan N+1 sorguları, ToList() öncesinde yapılan filtrelemeyle tüm tablonun belleğe alınması, gereksiz sütun ve izleme (tracking) yükü, birden fazla koleksiyon Include'unun yarattığı kartezyen patlama ve ToLower() gibi kolonu saran fonksiyonların indeks kullanımını engellemesi.
Yazar, çözüm olarak sorguları loglayıp SQL'i okumayı öneriyor. Projection, AsNoTracking(), AsSplitQuery() ve filtrenin IQueryable kalarak SQL'e taşınması gibi araçlar bu sorunları gideriyor. Ayrıntılı örnekler ve Microsoft'un ölçüm sonuçları için orijinal yazıya bakmanız yeterli olacaktır.
Gerçek dünyada kullanımı
- Liste sayfası yavaşladığında, sorgu sayısını ve dönen satırları loglarla kontrol ederek N+1 veya tüm tablo yüklemesini bulmak.
- Salt okunur bir API uç noktasında yalnızca birkaç sütun dönecek şekilde DTO projection kurmak.
- Kullanıcı e-posta araması yapan bir girişte büyük/küçük harf dönüşümünü kaldırıp indeksin kullanılmasını sağlamak.
Neden önemli
EF Core'un ürettiği SQL'i okumak, performans sorunlarını tahmin yerine ölçerek bulmanızı sağlar. Birkaç kod değişikliğiyle sorgu sayısı ve bellek kullanımı ciddi biçimde düşebilir.