Проблемы с производительностью параметра табличного значения

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

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

13
задан Solomon Rutzky 24 March 2017 в 02:51
поделиться