Tôi đã giải quyết vấn đề này được 2 ngày và tôi không thể tìm ra giải pháp.
sử dụng (Bối cảnh TaxablePersonContext = new TaxablePersonContext(this.ConnectionString))
{
bối cảnh.Configuration.AutoDetectChangesEnabled = false;
foreach(TaxablePerson p in people) // Persons luôn có kích thước 1000
{
// TaxablePerson có một số thuộc tính khác như Name, VatId, Street,...
p.RecCreatedBy = "tên ứng dụng";
p.RecCreatedOn = this.SynchronizationStartDateTime;
p.RecModifiedBy = "tên ứng dụng";
p.RecModifiedOn = this.SynchronizationStartDateTime;
p.RecSyncDate = this.SynchronizationStartDateTime;
p.RecActive = true;
}
DateTime start1 = DateTime.Now;
bối cảnh.TaxablePersons.AddRange(người);
TimeSpan end1 = DateTime.Now.Subtract(start1);
DateTime start2 = DateTime.Now;
context.SaveChanges();
TimeSpan end2 = DateTime.Now.Subtract(start1);
}
Tôi mất gần 10 giây để chèn 1000 bản ghi vào máy chủ sql và 98 giây để chèn 10.000 bản ghi. Bạn có thể vui lòng đề xuất cách cải thiện hiệu suất chèn Entity Framework không. Tôi đã đọc bài viết nàyCách chèn nhanh nhất vào khung thực thểvà bao gồm các thủ thuật được đề cập trong bài viết này nhưng tốc độ chèn vẫn rất chậm. Tôi cần chèn 260.000 bản ghi và mất 52 phút. Tôi đang chèn một lô 1000 và đoạn mã trên thể hiện điều này. Dữ liệu được đọc từ một tệp và khi tôi đạt tới 1000 bản ghi, tôi sẽ đồng bộ hóa với cơ sở dữ liệu. Tôi có thể làm gì khác? Có người đã đề cập rằng cài đặt context.Configuration.AutoDetectChangesEnabled = false khi sử dụng; hiệu suất được cải thiện từ phút sang giây. Tôi đang thiếu gì? Tôi đang sử dụng Entity Framework 6.1.3.
Ví dụ, bằng cách sử dụng trình lược tả sql, tôi thấy rằng khung Thực thể gửi các truy vấn lần lượt
XÁC NHẬN VÀO MyTable (id, tên) GIÁ TRỊ (1, 'Bob')
CHÈN VÀO MyTable (id, tên) GIÁ TRỊ (2, 'Peter')
XÁC NHẬN VÀO MyTable (id, tên) GIÁ TRỊ (3, 'Joe')
Vì vậy, trên thực tế, máy chủ sql rất chậm khi thực hiện 1000 lần chèn trong trường hợp này - gần 10 giây (mặc dù thực hiện trong một giao dịch). Sau đó, tôi xây dựng phần chèn có nhiều giá trị - SQL có nhiều giá trị và phần chèn có 1000 bản ghi mất 5 giây (tốt hơn 50% - sớm hơn 10 giây). SQL Server có giới hạn về tham số SQL mà bạn có thể chuyển là 2100, vì vậy đây là cách tốt nhất bạn có thể thực hiện với phương pháp này.
void riêng tư MultiRecordsInsert(Ngữ cảnh TaxablePersonContext, Danh sách PersonToAdd)
{
Danh sách tham số = Danh sách mới();
string firstQuery = @"chèn vào giá trị TaxablePerson (c1, c2, c3) ";
truy vấn chuỗi = firstQuery;
for (int i = 0; i < PersonToAdd.Count; i++)
{
truy vấn += "(@c1" + i.ToString();
truy vấn += ",@c2" + i.ToString();
truy vấn += ",@c3" + i.ToString() + "),";
tham số.Add(SqlParameter mới("@c1" + i.ToString(), PersonToAdd[i].c1));
tham số.Add(SqlParameter mới("@c2" + i.ToString(), PersonToAdd[i].c2));
tham số.Add(SqlParameter mới("@c3" + i.ToString(), PersonToAdd[i].c3));
// bảng có 16 cột (ở đây tôi rút gọn lại cho đơn giản) nên: 2100/16 = 131,
// đã sử dụng 100
//
nếu (tôi% 100 == 0)
{
query = query.Substring(0, query.Length - 1);
bối cảnh.Database.ExecuteSqlCommand(truy vấn, tham số.ToArray());
truy vấn = firstQuery;
tham số = Danh sách mới();
}
}
if (parameters.Count > 0) // những gì còn lại
{
truy vấn = query.Substring(0, query.Length - 1);
bối cảnh.Database.ExecuteSqlCommand(truy vấn, tham số.ToArray());
}
}
Tôi là một lập trình viên xuất sắc, rất giỏi!