Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tabel Nilai Parameter:mengirim data dalam potongan kecil

Contoh penggunaan IEnumerable SqlDataRecord
Ini bekerja seperti pembaca data terbalik

Perhatikan saya urutkan. Ini dengan indeks berkerumun. Fragmentasi indeks benar-benar akan mematikan kecepatan memuat. Implementasi pertama menggunakan Sisipkan Nilai (tidak disortir) dan dalam 12 jam menjalankan versi ini secara harfiah 100x lebih cepat. Saya juga menonaktifkan indeks selain PK dan mengindeks ulang di akhir pemuatan. Dalam jangka panjang saya mendapatkan sekitar 500 baris / detik. Sampel Anda adalah 1400 / detik sangat bagus. Jika Anda mulai melihat degradasi, maka hal-hal yang harus diperhatikan.

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

Alat lain yang perlu dipertimbangkan adalah kelas SQLBulkCopy .NET dan Drapper.

OP bertanya bagaimana tampil dalam batch.

 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:mengurai nama depan, tengah dan belakang dari bidang nama lengkap

  2. Bagaimana cara memeriksa string Is not Null Dan Is not Empty di SQL server?

  3. Menangani beberapa pembaruan db dari c # di SQL Server 2008

  4. Bagaimana cara mengubah kata sandi sa di SQL Server 2008 express?

  5. Apa perbedaan antara VARCHAR dan NVARCHAR di SQL server - Tutorial SQL Server / T-SQL Bagian 32