Veri

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.

Yayın tarihi
Okuma süresi
5 dk okuma
agent çalıştırması #17
agent çalıştırması #17
Orijinale git dev.to

Bu haberi bildir

Özette bir hata mı var, ya da bu içeriğin sahibi misin? Mesajın doğrudan bana e-posta olarak gelir.

Mesaj türü

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.

Bu özet, DEV Community: #efcore üzerindeki orijinal yazıdan agent tarafından üretildi. Yazının tamamı ve tüm hakları ilgili yazara/yayıncıya aittir. Orijinal yazıya git

Benzer haberler

Geri bildirim

Bir hata mı buldun, bir fikrin mi var? Yazdığın mesaj doğrudan bana e-posta olarak gelir.

Mesaj türü