M E D Y A T Ö R

Eager ve Lazy Loading ile .NET Core MVC’de Performansınızı Nasıl Optimize Edersiniz?

  • 20

    KASIM

    2024


  • Görüntülenme

Eager ve Lazy Loading Nedir?

Veri yükleme stratejileri, uygulamaların performansını önemli ölçüde etkileyen faktörlerin başında gelir. .NET Core MVC uygulamalarında veritabanı sorgularını yönetirken Eager Loading ve Lazy Loading yaklaşımlarını doğru bir şekilde kullanmak, hem uygulamanızın hızını artırır hem de gereksiz veriyi yüklemenizi engeller. 


Eager Loading Nedir?

Eager Loading (İstekli Yükleme), ihtiyaç duyulan verinin ilişkili tüm verilerle birlikte önceden yüklenmesi anlamına gelir. Başka bir deyişle, sorgu çalıştığında sadece ana nesneyi değil, ona bağlı tüm ilişkili nesneleri de alır. Bu sayede, ek sorgular çalıştırmaya gerek kalmadan tüm verilere tek seferde erişilebilir.


Avantajları:

Büyük ve tek seferlik veri yüklemeleri için idealdir.

Sorgu sayısını azaltarak bazı durumlarda performansı artırabilir.

İlişkili veriler sürekli olarak kullanılıyorsa, veri tekrar sorgulanmadan önceden alınır.

Dezavantajları:

Tüm ilişkili verileri baştan yüklendiği için bellekte fazla yer kaplayabilir.

Gereksiz veriler alınırsa performans düşebilir.


Eager Loading Kullanımı 

Diyelim ki bir Blog ve Yorumlar ilişkisinin olduğu bir veritabanımız var. Bir blog gönderisini ve bu gönderiye ait tüm yorumları almak istediğimizde Eager Loading kullanabiliriz:


 var blogPost = context.Blogs
        .Include(b => b.Comments)
        .FirstOrDefault(b => b.Id == blogId);


Bu sorguda, Include metodu ile Comments (yorumlar) tablosunu da Blogs tablosuyla beraber getiriyoruz. Bu sayede blog gönderisi çekildiğinde ona ait yorumlar da aynı anda yüklenmiş oluyor. Bu yaklaşım, veriye hemen ihtiyaç duyduğumuzda avantajlıdır çünkü tüm veri aynı anda alınır ve ekstra sorgu gerekmez.


Lazy Loading Nedir?
Lazy Loading (Tembel Yükleme), ihtiyaç duyulana kadar ilişkili veriyi yüklememe yaklaşımıdır. İlk sorgu sadece ana nesneyi getirir, ilişkili nesneler ise ihtiyaç duyulduğunda sorgulanarak getirilir. Böylece bellek kullanımını azaltmak ve gereksiz veri sorgularını önlemek mümkün olur.

Avantajları:
Bellek dostudur, çünkü sadece ihtiyaç duyulan veriler yüklendiğinde sorgu yapılır.
Uygulamanın başlangıç yükünü hafifletir.
Dezavantajları:
İlişkili verilere ihtiyaç duyulursa, ek sorgular yapılır, bu da bazı durumlarda performans sorunlarına neden olabilir (N+1 problemi olarak bilinir).
Veritabanına daha fazla erişim gerektiğinde yavaş çalışabilir.• Veritabanına daha fazla erişim gerektiğinde yavaş çalışabilir. Lazy Loading Kullanımı

Lazy Loading Kullanımı 
Önce Lazy Loading’in etkinleştirilmesi gerekir. .NET Core projelerinde Microsoft.EntityFrameworkCore.Proxies paketini kullanarak Lazy Loading’i aktifleştirebiliriz:

// Startup.cs dosyasına
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseLazyLoadingProxies()
                   .UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));


Lazy Loading etkinleştirildikten sonra, ilişkili veriler ihtiyaç duyulana kadar yüklenmeyecek. Örneğin:

        var blogPost = context.Blogs.FirstOrDefault(b => b.Id == blogId);
Console.WriteLine(blogPost.Title); // Sadece blogPost verisini çeker

foreach (var comment in blogPost.Comments) // Comments verisine ihtiyaç duyulduğunda veritabanına sorgu atılır
{
    Console.WriteLine(comment.Content);
}


Yukarıdaki örnekte, blogPost.Comments kullanıldığında Comments tablosuna ayrı bir sorgu atılır. Bu, başlangıçta yalnızca blog gönderisini yükler ve yorumlara ihtiyaç duyulduğunda yorumları çeker.



Eager ve Lazy Loading’i Ne Zaman Kullanmalıyız?

Her iki yaklaşımın da doğru kullanımı, uygulamanın performansını optimize etmek için önemlidir. İşte hangi durumlarda hangi stratejiyi tercih edebileceğinize dair bazı ipuçları:

1.     İlişkili Veriler Kesinlikle Gerekliyse:
Eğer ana nesneyle birlikte ilişkili verilerin tamamına ihtiyacınız varsa, Eager Loading daha iyi bir seçimdir. Örneğin, bir kullanıcı profil sayfasında kullanıcının tüm gönderileri ve yorumları aynı anda gösterilecekse, Include ile veriyi topluca almak daha verimli olur.

2.     Verinin Sadece Belirli Kısımlarına İhtiyaç Varsa:
Tüm ilişkili verileri almanıza gerek yoksa, Lazy Loading tercih edilebilir. Örneğin, bir e-ticaret sitesinde ürün listesini yüklerken her ürünle ilgili ayrıntılı bilgiye ihtiyaç duyulmayabilir; sadece ürünler ve genel bilgiler alınır, ayrıntılar yalnızca ürün seçildiğinde getirilir.

3.     Büyük Veritabanları ile Çalışırken Dikkat:
Büyük ve karmaşık veritabanlarıyla çalışırken her iki yöntemin de kullanımına dikkat etmek önemlidir. Özellikle Lazy Loading’i gereksiz sorgulardan kaçınarak kontrollü bir şekilde kullanmalısınız.


N+1 Problemi: Lazy Loading'in Gizli Tehlikesi

N+1 problemi, Lazy Loading kullanılırken karşılaşılabilecek bir durumdur. Diyelim ki 1 blog gönderisini ve ona ait 100 yorumu sorguladınız. İlk sorgu ana nesneyi (blog gönderisini) getirir, ardından her bir yorum için ayrı ayrı 100 sorgu daha yapılır. Bu da performans açısından büyük bir yük oluşturur.

Böyle bir durumla karşılaşmamak için Lazy Loading yerine Eager Loading kullanılabilir veya sorgu yapısı optimize edilebilir.




Performansı Optimize Etme İpuçları

1.     Veri Yükleme Stratejilerini Kombine Edin
Hem Lazy hem de Eager Loading’i duruma göre kullanarak veritabanı erişimlerinizi optimize edebilirsiniz.

2.     Sorguları Planlayın ve Filtreleyin
Gereksiz verileri sorgulardan çıkararak sadece ihtiyacınız olan veriyi yükleyin.

3.     Profiling ve İzleme Araçları Kullanın
.NET Core için sunulan profiling araçları, sorgu performansınızı izlemenize ve optimize etmenize yardımcı olabilir.

Eager ve Lazy Loading, .NET Core MVC projelerinin performansını artırmak için güçlü yöntemlerdir. Her iki yöntemin de avantajları ve dezavantajları olduğundan, hangi duruma hangi yöntemin uygun olduğunu iyi analiz etmek önemlidir.

Uygulamanızın performansını artırmak için bu veri yükleme stratejilerini etkin bir şekilde kullanarak daha hızlı ve verimli bir yazılım geliştirebilirsiniz. Eager ve Lazy ile veri yükleme süreçlerinizi kontrol altına alarak, kullanıcı deneyimini iyileştirebilir ve gereksiz veri trafiğini azaltabilirsiniz.