sql >> Databasteknik >  >> RDS >> Sqlserver

Korrekt metod för att ta bort över 2100 rader (med ID) med Dapper

Ett alternativ är att skapa en temporär tabell på servern och sedan använda bulkload-funktionen för att ladda upp alla ID:n till den tabellen på en gång. Använd sedan en join-, EXISTS- eller IN-klausul för att ta bort endast de poster som du laddat upp till din tillfälliga tabell.

Bulklaster är en väl optimerad sökväg i SQL Server och den bör vara mycket snabb.

Till exempel:

  1. Kör satsen CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
  2. Använd en bulkladdning för att infoga nycklar i #RowsToDelete
  3. Kör DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
  4. Kör DROP TABLE #RowsToDelte (tabellen kommer också att tas bort automatiskt om du stänger sessionen)

(Förutsatt Dapper) kodexempel:

conn.Open();

var columnName = "ID";

conn.Execute(string.Format("CREATE TABLE #{0}s({0} INT PRIMARY KEY)", columnName));

using (var bulkCopy = new SqlBulkCopy(conn))
{
    bulkCopy.BatchSize = ids.Count;
    bulkCopy.DestinationTableName = string.Format("#{0}s", columnName);

    var table = new DataTable();                    
    table.Columns.Add(columnName, typeof (int));
    bulkCopy.ColumnMappings.Add(columnName, columnName);

    foreach (var id in ids)
    {
        table.Rows.Add(id);
    }

    bulkCopy.WriteToServer(table);
}

//or do other things with your table instead of deleting here
conn.Execute(string.Format(@"DELETE FROM myTable where Id IN 
                                   (SELECT {0} FROM #{0}s", columnName));

conn.Execute(string.Format("DROP TABLE #{0}s", columnName));


  1. Hur man inte bygger PostgreSQL 9.0-tillägg på RPM-plattformar

  2. GROUP_CONCAT() Funktion i MySQL

  3. pg_restore Alternatives - PostgreSQL-säkerhetskopiering och automatisk återställning med ClusterControl

  4. Hur man jämför två rader från samma tabell