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