17

これが私の使用方法の問題なのか、Microsoft の実装の問題なのかはわかりませんが、SQL 2008 のテーブル値パラメーターは非常に遅いです。

一般に、TVP を使用する必要がある場合、それは大量のレコードを持っているためです。現在、最も少ないレコード以外では使用できないほど遅いようです。

私は次のように.Netでそれらを呼び出しています:

// get the data
DataTable data = GetData();

com.CommandText = "sprocName"

// create the table-value parameter
var tvp = com.Parameters.AddWithValue("data", data);
tvp.SqlDbType = SqlDbType.Structured;

com.ExecuteNonQuery();

理由を確認するためにプロファイラーを実行したところ、実際の SQL ステートメントは次のようになります。

declare @data table ...

insert into @data ( ... fields ... ) values ( ... values ... )
-- for each row
insert into @data ( ... fields ... ) values ( ... values ... )

sprocName(@data)

しかし、それは本当に遅い方法です。代わりにこれを行うと、はるかに高速になります。

insert into @data ( ... fields ... ) 
values ( ... values ... ),
       ( ... values ... ),
       -- for each row
       ( ... values ... )

より新しい、はるかに高速な構文を使用しない理由がわかりません。または、ボンネットの下で行うことは何でもSqlBulkCopy

新しい構文は SQL 2008 で追加されましたが、TVP も同様です (私はそう思います)。

これを行うためのオプションはありますか?それとも私が行方不明ですか?

4

2 に答える 2

5

「テーブル値パラメーターと BULK INSERT 操作」セクションを参照して
ください http://msdn.microsoft.com/en-us/library/bb510489.aspx

引用: 「... テーブル値パラメーターは、1000 行未満の挿入に適しています。」

また、挿入操作の速度に基づいて使用するテクノロジを示す表もあります。

これがお役に立てば幸いです。

于 2011-05-20T12:36:10.660 に答える