sql >> Databáze >  >> RDS >> Sqlserver

SQL Vložit data jednoho řádku nebo více řádků?

Ve skutečnosti, jak to máte napsané, vaše první možnost bude rychlejší.

  1. Váš druhý příklad má v sobě problém. Děláte sql =+ sql + atd. To způsobí, že se pro každou iteraci smyčky vytvoří nový objekt typu string. (Podívejte se na třídu StringBuilder). Technicky vzato budete v první instanci také vytvářet nový objekt typu string, ale rozdíl je v tom, že nemusí kopírovat všechny informace z předchozí možnosti řetězce.

  2. Jak to máte nastavené, SQL Server bude muset potenciálně vyhodnotit masivní dotaz, když jej konečně odešlete, což určitě nějakou dobu potrvá, než přijde na to, co má dělat. Měl bych říci, že to závisí na tom, jak velký počet vložek musíte udělat. Pokud je n malé, pravděpodobně budete v pořádku, ale jak bude růst, váš problém se bude jen zhoršovat.

Hromadné vkládání je rychlejší než jednotlivé díky tomu, jak SQL server zpracovává dávkové transakce. Pokud se chystáte vložit data z C#, měli byste použít první přístup a zabalit řekněme každých 500 vložení do transakce a potvrdit ji, pak provést dalších 500 a tak dále. To má také tu výhodu, že pokud dávka selže, můžete je zachytit a zjistit, co se pokazilo, a znovu je vložit. Existují i ​​jiné způsoby, jak to udělat, ale to by rozhodně znamenalo zlepšení oproti dvěma uvedeným příkladům.

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;


  1. Oracle:Existuje způsob, jak získat nedávné chyby syntaxe SQL?

  2. Nelze exportovat tabulku AWS RDS Postgres do CSV v S3 pomocí funkce aws_s3.query_export_to_s3

  3. Příklady DATEDIFF() – MySQL

  4. Aktualizace postgreSQL DB prostřednictvím migrací EFCore v Azure DevOps