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
}