Отмена запроса вставки - PullRequest
3 голосов
/ 22 апреля 2011

Я выполнил запрос, чтобы скопировать 18 миллионов записей из одной таблицы в другую. Поскольку выполнение запроса занимало много времени, я следил за количеством таблиц, чтобы определить, когда он закончится.

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

'Экземпляр компонента SQL Server Database Engine не может получить ресурс LOCK в данный момент. Повторите ваше заявление, когда активных пользователей станет меньше. Попросите администратора базы данных проверить блокировку и конфигурацию памяти для этого экземпляра или проверить наличие длительных транзакций. '

Фактическая вставка работала всего около 20 минут, прежде чем ошибка появилась в журнале. Я отменил запрос от управляющей студии около 2 часов назад, и, судя по количеству таблиц, эта штука завершилась только на 25%, что ставит меня примерно на 6 часов. Я предполагаю, что что-то вроде того, поскольку вся память израсходована, теперь она запускается из файла подкачки, и поэтому она занимает так много времени.

Что я могу сделать, чтобы ускорить это? Это в основном сделало базу данных непригодной для использования, потому что каждый получает ошибку «не удается получить ресурс блокировки». Я мог бы легко удалить вставленные записи самостоятельно, я забочусь, если возможно я мог бы убить идентификатор процесса и «откатить» вставку самостоятельно?

Обновление

Эта штука пока работает удивительно медленно. Одна вещь, которую я обнаружил, состоит в том, что # блокировки, данные следующим запросом, кажутся возмутительными: 83 миллиона. Следующим по величине является колоссальный 20.

SELECT request_session_id, COUNT (*) num_locks
FROM sys.dm_tran_locks
GROUP BY request_session_id
ORDER BY count (*) DESC

Ответы [ 4 ]

0 голосов
/ 03 июля 2013

Я не думаю, что перезагрузка требуется.Перезагрузка SQL Server Service достаточно для того же.Я рекомендую перезагрузить SQL server service.И это решило бы проблему.

0 голосов
/ 22 апреля 2011

После того, как вещь отменена, вам нужно исправить код, чтобы выполнить вставку.Во-первых, если вы работаете по одной записи за раз в курсоре (и все в одной и той же транзакции), это будет длиться вечно.Если вы использовали вставку на основе набора, у вас также может возникнуть проблема, которую вы описываете.Если вы можете сделать это, используя массовую вставку, которая может работать хорошо, или то, что вы делаете, - это сочетание построчного и основанного на множестве подхода, который заключается в запуске пакетов записей в цикле.(Обычно я начинаю с 2000 за раз, и если это быстро, переместите его к большему количеству записей.) Просто убедитесь, что вы проверяете, не пытаетесь ли вы вставлять один и тот же пакет записей повторно.

0 голосов
/ 13 февраля 2012

Решение, которое работало для меня, состояло в том, чтобы перезагрузить сервер. Восстановление базы данных, с которой я работал, заняло 12 часов, но перезагрузка позволила устранить проблемы с ресурсами, которые возникали у нас с приложениями, обращающимися к другим базам данных. В следующий раз, когда я попробовал это, я разбил его на партии по 500 КБ вместо всех 18 миллионов сразу, и все работало нормально.

0 голосов
/ 22 апреля 2011

Отключите все остальные процессы пользователей.Возможно, вам даже придется изменить базу данных на «только администратор», чтобы предотвратить другие подключения.Убедитесь, что у вас нет других запущенных процессов, которые блокируют исходную инструкцию обновления.

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

dbcc dropcleanbuffers

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