Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Metodo corretto per eliminare oltre 2100 righe (per ID) con Dapper

Un'opzione consiste nel creare una tabella temporanea sul server e quindi utilizzare la funzione di caricamento in blocco per caricare tutti gli ID in quella tabella contemporaneamente. Quindi usa una clausola join, EXISTS o IN per eliminare solo i record che hai caricato nella tabella temporanea.

I carichi in blocco sono un percorso ben ottimizzato in SQL Server e dovrebbero essere molto veloci.

Ad esempio:

  1. Esegui l'istruzione CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
  2. Utilizza un caricamento collettivo per inserire le chiavi in ​​#RowsToDelete
  3. Esegui DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
  4. Esegui DROP TABLE #RowsToDelte (la tabella verrà automaticamente eliminata anche se chiudi la sessione)

Esempio di codice (supponendo Dapper):

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));