EF Core ve Veritabanı Performansı: Neden Önemli?
1. Index Kullanımı: Sorguları Hızlandırmanın Temel Adımı
Örneğin, aşağıdaki gibi basit bir index tanımlaması yaparak veritabanınızdaki performansı artırabilirsiniz:
public class ApplicationDbContext : DbContext
{
public DbSet Products { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasIndex(p => p.ProductName) // Index ekleme
.HasDatabaseName("IX_ProductName");
}
}
Önemli not: Veritabanınızda gereksiz fazla index kullanımı, yazma işlemlerinin yavaşlamasına neden olabilir. Bu yüzden sadece gerçekten ihtiyacınız olan sütunlarda index oluşturmalısınız.
2. Lazy vs Eager Loading: Hangi Strateji Daha İyi?
- Lazy Loading: İlişkili veriler, ilk başta sorguya dahil edilmez ve yalnızca ihtiyaç duyulduğunda yüklenir. Bu, başlangıçta hızlı olsa da, her ilişkili veri için yeni bir sorgu yapılabilir. Bu da "N+1 sorgu problemi"ne yol açabilir.
- Eager Loading: İlişkili veriler hemen sorguya dahil edilir. Bu, tek bir sorguda tüm veriyi almanızı sağlar ve N+1 sorgu problemini engeller, ancak başlangıçta daha yavaş olabilir.
Bir örnek üzerinden bunu inceleyelim:
// Lazy Loading kullanımı
var products = dbContext.Products.ToList();
// Eager Loading kullanımı
var productsWithCategories = dbContext.Products
.Include(p => p.Category)
.ToList();
Lazy Loading daha az veri çektiği için daha hızlı olabilir, ancak gereksiz sorgulara yol açabilir. Eager Loading ise daha fazla veri çeker ve daha az sorgu yapılmasını sağlar, ancak başlangıçta daha yavaş olabilir.
3. Sorgu Optimizasyonu: `Select` ile İhtiyaç Duyduğunuz Veriyi Alın
Örneğin, sadece belirli sütunları çekmek için şu şekilde bir sorgu yazabilirsiniz:
var productNames = dbContext.Products
.Where(p => p.Price > 50)
.Select(p => p.ProductName)
.ToList();
Bu yöntem, veritabanından sadece gerekli olan sütunları çeker ve memory kullanımını azaltır, böylece sorgu süresini kısaltır.
4. Sorgu Yazımında Dikkat Edilmesi Gereken İpuçları
- AsNoTracking() Kullanımı: Eğer sorgu sonucu sadece okuma amacıyla kullanılacaksa, `AsNoTracking()` kullanarak EF Core'un veri izleme özelliğini devre dışı bırakabilirsiniz. Bu, performansı artırır çünkü EF Core, veritabanındaki her satırı izlemeye çalışmaz.
var products = dbContext.Products
.AsNoTracking()
.Where(p => p.Price > 50)
.ToList();
Sonuç: Veritabanı Sorgularınızı Hızlandırarak Uygulamanızın Performansını Artırın
Uygulamanızda hız ve performans sorunu yaşıyorsanız, bu ipuçlarını deneyin ve sorgularınızı optimize edin. İlerleyen zamanlarda, performansın artırılması ve doğru index kullanımı ile çok daha hızlı ve verimli uygulamalar geliştirebilirsiniz.