sql >> Base de Datos >  >> RDS >> Sqlserver

SQL ¿Insertar datos de una o varias filas?

En realidad, tal como lo tienes escrito, tu primera opción será más rápida.

  1. Tu segundo ejemplo tiene un problema. Está haciendo sql =+ sql + etc. Esto hará que se cree un nuevo objeto de cadena para cada iteración del bucle. (Consulte la clase StringBuilder). Técnicamente, también creará un nuevo objeto de cadena en primera instancia, pero la diferencia es que no tiene que copiar toda la información de la opción de cadena anterior.

  2. De la forma en que lo tiene configurado, SQL Server tendrá que evaluar potencialmente una consulta masiva cuando finalmente la envíe, lo que definitivamente llevará algún tiempo descubrir qué se supone que debe hacer. Debo decir que esto depende de qué tan grande sea la cantidad de inserciones que necesita hacer. Si n es pequeño, probablemente estará bien, pero a medida que crece, su problema solo empeorará.

Las inserciones masivas son más rápidas que las individuales debido a cómo el servidor SQL maneja las transacciones por lotes. Si va a insertar datos de C#, debe tomar el primer enfoque y envolver, digamos, cada 500 inserciones en una transacción y confirmarla, luego hacer las siguientes 500 y así sucesivamente. Esto también tiene la ventaja de que si un lote falla, puede atraparlos y descubrir qué salió mal y volver a insertarlos. Hay otras formas de hacerlo, pero definitivamente sería una mejora con respecto a los dos ejemplos proporcionados.

var iCounter = 0;
foreach (Employee item in employees)
{

   if (iCounter == 0)
  {
    cmd.BeginTransaction;
  }
  string sql = @"INSERT INTO Mytable (id, name, salary) 
    values ('@id', '@name', '@salary')";
  // replace @par with values
  cmd.CommandText = sql; // cmd is IDbCommand
  cmd.ExecuteNonQuery();
  iCounter ++;
  if(iCounter >= 500)
  {
     cmd.CommitTransaction;
     iCounter = 0;
  }
}

if(iCounter > 0)
   cmd.CommitTransaction;