sql >> Databáze >  >> RDS >> Sqlserver

Table Valued Parameter:odesílání dat po malých částech

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
 }



  1. Usnadnění správy produkční databáze PostgreSQL

  2. jak nastavit pole jako uživatelskou proměnnou mysql

  3. Bezpečný přenos dat z SQL serveru na SQL server přes internet

  4. Výjimka připojení ODP.NET