Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Быстрое удаление  [new]
beaver06
Member

Откуда:
Сообщений: 681
Добрый день!
Подскажите, пожалуйста, как можно наиболее быстро удалить данные из большой таблицы (200 млн.)? Некластерный индекс по _date и id. Кластерный по id.
Надо удалить все записи ранее 2014 года. Таблица без секций. Процедура разовая, но будет повторяться раз в несколько месяцев.

В данное время пробую так:

DECLARE @RowsDeleted INTEGER
SET @RowsDeleted = 1

WHILE (@RowsDeleted > 0)
BEGIN
DELETE TOP (10000) FROM MyTable WHERE _date < '2014-01-01 00:00:00.000'
SET @RowsDeleted = @@ROWCOUNT
END

Может будет быстрее сначала создать ключ по полю datetime, а потом удалять?
Или еще как-то?
23 апр 14, 11:59    [15921370]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Ну так а план выполнения у DELETE какой?
23 апр 14, 12:01    [15921390]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
секционирование
Guest
beaver06,

секционировать таблицы за тот промежуток времени, который необходим. Далее просто очищать ту или иную секцию.
23 апр 14, 12:36    [15921720]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
Создайте новую таблицу без индексов, перелейте остаток, переименуйте старую, переименуйте новую в старую. Таблицу дропните, затем свежую проиндексируйте.
23 апр 14, 12:41    [15921774]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
секционирование
beaver06,

секционировать таблицы за тот промежуток времени, который необходим. Далее просто очищать ту или иную секцию.
Не очищать, а отключать.
23 апр 14, 12:46    [15921814]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
Переключать секции вообще хорошо, т.к. переключенную секцию можно переключить дропнуть моментально.
23 апр 14, 12:48    [15921837]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
dvim
Member

Откуда: Санкт Петербург
Сообщений: 711
beaver06,

Может будет быстрее сначала создать ключ по полю datetime, а потом удалять?

А не лучше сначала вычислить "id на удаление" во временную таблицу, а потом по ней удалять.
Причем иногда есть смысл удалять партиями , чтоб не было блокировок.
23 апр 14, 12:53    [15921881]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
Daba
Member

Откуда:
Сообщений: 135
Если удалять надо, скажем больше половины записей, то смотрите пост В. Колосова. Если удаляется меньшая часть то можно порциями (скажем по 10К). Для этого стоит сделать контрольную табличку с номером последней записи. Так можно остановить и продолжить процесс по желанию без полного отката. Брать каждую порцию по индексу.
23 апр 14, 12:53    [15921887]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
beaver06
Member

Откуда:
Сообщений: 681
Секционирование ни как не пойдет.
Тип поля id binary(16). С таким типом есть ли смысл делать сначала временную таблицу.
23 апр 14, 13:17    [15922154]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
aleks2
Guest
beaver06
Добрый день!
Подскажите, пожалуйста, как можно наиболее быстро удалить данные из большой таблицы (200 млн.)?
Или еще как-то?


Задать себе вопрос: "нафига быстро?"

Куда торопимся?
23 апр 14, 13:41    [15922410]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое удаление  [new]
beaver06
Member

Откуда:
Сообщений: 681
aleks2,

имеется ввиду не быстро, а быстрее всего.
23 апр 14, 13:47    [15922478]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить