我不知道这是否是我如何使用它们或 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 也是如此(我认为)。
有没有办法让它做到这一点?或者我错过了什么?