Trên thực tế, theo cách bạn viết, tùy chọn đầu tiên của bạn sẽ nhanh hơn.
-
Ví dụ thứ hai của bạn có một vấn đề trong đó. Bạn đang thực hiện sql =+ sql +, v.v. Điều này sẽ tạo ra một đối tượng chuỗi mới được tạo cho mỗi lần lặp lại của vòng lặp. (Kiểm tra lớp StringBuilder). Về mặt kỹ thuật, bạn cũng sẽ tạo một đối tượng chuỗi mới trong trường hợp đầu tiên, nhưng sự khác biệt là nó không phải sao chép tất cả thông tin từ tùy chọn chuỗi trước đó.
-
Theo cách bạn thiết lập, SQL Server sẽ phải có khả năng đánh giá một truy vấn lớn khi cuối cùng bạn gửi nó, điều này chắc chắn sẽ mất một thời gian để tìm ra những gì nó phải làm. Tôi nên nói rằng, điều này phụ thuộc vào số lượng chèn bạn cần thực hiện. Nếu n nhỏ, bạn có thể sẽ ổn, nhưng khi nó phát triển, vấn đề của bạn sẽ chỉ trở nên tồi tệ hơn.
Chèn hàng loạt nhanh hơn so với chèn hàng loạt do cách máy chủ SQL xử lý các giao dịch hàng loạt. Nếu bạn định chèn dữ liệu từ C #, bạn nên thực hiện cách tiếp cận đầu tiên và kết luận cứ 500 lần chèn vào một giao dịch và cam kết, sau đó thực hiện 500 lần tiếp theo, v.v. Điều này cũng có lợi thế là nếu một lô không thành công, bạn có thể bẫy những cái đó và tìm ra những gì đã xảy ra và chỉ chèn lại những cái đó. Có những cách khác để làm điều đó, nhưng đó chắc chắn sẽ là một cải tiến so với hai ví dụ được cung cấp.
var iCounter = 0;
foreach (Employee item in employees)
{
if (iCounter == 0)
{
cmd.BeginTransaction;
}
string sql = @"INSERT INTO Mytable (id, name, salary)
values ('@id', '@name', '@salary')";
// replace @par with values
cmd.CommandText = sql; // cmd is IDbCommand
cmd.ExecuteNonQuery();
iCounter ++;
if(iCounter >= 500)
{
cmd.CommitTransaction;
iCounter = 0;
}
}
if(iCounter > 0)
cmd.CommitTransaction;