Je ne sais pas si c'est un problème avec la manière dont je les utilise ou avec l'implémentation de Microsoft, mais les paramètres de valeur de table SQL 2008 sont extrêmement lents.Problèmes avec les performances des paramètres de table
Généralement, si j'ai besoin d'utiliser un TVP c'est parce que j'ai beaucoup d'enregistrements - actuellement ils semblent être inutilement lents pour quelque chose de plus que le moins d'enregistrements.
Je les appelle en .Net comme ceci:
// 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();
J'ai couru profileur pour voir pourquoi, et l'instruction SQL réelle est quelque chose comme ceci:
declare @data table ...
insert into @data (... fields ...) values (... values ...)
-- for each row
insert into @data (... fields ...) values (... values ...)
sprocName(@data)
C'est vraiment lent manière de le faire cependant. Il serait beaucoup plus rapide si elle a fait ceci:
insert into @data (... fields ...)
values (... values ...),
(... values ...),
-- for each row
(... values ...)
Je ne sais pas pourquoi il n'utilise pas la plus récente, la syntaxe beaucoup plus rapide. Ou même tout ce qu'il fait sous le capot avec SqlBulkCopy
.
La nouvelle syntaxe a été ajoutée dans SQL 2008, mais il en va de même pour les TVP (je pense).
Y at-il une option pour le faire faire? Ou quelque chose qui me manque?
Si des traces SQL profileurs sont marqués comme RPC (non lots), cela signifie que le texte affiché n'est pas un vrai texte qui a été le fil transmis , mais un texte reconstruit à partir des paramètres RPC réels. Cela n'explique pas pourquoi c'est lent, mais cela peut ne pas être significatif. –