Удаление 500 записей из таблицы с 1 миллионом записей не должно занять много времени

Я надеюсь, что кто-то может помочь мне. У меня есть простое заявление SQL

delete from sometable 
where tableidcolumn in (...)

У меня есть 500 записей, которые я хочу удалить и воссоздать. Таблица недавно выросла до более чем 1 млн записей. Проблема в том, что приведенное выше утверждение занимает более 5 минут без завершения. У меня есть первичный ключ и 2 не кластерных не уникальных индекса. Мой оператор удаления использует первичный ключ.

Может ли кто-нибудь помочь мне понять, почему это утверждение занимает так много времени и как я могу ускорить его?

2 ответа

TL;DR: не делайте этого (вместо большого предложения in: предварительная загрузка и использование временной таблицы).

Из-за количества параметров, неизвестной конфигурации бэкэнда (даже если по сегодняшним меркам все должно быть в порядке) и неспособности угадать, какой у вас объем памяти в процессе обработки, вы можете использовать (по порядку) стек, пакет или память ограничение размера, начиная с этого ответа. Также возможно превышение предела размера инструкции.

Комментарии по устранению неполадок могут привести вас к другому ответу. Мой стержень - это предложение "in", размер оператора, и что все эти ссылки содержат рекомендации по предварительной загрузке временной таблицы и использованию ее в вашем запросе.

Сначала я бы посмотрел на две области: блокировка и плохой план.

Блокировка - запустите ваш запрос, и пока он выполняется, посмотрите, не блокируется ли он чем-либо еще "select * from sys.dm_exec_requests, где blocking_session_id <> 0", если вы видите что-либо, блокирующее ваш запрос, то я бы начал с рассмотрения:

https://www.simple-talk.com/sql/database-administration/the-dba-as-detective-troubleshooting-locking-and-blocking/

Если нет блокировки, то получите план выполнения для вставки, что он делает? это исключительно высоко?

Кроме того, как долго вы ожидаете, что это займет? Это немного длиннее или намного длиннее? Это стало настолько медленным после того, как оно значительно выросло, или же оно становилось медленнее в течение длительного периода времени?

Какова производительность ввода / вывода, каково ваше среднее время чтения / записи и т. Д. И т. Д.

Другие вопросы по тегам