8

SQLServer2008r2にデータを書き込む.NETアプリケーションを作成しています。データを挿入するには、大きな文字列の挿入ステートメントを作成してテキストコマンドとして送信するか、.NET DataTableにデータを収集して、テーブル値パラメーターとして渡すかの2つのオプションがあります。それぞれの方法の利点とコストは何ですか?

(特定の構文ではなく、相対的な利点について質問しているだけなので、多くのコードを省略しています)

例えば:

オプション1:

    string insert = @"insert into MyTable (id, val) values
        ( 1, 'a'),(2,'b'),(3,'c'),(4,'d');"

オプション2:

    DataTable dt = new DataTable();
    dt.Columns.Add("id", typeof(int));
    dt.Columns.Add("val", typeof(string));
    ....
    create procedure uspMyProc 
                    @tt ttMyTableType readonly
                as
                begin
                    insert into TestTable1 (id, strValue)
                    select myId, myVal from @tt;
                end"

助けてくれてありがとう。

4

3 に答える 3

7

オプション3:最初に、挿入ストアドプロシージャに1つの挿入ステートメントに相当するパラメータを入力し、C#コードからループ内で複数回呼び出します。

オプション4:挿入する行が本当にたくさんある場合は、 SqlBulkCopyクラスを調べる必要があります。DataTableDataRowまたはのいずれかを消費しますIDataReader。いくつかのカスタムコードを使用してオブジェクトのリストからを作成できますIDataReader。この同類の質問はここで尋ねられます:

型指定されたリストからIDataReaderを取得します


状況次第だと思います。

何らかの理由で、本当に多くの行のパラメーターを表形式で渡したい場合は、テーブル値のパラメーターを使用してください。これが目的です。

オプション1を見てきました-いくつかの一般的なDALコードは、実行するコマンドのSQL「バッチ」をスクリプト化します。それは機能しましたが、インジェクション攻撃に対する防御はありませんでした。パラメータ化されたSQLはそうします。


そうは言っても、コードから挿入される各行に対して1回挿入sprocを呼び出すことをお勧めします。呼び出しは完全にパラメーター化され、パフォーマンスは良好です。パフォーマンスが問題になる場合は、オプション4をお勧めします。

于 2012-05-25T15:29:16.233 に答える
5

どれくらい大きいですか?それが巨大な場合、SqlBulkCopyに勝るものはありません。私は実際にTVPのパフォーマンスが期待外れであることに気づきました。クエリプランを再利用するために、私はパラメータ化されて大量に再利用されるステートメントのファンです。Dapperはこれを支援し、オブジェクトのリストをクエリに渡すことができます。これにより、オブジェクトごとにメンバー名ごとに名前付きパラメーターが追加され、1秒あたり数千回の操作が行われます。例えば:

conn.Execute(
    "insert foo (Id,Name) values (@Id,@Name)",
    listOfObjects);

これにより、リストが繰り返され.Id.Name各オブジェクトから順番にクエリが実行されます。

于 2012-05-25T15:36:05.737 に答える
4

値は1000に制限されています

そして、値にはいくつかのパフォーマンスの問題があるようです

複数の値でパフォーマンスの問題を挿入

私は何千もの行を挿入するためにTVPを使用しており、それは私にとって素晴らしい働きをします。DataTableのオーバーヘッドが大きいため、TVPソースとしてListコレクションを使用します。可能であれば、PKでソートされた行を挿入します。

そうは言っても、私はマーク・グラヴェルからの答えを試してみるつもりです。

JNKはTVPに一般的な不信感を抱いています。

于 2012-05-25T15:42:33.527 に答える