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

Откуда:
Сообщений: 1197
привет

есть таблица 1 и таблица 2.
надо из таблицы 1 удалить строки которые есть в таблице 2 на основании сравнения 4 полей. Всего в обеих таблицах 8 столбцов и структуры одинаковые.

кол-во строк порядка 200 и 300 млн соотвественно.

как быстрей удалить?
12 сен 12, 14:58    [13152157]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Руководство по производительности загрузки данных

Там и про удаление есть.
12 сен 12, 15:03    [13152198]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Частями:
DECLARE @N BIGINT=100000;
WHILE @@ROWCOUNT>0 DELETE TOP(@N) T1 FROM T2 WHERE T1.F1=T2.F1 AND T1.F2=T2.F2 AND T1.F3=T2.F3 AND T1.F4=T2.F4;
Оптимальное значение @N надо подобрать.
Это чтобы лог не рос.
12 сен 12, 15:06    [13152243]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Jovanny
Руководство по производительности загрузки данных

Там и про удаление есть.
Если не ошибаюсь, там рассматриваются секционированные таблицы.
Так что не для всех случаев.
12 сен 12, 15:12    [13152308]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
relief,

Если количество удаляемого сильно больше того количества, что остается, можно попробовать вычленить то, что должно остаться в отдельную таблицу (копию рабочей), после чего ту из которой надо удалить дропнуть, а ту, в которую скопировали нужные строки, переименовать в рабочую.
12 сен 12, 15:13    [13152323]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
relief
Member

Откуда:
Сообщений: 1197
iap
Частями:
DECLARE @N BIGINT=100000;
WHILE @@ROWCOUNT>0 DELETE TOP(@N) T1 FROM T2 WHERE T1.F1=T2.F1 AND T1.F2=T2.F2 AND T1.F3=T2.F3 AND T1.F4=T2.F4;
Оптимальное значение @N надо подобрать.
Это чтобы лог не рос.


это потому что каждая порция delete будет идти в отдельной транзакции?
а какие критерии при подборе @N ?
12 сен 12, 15:29    [13152466]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
relief
Member

Откуда:
Сообщений: 1197
SomewhereSomehow
relief,

Если количество удаляемого сильно больше того количества, что остается, можно попробовать вычленить то, что должно остаться в отдельную таблицу (копию рабочей), после чего ту из которой надо удалить дропнуть, а ту, в которую скопировали нужные строки, переименовать в рабочую.


пока запустил вариант iap. Прошло 15 минут. еще работает.
12 сен 12, 15:33    [13152509]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
relief
SomewhereSomehow
relief,

Если количество удаляемого сильно больше того количества, что остается, можно попробовать вычленить то, что должно остаться в отдельную таблицу (копию рабочей), после чего ту из которой надо удалить дропнуть, а ту, в которую скопировали нужные строки, переименовать в рабочую.


пока запустил вариант iap. Прошло 15 минут. еще работает.
Триггеры, индексы, FK в других таблицах есть?
Если есть, то для удаления плохо, как Вы понимаете...
Кстати, внутри WHILE можно было добавить что-то типа прогресса (выдавать порядковый номер удаления, к примеру).
Тогда Вы бы говорили не про 15 минут, а про количество удалённых/оставшихся строк.
12 сен 12, 15:38    [13152534]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
relief
Member

Откуда:
Сообщений: 1197
iap
relief
пропущено...


пока запустил вариант iap. Прошло 15 минут. еще работает.
Триггеры, индексы, FK в других таблицах есть?
Если есть, то для удаления плохо, как Вы понимаете...
Кстати, внутри WHILE можно было добавить что-то типа прогресса (выдавать порядковый номер удаления, к примеру).
Тогда Вы бы говорили не про 15 минут, а про количество удалённых/оставшихся строк.


убрал первичный ключ.
прогреес не показывается почему то

SET @DeletedRows = @DeletedRows + @@ROWCOUNT
PRINT 'Deleted' + @DeletedRows
12 сен 12, 15:48    [13152606]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
relief
iap
пропущено...
Триггеры, индексы, FK в других таблицах есть?
Если есть, то для удаления плохо, как Вы понимаете...
Кстати, внутри WHILE можно было добавить что-то типа прогресса (выдавать порядковый номер удаления, к примеру).
Тогда Вы бы говорили не про 15 минут, а про количество удалённых/оставшихся строк.


убрал первичный ключ.
прогреес не показывается почему то

SET @DeletedRows = @DeletedRows + @@ROWCOUNT
PRINT 'Deleted' + @DeletedRows
SET @DeletedRows += @@ROWCOUNT;
RAISERROR(@DeletedRows,0,0) WITH NOWAIT;
12 сен 12, 15:54    [13152659]     Ответить | Цитировать Сообщить модератору
 Re: Как быстро удалить большое кол-во записей?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
relief
iap
пропущено...
Триггеры, индексы, FK в других таблицах есть?
Если есть, то для удаления плохо, как Вы понимаете...
Кстати, внутри WHILE можно было добавить что-то типа прогресса (выдавать порядковый номер удаления, к примеру).
Тогда Вы бы говорили не про 15 минут, а про количество удалённых/оставшихся строк.


убрал первичный ключ.
прогреес не показывается почему то

SET @DeletedRows = @DeletedRows + @@ROWCOUNT
PRINT 'Deleted' + @DeletedRows

print покажется только при завершении batch'а.

используйте raiserror:
set @message = 'Deleted ' + cast(@DeletedRows as nvarchar(12))
raiserror(@message, 0, 0) with nowait
12 сен 12, 15:54    [13152661]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить