Удалить занимает много времени - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть таблица с 5,5 миллионами записей. Мне нужно удалить некоторые записи из него на основе даты. Мой запрос выглядит так:

DELETE FROM Table WHERE [Date] between '2011-10-31 04:30:23' and '2011-11-01 04:30:42'

Это около 9000 строк, но эта операция длится очень долго. Как я могу ускорить это? Date - тип datetime2, таблица имеет первичный ключ int, кластеризованный. Триггеры обновления и удаления отключены.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Вполне возможно, что [Date] приводится к строке в каждой строке, что приводит к последовательному сканированию всей таблицы.

Вместо этого вы должны попробовать привести ваши параметры к дате:

DELETE FROM Table WHERE [Date] between convert(datetime, '2011-10-31 04:30:23') and convert(datetime, '2011-11-01 04:30:42')

Кроме того, убедитесь, что есть индекс [Date]

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

Сначала убедитесь, что у вас есть индекс на дату.

Если есть индекс, проверьте план выполнения и убедитесь, что он его использует.Обратите внимание, что не всегда следует, что использование индекса является наиболее эффективным методом обработки удаления, потому что, если вы удаляете большую часть записей (практическое правило превышает 10%), дополнительные издержки на просмотр индексаup может быть больше, чем полное сканирование.

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

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

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

...