Максимизация пропускной способности с TVP

знаю, является ли это проблемой из-за того, как я их использую, или из-за реализации 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 (я думаю).

Есть ли какой-нибудь вариант, чтобы заставить это сделать это? Или что-то, чего мне не хватает?

Ответы на вопрос(2)

Ваш ответ на вопрос