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

Откуда: с холодного севера
Сообщений: 93
Здравствуйте!
Есть табличка, в которой чуть больше 300000000 записей. Таблица имеет 3 индекса (один из них кластерный). В таблице содержатся все звонки по городу. На днях потребовалось удалить записи, которые "старше" 6 месяцев (около 7000000 записей). Больше суток выполнялась данная операция, но так и не выполнилась - пришлось ее тормознуть, т.к. сервер просто лежал все это время, а на нем еще работают другие, очень важные для организации базы.

Вопрос:
1. Кто-нибудь работал с большими объемами данных и как удалять из таких таблиц множество записей.
2. Как влияет кластерный индекс на работу.

Как мне кажется один из способов ускорения - это удалять не кластерные индексы, затем удалять записи и потом заново создавать индексы (все это ночью или в выходные). По крайней мере, закачка данных таким образом происходила быстрее.

Кто сталкивался с подобным, помогите советами.

Заранее спасибо!
11 апр 03, 11:44    [171499]     Ответить | Цитировать Сообщить модератору
 Re: Удаление большого объема записей  [new]
KonstN
Member

Откуда:
Сообщений: 1201
Верно.
Удаление индексов поможет отцу русской демократии.
Можно ещё удалять кусками.
То есть делать транзакции покороче.
Как вариант можно скопировать кусок записей, которые не надо удалять в другую таблицу (или bcp), потом drop и заново создать.
11 апр 03, 11:48    [171514]     Ответить | Цитировать Сообщить модератору
 Re: Удаление большого объема записей  [new]
vap
Member

Откуда:
Сообщений: 487
Если удаляете больше 50% строк, то можно
переименовать таблицу, и в новую залить нужные данные.
а старую табл. можно будет удалить.
11 апр 03, 12:02    [171551]     Ответить | Цитировать Сообщить модератору
 Re: Удаление большого объема записей  [new]
Дмитрий Рождественский
Member

Откуда:
Сообщений: 150
В таких случаях очень важно оценить необходимый размер transaction log и сразу нарастить его до нужного объема. Т.е. удалить 10000 записей, посмотреть, на сколько вырос лог, спрогнозировать его рост при удалении нужного числа записей. Многое станет понятно:

1. Если оценочный размер больше свободного места на винте - удаление вообще не пройдет (кончится место и произойдет rollback)
2. Если требуемый размер получится гигантский - лучше в самом деле удалять постепенно, даже если место есть, т.е. если на 7000000 записей надо гиг лога - увеличить лог до полутора гигов и удалять по миллиону записей за операцию, обрезая лог в промежутках (если не simple backup model конечно).
3. Если требуемый размер получился относительно маленький - дело действительно в индексах.

Далее, если дело в индексах:
1. Надо, чтобы условие, по которому идет удаление, пользовалось индексом. Если такового нет - его можно создать, в отдельной файлгруппе, чтобы основную не засорять.
2. Удалять лишние индексы не вижу смысла: ведь надо удалить всего 2% записей, переиндексация потом займет больше времени.
11 апр 03, 14:32    [171946]     Ответить | Цитировать Сообщить модератору
 Re: Удаление большого объема записей  [new]
Breakneck
Member

Откуда: Kiev
Сообщений: 2454
2Shev: на этом форуме уже сложилось устойчивое мнение, что при необходимости проводить операции удаления/вставки/правки с большим количеством строк необходимо разбивать это количество на небольшие порции.
Например, загоняете операции в цикл и по 100000 строк убиваете транзакциями с небольшими перерывами.

2. Как влияет кластерный индекс на работу.
Кластерный индекс влияет очень существенно. Возможно, что стоит его сначала снести, поудалять строки, а потом создать заново. Кластерный индекс перестраивается в соответствии с физической структурой таблицы, поэтому в случае операций вставки/удаления с большим количеством строк (более 20% таблицы - IMHO) предпочтительнее сносить кластерный индекс, а потом создать заново.
11 апр 03, 16:55    [172270]     Ответить | Цитировать Сообщить модератору
 Re: Удаление большого объема записей  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
если есть возможность - можно сделать так.

Первый вариант.
1. по некоторому критерию вылить данные (которые должны остаться) через BCP в файл.

2. сделать таблице truncate

3. из BCP файла залить таблицу.

Обязательно надо будет снять все констрейнты, если есть ссылающиеся на эту таблицу. Убрать репликацию, если есть. Отключить триггеры.

Второй вариант уже сказали - удалить индексы, особенно кластерный.
Удалять порциями, Recovery model - simple.
11 апр 03, 17:32    [172334]     Ответить | Цитировать Сообщить модератору
 Re: Удаление большого объема записей  [new]
Александр Спелицин
Member

Откуда: Из ближайшего подмосковья.
Сообщений: 2506
Откройте курсор по Вашей таблице, чтобы туда попали только данные для удаления. И затем удаляйте по одной записи.
Да, курсоры это дольше, НО:
1. У Вас будет журналироваться только одна удаляемая запись.
2. Вы всегда можете прерваться, и продолжить удаление следующей ночью.
11 апр 03, 19:08    [172495]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить