Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Einzeilige oder mehrzeilige Daten einfügen?

So wie du es geschrieben hast, wird deine erste Option tatsächlich schneller sein.

  1. Ihr zweites Beispiel enthält ein Problem. Sie tun sql =+ sql + etc. Dies wird dazu führen, dass für jede Iteration der Schleife ein neues Zeichenfolgenobjekt erstellt wird. (Schauen Sie sich die StringBuilder-Klasse an). Technisch gesehen werden Sie zunächst auch ein neues String-Objekt erstellen, aber der Unterschied besteht darin, dass es nicht alle Informationen aus der vorherigen String-Option kopieren muss.

  2. So wie Sie es eingerichtet haben, muss SQL Server möglicherweise eine umfangreiche Abfrage auswerten, wenn Sie sie schließlich senden, was definitiv einige Zeit in Anspruch nehmen wird, um herauszufinden, was es tun soll. Ich sollte sagen, dass dies davon abhängt, wie viele Einsätze Sie machen müssen. Wenn n klein ist, werden Sie wahrscheinlich in Ordnung sein, aber wenn es wächst, wird Ihr Problem nur noch schlimmer.

Masseneinfügungen sind schneller als einzelne, da der SQL-Server Stapeltransaktionen handhabt. Wenn Sie Daten aus C# einfügen möchten, sollten Sie den ersten Ansatz wählen und beispielsweise alle 500 Einfügungen in eine Transaktion einbinden und festschreiben, dann die nächsten 500 ausführen und so weiter. Dies hat auch den Vorteil, dass Sie, wenn ein Stapel fehlschlägt, diese abfangen und herausfinden können, was schief gelaufen ist, und nur diese erneut einfügen können. Es gibt andere Möglichkeiten, dies zu tun, aber das wäre definitiv eine Verbesserung gegenüber den beiden bereitgestellten Beispielen.

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;