Příklad použití IEnumerable SqlDataRecord
Funguje to trochu jako reverzní čtečka dat
Všimněte si, že třídím. To je podle seskupeného indexu. Fragmentace indexů absolutně zabije rychlost načítání. První implementace používala Insert Values (neřazené) a za 12 hodin běhu je tato verze doslova 100x rychlejší. Také deaktivuji jiné indexy než PK a na konci načtení znovu indexuji. Z dlouhodobého hlediska dostávám asi 500 řádků za sekundu. Váš vzorek je 1400/s, takže skvělé. Pokud začnete vidět degradaci, pak je na co se podívat.
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());
}
}
Další nástroje ke zvážení jsou třída SQLBulkCopy .NET a Drapper.
OP se zeptal, jak postupovat v dávkách.
while (true)
{
// if no more break;
// fill list or datatable with next 100000
// send list or datatable to db
}