Une option consiste à créer une table temporaire sur le serveur, puis à utiliser la fonction de chargement en bloc pour télécharger tous les ID dans cette table en une seule fois. Utilisez ensuite une jointure, une clause EXISTS ou IN pour supprimer uniquement les enregistrements que vous avez chargés dans votre table temporaire.
Les chargements en bloc sont un chemin bien optimisé dans SQL Server et il devrait être très rapide.
Par exemple :
- Exécutez l'instruction
CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
- Utilisez un chargement groupé pour insérer des clés dans
#RowsToDelete
- Exécuter
DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
- Exécuter
DROP TABLE #RowsToDelte
(le tableau sera également supprimé automatiquement si vous fermez la session)
Exemple de code (en supposant que 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));