Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Табличен стойностен параметър:изпращане на данни на малки парчета

Пример за използване на 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
 }



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Еквивалентът на SQL Server на Sleep():Инструкцията WAITFOR

  2. SQL Server Passthrough заявка като основа за набор от записи DAO в Access

  3. Актуализиране на 4 милиона записа в SQL сървър, използвайки списък с идентификатори на записи като вход

  4. T-sql Нулиране на номера на ред при промяна на полето

  5. Клауза WHERE за тип данни на SQL Server Text