Оптимизация удаления на SQL Server - PullRequest
38 голосов
/ 05 июня 2009

Delete с на сервере sql иногда медленны, и мне часто нужно было оптимизировать их, чтобы сократить необходимое время. Я немного погуглил в поисках советов, как это сделать, и нашел разные предложения. Я хотел бы знать ваши любимые и наиболее эффективные технические приемы, чтобы приручить удаление зверя, и как и почему они работают.

до сих пор:

  • убедитесь, что внешние ключи имеют индексы

  • убедитесь, что индексируются условия

  • использование WITH ROWLOCK

  • уничтожить неиспользуемые индексы, удалить, перестроить индексы

теперь ваша очередь.

Ответы [ 15 ]

2 голосов
/ 05 июня 2009

Я добавлю еще один к этому:

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

1 голос
/ 05 июня 2009

У вас есть внешние ключи с активированной ссылочной целостностью? У вас есть активные триггеры?

1 голос
/ 05 июня 2009

Если верно, что ОБНОВЛЕНИЯ выполняются быстрее, чем УДАЛИТЬ, вы можете добавить столбец состояния под названием УДАЛЕНО и отфильтровать его по своему выбору. Затем запустите процесс ночью, который выполняет фактическое удаление.

1 голос
/ 05 июня 2009

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

0 голосов
/ 27 марта 2016

Упростите любое использование функций в предложении WHERE! Пример:

DELETE FROM Claims
WHERE dbo.YearMonthGet(DataFileYearMonth) = dbo.YearMonthGet(@DataFileYearMonth)

Эта форма предложения WHERE требовала 8 минут для удаления 125 837 записей.

Функция YearMonthGet состоит из даты и года и месяца из введенной даты и устанавливает day = 1. Это должно было гарантировать, что мы удалили записи на основе года и месяца, но не дня месяца.

Я переписал предложение WHERE:

WHERE YEAR(DataFileYearMonth) = YEAR(@DataFileYearMonth)
AND MONTH(DataFileYearMonth) = MONTH(@DataFileYearMonth)

Результат: для удаления этих 125 837 записей потребовалось около 38-44 секунд!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...