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

Откуда:
Сообщений: 4
Доброго времени суток,

В работе с большими объемами новичке, болно не бейте
Есть таблица с большим количеством повторяющих записей индексов нету

Нужно заменить повторяющиеся данные на IP

Для пример есть таблица logs и в ней поле status с повторяющимися значениями
Была создана таблица status с колонками ip,status

Первое что пришло в голову

update logs set logs.status = status.id
from logs with (nolock) inner join status on logs.status = status.status
where logs.status not in ('abc','def')


данная конструкция переполняла лог транзакций ,было найдено такое решени http://www.sqlservercurry.com/2011/02/fastest-way-to-update-rows-in-large.html

работает по прежнему очень долго



Гуру подскажите как быть и сделать быстро-правильно
20 авг 14, 20:03    [16470690]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
DormidontLoewe
Member [заблокирован]

Откуда: Лондонобад
Сообщений: 72
384млн записей - это много записей.
Апдейтится будет по-любому не быстро.

Приведите структуру таблиц с примером записей в каждой.
20 авг 14, 20:28    [16470754]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Чтобы было быстро, надо сделать так, чтобы не надо было апдейтить 384 млн записей.
20 авг 14, 20:29    [16470758]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
babona
Member [заблокирован]

Откуда: Батуринск
Сообщений: 1816
перелейте в новую таблицу с обновленными значениями, потом замените прежнюю таблицу на новую
20 авг 14, 20:33    [16470773]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
SERG1257
Member

Откуда:
Сообщений: 2873
babona
перелейте в новую таблицу с обновленными значениями, потом замените прежнюю таблицу на новую
+1
Особенно если переключится на режим восстановления минимум Bulk-Logged и создавать таблицу путем select into

Заодно подумайте над
1 созданием кластерного индекса (для логов хорошо подходит дата-время)
2 секционированием вашей монстр таблице хотябы вьюхами
http://technet.microsoft.com/en-us/library/ms190019(v=sql.105).aspx
20 авг 14, 21:11    [16470859]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35369
Блог
qwexak,

обновляйте по частям
20 авг 14, 21:35    [16470943]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
хмхмхм
Guest
qwexak,

быстрее будет однозначно вставка в другую таблицу, затем её переименование
21 авг 14, 14:46    [16474461]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
SERG1257,
У меня возник вопрос, а зачем нам переводить модель восстановления в Bulk-Logged, если инструкция select into и так будет выполняться с минимальным протоколированием?
21 авг 14, 15:03    [16474636]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Приделайте к ней суррогатный ключ и обновляйте порциями
21 авг 14, 16:32    [16475338]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
qwexak
Member

Откуда:
Сообщений: 4
Спасибо за советы обновлю вставкой в другую таблицу
21 авг 14, 17:17    [16475671]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
qwexak
Member

Откуда:
Сообщений: 4
SELECT [logs_old].[id]
      ,[logs_old].[date]
      ,[logs_old].[time]
      ,[logs_old].[branch]
      ,[logs_old].[responsetime]
      ,[logs_old].[clientip]
      ,[squidstatus].[squidstatusID] AS squidstatus
      ,[logs_old].[replysize]
      ,[requestmethod].[requestmethodID] AS requestmethod
      ,[logs_old].[requesturl]
      ,[logs_old].[requesthost]
      ,[logs_old].[username]
      ,[section].[sectionID] AS section
INTO logs2
FROM [logs_old] WITH (NOLOCK)
LEFT JOIN [requestmethod] ON logs_old.requestmethod = requestmethod.requestmethod
LEFT JOIN [squidstatus] ON logs_old.squidstatus = squidstatus.squidstatus
LEFT JOIN [section] ON logs_old.section = section.section


Копирую так через пару часов будет известен результат
21 авг 14, 17:42    [16475846]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
qwexak
Member

Откуда:
Сообщений: 4
Результат превзошел все ожидания))


(384418379 row(s) affected) 00:44:56
21 авг 14, 18:33    [16476074]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE 384 млн записей  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
wizli
SERG1257,
У меня возник вопрос, а зачем нам переводить модель восстановления в Bulk-Logged, если инструкция select into и так будет выполняться с минимальным протоколированием?
http://technet.microsoft.com/en-us/library/ms191244(v=sql.105).aspx
Under the full recovery model, all bulk operations are fully logged.
Есть и другие условия для минимального логирования массовой вставки: Logged and Minimally Logged Bulk Copy Operations
22 авг 14, 08:34    [16477674]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить