SQL DELETE - Максимальное количество строк - PullRequest
7 голосов
/ 30 декабря 2011

Какое ограничение должно быть наложено на число строк, которые нужно удалить в операторе SQL?

Нам нужно удалить от 1 до нескольких сотен тысяч строк и нам нужно применить какой-то лимит оптимальной практики, чтобыне обязательно уничтожать сервер SQL или заполнять журналы каждый раз, когда мы очищаем корзину для мусора.

Этот вопрос не относится к какой-либо базе данных.

Ответы [ 6 ]

12 голосов
/ 30 декабря 2011

Это очень очень широкий вопрос, который в основном сводится к "это зависит".Факторы, которые влияют на это, включают:

  • Каков ваш уровень параллелизма?Оператор delete устанавливает исключительную блокировку для затронутых строк.В зависимости от механизма базы данных, распределения удаленных данных и т. Д., Которые могут перейти на страницу или всю таблицуМогут ли ваши читатели данных быть заблокированными на время удаления?

  • Насколько сложен оператор удаления?К скольким другим таблицам вы присоединяетесь или существуют сложные предложения WHERE?Иногда определение удаляемых строк может быть более «дорогим», чем само удаление, поэтому одно большое удаление может быть «более дешевым».

  • Боитесь ли вы тупиковых ситуаций?По мере уменьшения размера удаляемого тупика «отпечаток ноги» уменьшается.В идеале удаление из одной строки всегда будет успешным.

  • Вас интересует производительность?Как и в любом операторе SQL, обычно есть постоянный объем служебных данных (соединения, разбор запросов, возврат результатов и т. Д.).С точки зрения одного соединения, удаление 1000 строк будет быстрее, чем удаление 1000 x 1 строка.

  • Не забывайте о накладных расходах на обслуживание индекса, очистке фрагментации илилюбые триггеры.Они также могут повлиять на вашу систему.

В общем, я ставлю отметку в 1000 строк на утверждение.Большинство систем, с которыми я работал (под-предприятие), в конечном итоге получают от 500 до 5000 записей на удаление.Мне нравится делать что-то вроде этого:

set rowcount 500

select 1    -- Just to force @@rowcount > 0
while @@ROWCOUNT > 0
delete from [table]
     [where ...]
4 голосов
/ 04 января 2012

Хотя ограничение числа строк, затронутых вашим удалением, с помощью параметра set rowcount и последующего выполнения цикла очень хорошо (и я использовал его много раз раньше), имейте в виду, что начиная с SQL 2012 года это не будет опция (см. BOL ).

Следовательно, другой вариант может заключаться в ограничении количества удаляемых строк с помощью предложения TOP. т.е.

SELECT 1

WHILE @@ROWCOUNT > 0
BEGIN
    DELETE TOP (#)
    FROM mytable
    [WHERE ...]
END
1 голос
/ 31 декабря 2011

Всякий раз, когда я вижу базу данных, которая регулярно удаляет большое количество строк, это заставляет меня думать, что модель данных или дизайн обработки не являются оптимальными.Зачем загружать 1 миллион строк, а затем удалять их?Если вам нужно что-то вроде очистки исторических данных, рассмотрите возможность разбиения таблицы.

1 голос
/ 30 декабря 2011

Если у вас нет множества триггеров или ограничений целостности для проверки, удаление не должно быть слишком дорогой операцией.

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

0 голосов
/ 24 августа 2018

Я столкнулся с этим вопросом и нашел свой собственный ответ довольно эффективным: сделайте выборку.

удалить из URL-адресов, в которых находится URL-адрес (выберите из списка 10000 лучших URL-адресов)

0 голосов
/ 30 декабря 2011

общий ответ - отбросить таблицу и воссоздать ее, что является хорошим производительным решением, но применимо для полной таблицы

...