csv ファイルから読み取り、データをテーブル変数としてストアド プロシージャに送信しています。これまでにテストした結果、3 分 30 秒で 30 万件のレコードを処理できました。ファイルには、何百万ものレコードが含まれている可能性があります。これらすべてのレコードを一度にストアド プロシージャに送信するのが良い考えなのか、それとも 500k のバッチで送信する必要があるのか を知りたかったのです。コマンドのタイムアウトを 1800 に設定しました。
質問する
1139 次
1 に答える
1
IEnumerable SqlDataRecordの使用例
並べ替えることに注意してください。これはクラスター化インデックスによるものです。インデックスの断片化は、読み込み速度を完全に低下させます。最初の実装では値の挿入 (ソートなし) を使用しましたが、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
}
于 2012-09-17T22:45:06.630 に答える