我不知道这是我使用方法的问题还是Microsoft的实现问题,但是SQL 2008的表值参数非常慢。
通常情况下,如果我需要使用表值参数,那么是因为有很多记录 - 目前它们似乎对于超过最少记录的任何内容都无法使用。
我在 .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 中添加的,但我认为 TVPs 也是如此。
是否有一些选项可以让它这样做?或者我漏掉了什么?