sql >> データベース >  >> RDS >> Sqlserver

テーブル値パラメーター:小さなチャンクでデータを送信する

    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
     }
    



    1. Mysqlサーバーは4バイトでエンコードされたutf8文字をサポートしていません

    2. asp.net / MySQL:ユーザー'' @'localhost'のアクセスが拒否されました(パスワードを使用:NO)

    3. postgres関数から一時テーブルを返す方法は?

    4. OracleJDBCUCPおよびJava