我不知道这是我使用它们还是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(我认为)也是如此。
有没有一些选择让它做到这一点?或者我错过了什么?
如果SQL事件探查器跟踪被标记为RPC(未批),这意味着所显示的文字是不是被传送线一个真正的文本,而是从实际的RPC参数重新构建的文本。这并不能解释为什么它很慢,但它可能没有意义。 – 2011-05-20 12:40:29