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