Problemas con rendimiento del parámetro de valor de tabla
No sé si esto es un problema con la forma en que los uso o con la implementación de Microsoft, pero los parámetros de valor de tabla de SQL 2008 son extremadamente lentos.
Generalmente si necesito usar un TVP es porque tengo muchos registros; actualmente parecen ser inusualmente lentos para algo más que la menor cantidad de registros.
Los llamo 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();
Ejecuté el generador de perfiles para ver por qué, y la declaració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)
Sin embargo, esa es una forma muy lenta de hacerlo. Sería mucho más rápido si hiciera esto en su lugar:
insert into @data ( ... fields ... )
values ( ... values ... ),
( ... values ... ),
-- for each row
( ... values ... )
No estoy seguro de por qué no está utilizando la sintaxis más nueva y mucho más rápida. O incluso lo que sea que haga bajo el capó conSqlBulkCopy
.
a nueva sintaxis se agregó en SQL 2008, pero también lo están los TVP (creo).
¿Hay alguna opción para que haga esto? ¿O algo que me estoy perdiendo?