Bulk Insert Optimizasyonu: Batch Boyutu Seçimi ve Ölçeklendirme
Toplu veri ekleme (bulk insert) işlemlerinde batch boyutu seçimi performansı doğrudan etkiler. Çok küçük batch kullanırsan veritabanı bağlantısı açılıp kapatma maliyeti artar; çok büyük batch seçersen bellek tükenir ve timeout oluşur. Doğru dengeyi bulmak gerekir.
Batch boyutu seçerken üç faktörü göz önüne al: veritabanı bağlantı havuzu (connection pool) kapasitesi, sunucu belleği ve ağ bant genişliği. Çoğu durumda 1000 ile 10000 satır arasında iyi sonuç alırsın. Veritabanı türüne göre değişir, SQL Server için 5000, PostgreSQL için 3000, MySQL için 2000 başlangıç değerleri deneyebilirsin.
Pratik bir C# örneği:
1using SqlBulkCopy = System.Data.SqlClient.SqlBulkCopy;2using DataTable = System.Data.DataTable;34public class BulkInsertOptimizer5{6public static void InsertWithOptimalBatch(7string connectionString, 8DataTable data, 9int batchSize = 5000)10{11using (var connection = new SqlConnection(connectionString))12{13connection.Open();14using (var bulkCopy = new SqlBulkCopy(connection))15{16bulkCopy.DestinationTableName = "Urunler";17bulkCopy.BatchSize = batchSize;18bulkCopy.BulkCopyTimeout = 300; // 5 dakika1920var startTime = DateTime.Now;21bulkCopy.WriteToServer(data);22var duration = DateTime.Now - startTime;2324Console.WriteLine(25$"Batch: {batchSize}, Satır: {data.Rows.Count}, " +26$"Süre: {duration.TotalSeconds:F2}s");27}28}29}30}3132// Kullanım ve ölçüm33var testData = new DataTable();34testData.Columns.Add("ID", typeof(int));35testData.Columns.Add("Ad", typeof(string));3637for (int i = 0; i < 50000; i++)38{39testData.Rows.Add(i, $"Ürün_{i}");40}4142// Farklı batch boyutlarını test et43foreach (int batch in new[] { 1000, 5000, 10000 })44{45InsertWithOptimalBatch(connectionString, testData, batch);46}Bu kod 50000 satırı farklı batch boyutlarıyla ekler ve her birinin süresini ölçer. Çıktı şöyle görünür:
1Batch: 1000, Satır: 50000, Süre: 8.45s2Batch: 5000, Satır: 50000, Süre: 2.13s3Batch: 10000, Satır: 50000, Süre: 2.08sGördüğün gibi batch boyutu arttıkça işlem hızlanır, ancak 5000 ile 10000 arasında fark minimal olur. Burası senin sistemin için optimal noktadır.
Ölçeklendirme sırasında şu adımları izle: önce 1000 satırlık batch ile başla, ardından 5000'e çık. Eğer timeout ya da OutOfMemory hatası alırsan batch boyutunu azalt. Üretim ortamında bellek izleme (monitoring) ekle ve batch boyutunu dinamik olarak ayarla. Veritabanı yoğunluğu arttığında batch boyutunu küçült, az yoğun saatlerde büyült.
Bir diğer önemli nokta: batch işlemi sırasında transaction log büyümesini kontrol et. Çok büyük batch tek bir transaction içinde çalışırsa recovery süresi uzar. Gerekirse batch'i daha küçük transactionlara böl.
5 yorum
en az 3 5 kere çalıştır ortalama al bir kere yeterli değil çünkü ilk çalışma cache dolması vs ile hızlı görünür sonrakiler daha gerçekçi
ya ama ortalama kaç kere çalıştırmalı ki sonuç güvenilir olsun bir kere mi yetmeli
Benchmark yap yani aynı veriyi 5000lik batch ile çalıştır zamanı ölç sonra 10000lik ile tekrarla
tamam anladım ilk çalışmada cache dolu olduğu için aldatıcı oluyor
5000 ile 10000 arasında deniyorum ama hangisi daha iyi olduğunu nasıl anlayacağız Biri diğerinden ne kadar daha hızlı