EF Core: AsNoTracking, Eager vs Lazy Loading & Split Queries
Sadece okuma yapacağın sorgularda EF Core'un hafıza takip mekanizmasını kapatıp performansı katlamaktır.
Müzedeki tarihi esere sadece gözünle bakmaktır. Eline kalem alıp üstünü çizmene gerek olmadığı için güvenlik görevlisinin seni adım adım takip etmesine gerek kalmaz.
EF Core ChangeTracker mekanizması çekilen nesnelerin durumunu (Modified, Deleted vs.) izler. AsNoTracking() bu takibi kapatarak bellek tüketimini azaltır ve sorguyu hızlandırır. Eager Loading (.Include) ise ilişkili veriyi tek SQL JOIN ile getirir. Çoklu ilişkilerde kartezyen patlamayı önlemek için AsSplitQuery() kullanılır.
“AsNoTracking(), veritabanından sadece okuma yapılacak sorgularda Change Tracker yükünü ortadan kaldırarak RAM ve CPU tasarrufu sağlar. Çok fazla tablo Include edildiğinde oluşan kartezyen çarpımı engellemek için ise .AsSplitQuery() ile sorgu ayrı SELECT ifadelerine bölünür.”
var users = await _context.Users
.AsNoTracking()
.Include(u => u.Orders)
.AsSplitQuery() // Kartezyen patlamayı engeller
.Where(u => u.IsActive)
.ToListAsync();
AsNoTracking() ile çekilen bir nesnenin property'sini değiştirip _context.SaveChangesAsync() derseniz veritabanına YANSIMAZ!