ProgramlamaBackend geliştirici

SQL'de toplu veri ekleme uygulamalarının performans optimizasyonu, bütünlük ve kilitler açısından özelliklerini açıklayın. Büyük veri setleri ile çalışırken nelere özellikle dikkat edilmelidir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  1. Paketli eklemelerin kullanımı (Batch Insert): Verileri makul boyutlarda paketler halinde bölün — genellikle bu, her seferde binlerce satırdır. Bu, işlem günlüğü üzerindeki yükü azaltır ve kilitlenmeleri en aza indirir.
  2. Bulk insert sırasında indekslerin ve kısıtlamaların devre dışı bırakılması: İkincil indekslerin ve dış anahtarların geçici olarak kaldırılması veya devre dışı bırakılması, eklemeyi hızlandırabilir. İşlem tamamlandıktan sonra indeksleri yeniden oluşturun.
  3. İşlemler üzerinde kontrol: Eklemeleri, çok büyük işlem günlüklerinin birikmesini önlemek için sabit satır sayısı ile işlemler içinde gerçekleştirin.
  4. Özel araçların kullanımı: Örneğin, BULK INSERT veya COPY (PostgreSQL) — bunlar döngüdeki normal INSERT'lerden daha hızlı çalışır.
  5. Sadece gerekli sütunların yüklenmesi: Gereksiz verileri dışarıda bırakın — bu, trafik hacmini ve işleme süresini azaltır.

Örnek (SQL Server):

BULK INSERT my_table FROM 'C:\data\bulkdata.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = ' ', BATCHSIZE = 5000, TABLOCK );

TABLOCK toplu eklemelerde kilit çatışmalarını azaltır.

Zor bir soru

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.

Kod örneği:

-- 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!

Konunun ince ayrıntılarını bilmemekten kaynaklanan gerçek hata örnekleri


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ı.