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