INSERT con Dapper lleva demasiado tiempo en SQL Azure

azure-sql-database c# dapper

Pregunta

Tengo una instancia de una entidad, con una relación uno a muchos (elementos). Estoy intentando insertar esto en una instancia de SQL Azure a través de Dapper.

El recuento de elementos es ~ 3.5k

using (var transaction = connection.BeginTransaction())
{
  // (...) x inserted here, we want to insert the items next...
  connection.Execute(TSQL_InsertStatement, x.Items, transaction);
  transaction.Commit();
}
  • Localmente (frente a. \ SQLEXPRESS), la ejecución lleva ~ 300-500 [ms]
  • En Azure, la ejecución requiere ~ 8 [s]

Creo que esta acción genera una tonelada de INSERT individuales y esto podría ser un problema. Intenté refacturar esto con una solución "sql generada manualmente", que generó 4x INSERTS (1k, 1k, 1k, 500 filas), sin embargo, la ejecución de esto tomó más de 2 [s] localmente.

  • ¿Hay alguna manera de hacer que esto funcione más rápido con Dapper? Como una inserción a granel tal vez?
  • ¿Hay algo de lo que no estoy enterado con SQL Azure? ¿Como un estrangulamiento oculto?

Respuesta aceptada

El uso de varias inserciones dentro de la misma transacción generalmente es una mala idea en la base de datos SQL de Azure.

Debe usar el procesamiento por lotes para aumentar el rendimiento de las consultas de inserción, consulte https://azure.microsoft.com/en-us/documentation/articles/sql-database-use-batching-to-improve-performance/ . Si es posible, recomendaría los parámetros de valor de tabla, inserción masiva o inserciones parametrizadas múltiples. Estos escenarios se describen en el artículo al que se hace referencia.

La base de datos Azure Sql también tiene soporte JSON, por lo que si su fuente original es una matriz de objetos JSON, puede insertar JSON completo como texto y analizarlo en SQL usando OPENJSON (todavía no hay evidencia de que esto sea más rápido que otros métodos).



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué