MS SQL: лучший способ удалить строки из огромной таблицы - PullRequest
2 голосов
/ 04 октября 2011

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 04 октября 2011

Опции

  • Почему бы не взять 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
2 голосов
/ 04 октября 2011

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

...