MS SQL: лучший способ удалить строки из огромной таблицы

У меня очень большая таблица [X], в которой 170 миллионов строк, и нам нужно архивировать данные, чтобы хранить только использованные записи в [X]. Мы делаем это, чтобы наша система работала быстро, так как она замедляется. Мы используем только небольшое количество строк из всей таблицы (если говорить менее 10%), поэтому мы можем позволить архивировать большое количество данных, например, в Архив.[X].

Проблема в том, что когда мы пытаемся удалить записи, это занимает много времени. Теперь мы выполнили следующие проверки для устранения неполадок, чтобы увидеть любые возможности, почему это занимает столько времени: 1) таблица индексируется 2) нет неиндексированных внешних ключей 3) нет триггеров, выполняющих дополнительную работу в фоновом режиме при удалении

Кто-нибудь из вас сталкивался с подобным сценарием? Какова лучшая процедура, чтобы следовать, делая что-то подобное? И есть ли какие-нибудь инструменты, которые могут помочь?

Я ценю вашу помощь!

2 ответа

Решение

Опции

  • Почему бы не взять 10% в новый стол?
  • Пакетное удаление / вставка не в транзакции (см. Ниже)
  • Таблица разделов (иначе пусть двигатель справится с этим)

Заполнить архивную таблицу

SELECT 'starting' -- sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
BEGIN
    DELETE TOP (50000) dbo.Mytable
    OUTPUT DELETED.* INTO ArchiveTable 
    WHERE SomeCol < <Afilter>

    -- maybe CHECKPOINT

    WAIT FOR DELAY ...
END

Вы должны пойти на разделение вашей базы данных / таблицы.

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