Пример за използване на IEnumerable SqlDataRecord
Той работи нещо като обратен четец на данни
Забележете, че сортирам. Това е чрез групирания индекс. Фрагментирането на индексите ще убие абсолютно скоростта на зареждане. Първата реализация използва Insert Values (несортирани) и за 12 часа работа тази версия е буквално 100 пъти по-бърза. Също така деактивирам индекси, различни от PK, и преиндексирам в края на зареждането. В дългосрочен план получавам около 500 реда / секунда. Вашата проба е 1400/секунда, толкова страхотно. Ако започнете да виждате влошаване, трябва да разгледате нещата.
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());
}
}
Други инструменти, които трябва да имате предвид, са класът SQLBulkCopy .NET и Drapper.
OP попита как да изпълнява на партиди.
while (true)
{
// if no more break;
// fill list or datatable with next 100000
// send list or datatable to db
}