Batch İşlemleri Optimize Etme: SqlBulkCopy vs EF Core
Binlerce veya milyonlarca kaydı veritabanına eklerken normal INSERT sorgularını tek tek çalıştırmak çok yavaştır. Bu işi hızlandırmanın iki ana yolu var: SqlBulkCopy ve EF Core'un batch işlemleri. Hangisini ne zaman kullanacağını görelim.
SqlBulkCopy doğrudan SQL Server'a veri yüklemenin en hızlı yoludur. EF Core ise daha yüksek seviye bir soyutlama sağlar ama biraz daha yavaştır. Seçim, verinin kaynağına ve projenin mimarisine bağlıdır.
SqlBulkCopy Kullanımı:
1using (SqlConnection conn = new SqlConnection("Server=localhost;Database=TestDb;Integrated Security=true;"))2{3conn.Open();4using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))5{6bulkCopy.DestinationTableName = "Kullanicilar";7bulkCopy.BatchSize = 1000;8bulkCopy.BulkCopyTimeout = 300;910DataTable dt = new DataTable();11dt.Columns.Add("Id", typeof(int));12dt.Columns.Add("Ad", typeof(string));13dt.Columns.Add("Email", typeof(string));1415for (int i = 0; i < 100000; i++)16{17dt.Rows.Add(i, $"Kullanici{i}", $"user{i}@example.com");18}1920bulkCopy.WriteToServer(dt);21}22}Beklenen çıktı: 100.000 kaydın 2-3 saniyede yüklenmesi.
EF Core Batch İşlemleri:
1var kullanicilar = new List<Kullanici>();2for (int i = 0; i < 100000; i++)3{4kullanicilar.Add(new Kullanici 5{ 6Ad = $"Kullanici{i}", 7Email = $"user{i}@example.com" 8});9}1011using (var context = new AppDbContext())12{13context.Kullanicilar.AddRange(kullanicilar);14context.SaveChanges();15}Bu yöntem daha yavaştır çünkü EF Core her kaydı izlemek zorundadır. Hız için `ExecuteInsertAsync` kullanın:
1await context.Kullanicilar.ExecuteInsertAsync(2x => new Kullanici 3{ 4Ad = "Test", 5Email = "test@example.com" 6});Performans Karşılaştırması:
- SqlBulkCopy: 100.000 kayıt ~2 saniye
- EF Core AddRange + SaveChanges: ~15-20 saniye
- EF Core ExecuteInsert: ~4-5 saniye
Ne Zaman Hangisini Kullanmalı?
SqlBulkCopy maksimum hız gerekiyorsa ideal, fakat DataTable hazırlamak gerekir. EF Core daha esnek ve LINQ desteği sunar ama daha yavaştır. Küçük batch işlemlerde (< 1000 kayıt) fark önemli değil.
Sık Yapılan Hata: BatchSize'ı çok yüksek (10.000+) ayarlamak bellek sorununa neden olabilir. 1000-5000 arası ideal aralıktır.
0 yorum