IEnumerable SqlDataRecord का उपयोग करने का एक उदाहरण
यह एक तरह से रिवर्स डेटारीडर की तरह काम करता है
सूचना मैं क्रमबद्ध। यह संकुल सूचकांक द्वारा है। इंडेक्स के विखंडन से लोड स्पीड बिल्कुल खत्म हो जाएगी। पहले कार्यान्वयन में इंसर्ट वैल्यू (बिना क्रमित) का उपयोग किया गया था और 12 घंटे के रन में यह संस्करण सचमुच 100x तेज है। मैं लोड के अंत में पीके और रीइंडेक्स के अलावा अन्य इंडेक्स को भी अक्षम करता हूं। लंबे समय में मुझे लगभग 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 वर्ग और ड्रेपर।
ओपी ने पूछा कि बैचों में कैसे प्रदर्शन करना है।
while (true)
{
// if no more break;
// fill list or datatable with next 100000
// send list or datatable to db
}