Meningkatkan Prestasi Sisipan Rangka Kerja Entiti dengan Set Data Besar
Memasukkan set data yang besar ke dalam Rangka Kerja Entiti (EF) boleh menjadi perlahan. Artikel ini meneroka teknik untuk mempercepatkan proses ini dengan ketara, terutamanya apabila menggunakan TransactionScopes dan mengendalikan sejumlah besar rekod.
Mengoptimumkan SaveChanges()
Panggilan
Amalan biasa memanggil SaveChanges()
untuk setiap rekod adalah tidak cekap untuk sisipan pukal. Sebaliknya, pertimbangkan alternatif ini:
SaveChanges()
: Panggil SaveChanges()
sekali sahaja selepas semua rekod ditambahkan pada konteks.SaveChanges()
: Panggil SaveChanges()
selepas bilangan rekod yang ditetapkan (cth., 100 atau 1000).SaveChanges()
, buang konteks dan buat yang baharu selepas beberapa rekod.Kaedah ini mengurangkan perjalanan pergi dan balik pangkalan data dan meminimumkan overhed daripada penjejakan perubahan.
Pelaksanaan Sisipan Pukal yang Cekap
Kod berikut menunjukkan sisipan pukal yang dioptimumkan:
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { MyDbContext context = null; try { context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; int count = 0; foreach (var entityToInsert in someCollectionOfEntitiesToInsert) { ++count; context = AddToContext(context, entityToInsert, count, 1000, true); } context.SaveChanges(); } finally { if (context != null) context.Dispose(); } scope.Complete(); } private MyDbContext AddToContext(MyDbContext context, Entity entity, int count, int commitCount, bool recreateContext) { context.Set<Entity>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); if (recreateContext) { context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } return context; }</code>
Contoh ini melumpuhkan pengesanan perubahan automatik (AutoDetectChangesEnabled = false
) untuk peningkatan prestasi. Kaedah AddToContext
mengendalikan melakukan perubahan dan mencipta semula konteks secara pilihan selepas bilangan rekod yang ditentukan.
Keputusan Penanda Aras
Ujian dengan 560,000 rekod menunjukkan peningkatan dramatik:
SaveChanges()
: Jam
SaveChanges()
selepas 100 rekod: Lebih 20 minit
SaveChanges()
selepas 1000 rekod (tiada pelupusan konteks): 242 saat
SaveChanges()
selepas 1000 rekod (dengan pelupusan konteks): 191 saat
Kesimpulan
Strategi ini meningkatkan prestasi sisipan pukal Rangka Kerja Entiti secara mendadak. Melumpuhkan penjejakan perubahan, menggunakan kelompok SaveChanges()
dan mengurus konteks dengan berkesan adalah kunci untuk mengendalikan set data yang besar dengan cekap.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan Sisipan Rangka Kerja Entiti untuk Prestasi Maksimum Apabila Berurusan dengan Set Data Besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!