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