No sé si esto es un problema con la forma en que los estoy usando o la implementación de Microsoft, pero los parámetros de valor de tabla de SQL 2008 son extremadamente lentos.Problemas con el rendimiento de parámetro de valor de tabla
Generalmente, si necesito usar un TVP es porque tengo muchos registros, actualmente parecen ser inusualmente lentos para algo más que el menor número de registros.
los estoy llamando en .Net así:
// 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();
me encontré perfilador para ver por qué, y la instrucción SQL real es algo como esto:
declare @data table ...
insert into @data (... fields ...) values (... values ...)
-- for each row
insert into @data (... fields ...) values (... values ...)
sprocName(@data)
Esa es una muy lenta manera de hacerlo sin embargo. Sería mucho más rápido si lo hiciera en su lugar:
insert into @data (... fields ...)
values (... values ...),
(... values ...),
-- for each row
(... values ...)
No estoy seguro de por qué no está usando la sintaxis nueva, mucho más rápido. O incluso lo que sea que haga bajo el capó con SqlBulkCopy
.
La nueva sintaxis se agregó en SQL 2008, pero también lo son los TVP (creo).
¿Hay alguna opción para hacerlo? O algo que me estoy perdiendo?
Si trazas del Analizador de SQL están marcados como RPC (no lotes), significa que el texto que se muestra no es un texto real que se transmite de alambre , pero un texto reconstruido a partir de los parámetros reales de RPC. Eso no explica por qué es lento, pero puede no ser significativo. –