Một ví dụ về việc sử dụng IEnumerable SqlDataRecord
Nó hoạt động giống như một chương trình dữ liệu ngược
Chú ý tôi sắp xếp. Đây là bởi chỉ mục được phân nhóm. Sự phân mảnh của các chỉ mục sẽ giết chết tốc độ tải. Lần triển khai đầu tiên sử dụng Giá trị Chèn (không được sắp xếp) và trong 12 giờ chạy phiên bản này nhanh hơn 100 lần theo đúng nghĩa đen. Tôi cũng vô hiệu hóa các chỉ mục khác với PK và lập chỉ mục khi kết thúc tải. Về lâu dài, tôi nhận được khoảng 500 hàng / giây. Mẫu của bạn là 1400 / giây quá tuyệt vời. Nếu bạn bắt đầu thấy sự xuống cấp thì những thứ cần xem xét.
public class DocFTSinXsCollection : List<DocFTSinX>, IEnumerable<SqlDataRecord>
{
// used by TVP for fast insert
private int sID;
private IEnumerable<DocFTSinX> docFTSinXs;
IEnumerator<SqlDataRecord> IEnumerable<SqlDataRecord>.GetEnumerator()
{
//todo fix the order in 3 to sID, wordID1, workID2
var sdr = new SqlDataRecord(
new SqlMetaData("wordID1", System.Data.SqlDbType.Int),
new SqlMetaData("wordID2", System.Data.SqlDbType.Int),
new SqlMetaData("sID", System.Data.SqlDbType.Int),
new SqlMetaData("Delta", System.Data.SqlDbType.Int));
foreach (DocFTSinX oh in docFTSinXs.OrderBy(x => x.Word1).ThenBy(x => x.Word2))
{
sdr.SetInt32(0, oh.Word1);
sdr.SetInt32(1, oh.Word2);
sdr.SetInt32(2, sID);
sdr.SetInt32(3, (Int32)oh.Delta);
yield return sdr;
}
}
public DocFTSinXsCollection(int SID, IEnumerable<DocFTSinX> DocFTSinXs)
{
sID = SID;
docFTSinXs = DocFTSinXs;
//Debug.WriteLine("DocFTSinXsCollection DocFTSinXs " + DocFTSinXs.Count().ToString());
}
}
Các công cụ khác cần xem xét là lớp SQLBulkCopy .NET và Drapper.
OP hỏi cách thực hiện theo lô.
while (true)
{
// if no more break;
// fill list or datatable with next 100000
// send list or datatable to db
}