これが私の使用方法の問題なのか、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 も同様です (私はそう思います)。
これを行うためのオプションはありますか?それとも私が行方不明ですか?