sql >> Databasteknik >  >> RDS >> Sqlserver

Tabellvärderad parameter:skicka data i små bitar

Ett exempel på att använda IEnumerable SqlDataRecord
Det fungerar ungefär som en omvänd dataläsare

Lägg märke till att jag sorterar. Detta är av det klustrade indexet. Fragmentering av indexen kommer absolut att döda laddningshastigheten. Den första implementeringen använde Insert Values ​​(osorterade) och på en 12 timmars körning är denna version bokstavligen 100 gånger snabbare. Jag inaktiverar också andra index än PK och återindexerar i slutet av laddningen. På lång sikt får jag ungefär 500 rader/sekund. Ditt prov är 1400 / sekund så bra. Om du börjar se försämring då saker att titta på.

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());
    }
}

Andra verktyg att överväga är SQLBulkCopy .NET-klassen och Drapper.

OP frågade hur man presterar i omgångar.

 while (true)
 {
     // if no more break;
     // fill list or datatable with next 100000
     // send list or datatable to db
 }



  1. Varför respekterar inte PL/SQL privilegier som ges av roller?

  2. Återställ rotlösenordet för MySQL Server

  3. Hur får man en lista över sekvensnamn i Postgres?

  4. MySQL - bästa datatypen för enkel tid med timmar och minuter