С учетом 10000 идентификаторов записей, как правильно удалить записи? - PullRequest
0 голосов
/ 01 ноября 2011

Что лучше: оператор delete с предложением where, содержащим 10000 или фильтры (например, delete из таблицы, где id = 1 или id = 2, или id = 3 и т. Д.) Или исполняемые операторы delete (например, delete from table, гдеid = 1; удалить из таблицы, где id = 2; и т. д.)?База данных - MS SQL Server.

РЕДАКТИРОВАТЬ

Идентификаторы не являются последовательными, и нет пункта where, который я могу использовать, чтобы перехватить их все (например, где id>100 и id <50), потому что я понятия не имею, как связаны эти идентификаторы (кроме того факта, что они все из одной таблицы).Так что это действительно вопрос производительности. </p>

Ответы [ 3 ]

6 голосов
/ 01 ноября 2011

Где вы взяли идентификаторы для удаления? Конечно, с таким количеством они где-то в базе данных. Если это так, вы делаете это так:

DELETE FROM MyTable 
WHERE ID IN ( /* Select query that returns your 10000 IDs here */ )

Если их нет в базе данных, добавьте их , даже если это означает создание таблицы для хранения их, которая будет существовать достаточно долго, чтобы завершить это.

2 голосов
/ 01 ноября 2011

Для производительности худший метод - удалять по одной строке за раз.Однако одновременное удаление слишком большого количества файлов также может привести к проблемам пользователей с блокировкой и блокировкой.Часто лучшая ставка - гибрид двух, где вы удаляете партию (скажем, около 1000 записей) за раз.

Теперь это становится намного сложнее, если учесть, что удаляемые записи могут иметь дочерние записи в другой таблице.Некоторые люди выполняют удаление, затем с помощью каскадного удаления, а другие начинают с дочерних таблиц и работают.Любая из этих ситуаций может означать, что у вас есть значительно больше, чем 10000 записей для удаления, и тогда пакеты должны быть меньше, чтобы избежать блокировки.Некоторые люди могут захотеть делать одну запись за раз в этом случае, чтобы гарантировать, что сбой, если существующая дочерняя запись не была удалена первой, все остальные записи все равно будут вставлены, и вы будете знать, какие записи потерпели неудачу.это особенно верно в отношении типов записей, когда само существование дочерней записи означает, что вы не должны удалять родителя (вы не можете удалить клиента, который фактически купил вещи, или финансовые записи испортили все, например).

1 голос
/ 01 ноября 2011

Являются ли идентификаторы последовательными? Если это так, вы можете выполнить следующую инструкцию SQL:

DELETE FROM table_name 
WHERE ID BETWEEN id_lowest and id_highest;
...