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