0

csv ファイルから読み取り、データをテーブル変数としてストアド プロシージャに送信しています。これまでにテストした結果、3 分 30 秒で 30 万件のレコードを処理できました。ファイルには、何百万ものレコードが含まれている可能性があります。これらすべてのレコードを一度にストアド プロシージャに送信するのが良い考えなのか、それとも 500k のバッチで送信する必要があるのか​​ を知りたかったのです。コマンドのタイムアウトを 1800 に設定しました。

4

1 に答える 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 に答える