Toplu veri ekleme (bulk insert), büyük tabloların taşınması, içe aktarımı veya doldurulması sırasında tipik bir görevdir. Böyle bir işlemin verimliliği birkaç faktöre bağlıdır:
BULK INSERT veya COPY (PostgreSQL) — bunlar döngüdeki normal INSERT'lerden daha hızlı çalışır.BULK INSERT my_table FROM 'C:\data\bulkdata.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = ' ', BATCHSIZE = 5000, TABLOCK );
TABLOCKtoplu eklemelerde kilit çatışmalarını azaltır.
Soru: Toplu ekleme işlemlerini hızlandırmak için her an indeksleri devre dışı bırakmak ve yeniden oluşturmak mümkün mü, eğer tablo işlemlerde yer alıyorsa?
Cevap: Hayır, eğer tablo aktif işlemlerde yer alıyorsa, indekslerin devre dışı bırakılması veya yeniden oluşturulması kilitlenmelere, veri bütünlüğünün ihlaline veya eğer işlem geri alınırsa veri kaybına yol açabilir. Bu işlem yalnızca işlemler dışında gerçekleştirilmelidir veya bakım pencereleri önceden planlanmalıdır.
-- Yanlış: BEGIN TRAN; ALTER INDEX ALL ON my_table DISABLE; -- ... bulk insert ... ALTER INDEX ALL ON my_table REBUILD; COMMIT;
Uzun işlemler içinde böyle bir devre dışı bırakma kabul edilemez!
Hikaye 1: Bir projede, birden fazla benzersiz indekse sahip tabloya paralel toplu eklemeler, sık sık deadlock'lara ve performansın keskin bir şekilde düşmesine neden oldu. Çözüm, ithalat dönemi boyunca anahtar olmayan indekslerin geçici olarak devre dışı bırakılması ve işlem boyutunun azaltılması oldu.
Hikaye 2: Geliştiriciler veri yüklemesi sırasında dış anahtar kontrolünü devre dışı bırakmayı unuttular ve her ekleme, diğer büyük tablolardaki bağlı kayıtların varlığını kontrol etti. Bu, yükleme süresini 40 dakikadan 9 saate çıkardı. Kısıtlamaların devre dışı bırakılmasından sonra ekleme süresi 12 dakikaya düştü.
Hikaye 3: Büyük bir dosyayı tek bir sorgu ile (paketleme olmadan ve işlemler olmadan) eklemeye çalışmak, işlem günlüğünün dolmasına (transaction log full) ve veritabanı sunucusunun çökmesine neden oldu. Paket işleme yönetimine geçtikten sonra sorun ortadan kalktı.