Jedną z opcji jest utworzenie tabeli tymczasowej na serwerze, a następnie użycie funkcji ładowania zbiorczego w celu jednoczesnego załadowania wszystkich identyfikatorów do tej tabeli. Następnie użyj klauzuli join, EXISTS lub IN, aby usunąć tylko rekordy, które przesłałeś do tabeli tymczasowej.
Ładunki zbiorcze są dobrze zoptymalizowaną ścieżką w SQL Server i powinny być bardzo szybkie.
Na przykład:
- Wykonaj instrukcję
CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
- Użyj ładowania zbiorczego, aby wstawić klucze do
#RowsToDelete
- Wykonaj
DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
- Wykonaj
DROP TABLE #RowsToDelte
(tabela zostanie również automatycznie usunięta, jeśli zamkniesz sesję)
(Zakładając Dapper) przykład kodu:
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));