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

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

имеется большая таблица 270 мил. - куча безо всяких индексов.

table tbl 
(
col1 int not null
,id int not null
)


нужно проапдейтить одно ИНТ поле

написан код для адпейта кусками по N тыс записей.

поля(ей) которые могут гарантировать уникальность нет.

как ускорить апдейт ?

while ...

	begin tran
	
		with up as
		(
			select top (N) ID, row_number() over(order by (select null)) rn
			from tbl
			where col1 = @col1 and ID = 0
		)
		
		update up 
		set ID = rn
	
	commit tran


select count(*) from where col1 = @col1
-- 15 mil records 
16 ноя 16, 20:15    [19901223]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
_human
Member

Откуда:
Сообщений: 569
SQL SERVER 2014

+ есть возможность добавить 1 поле уникальных значений
16 ноя 16, 20:26    [19901246]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
_human
имеется большая таблица 270 мил. - куча безо всяких индексов.

нужно проапдейтить одно ИНТ поле
ИМХО быстрее просто перелить всё в другую кучу командой select ... into

_human
+ есть возможность добавить 1 поле уникальных значений
Дык это займёт время, равное апдэйту поля одной командой :-)
16 ноя 16, 20:47    [19901310]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
_human
Member

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

Значение в поле не константа, т.е. есть некая логика при апдейте.

Таблица содержит рандомную дату, но вот такой момент интересует.

Генерация 15 мил. записей, тоже кусками, занимает до 8 минут...
А 270 мил - 4 часа.
Если учесть что на сервере никакой другой активности не происходит.

Получается что при такой скорости генерация 270 мил должно занимать около 2-х часов..
Почему так происходит и как забороть?
16 ноя 16, 22:05    [19901554]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
zasandator
Member [скрыт] [заблокирован]

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

Индекс построй с опцией онлайн - быстрее перелива. Затем апдейт и дроп индекс.
16 ноя 16, 23:11    [19901743]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
_human
Почему так происходит и как забороть?
А про что вопрос? "Так" - это о чём?
zasandator
_human,
Индекс построй с опцией онлайн - быстрее перелива. Затем апдейт и дроп индекс.
Зачем ему индекс? На что?
16 ноя 16, 23:15    [19901755]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
_human
Member

Откуда:
Сообщений: 569
alexeyvg
А про что вопрос? "Так" - это о чём?


Время геренации записей ~ 4 часа вдвое больше ожидаемого ~ 2 часа.
Вопщем нелинейная зависимость.
17 ноя 16, 00:13    [19901871]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
_human
Member

Откуда:
Сообщений: 569
zasandator
с опцией онлайн

у меня не Enterprise
17 ноя 16, 00:20    [19901884]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
o-o
Guest
zasandator
_human,
Индекс построй с опцией онлайн - быстрее перелива. Затем апдейт и дроп индекс.

занафига ему *онлайново* индекс строить,
чтобы полно залогировать?
т.е. побольше в лог записать и подольше ждать?
у него всего 2 целых поля в таблице,
если переливать через select into, это прочесть все полностью
+ залогиривать только аллокэйшены страниц.
если онлайново строить индекс,
даже некластерный по одному полю,
это прочесть снова все,
но записать в лог как минимум половину объема таблицы.
ну так что быстрее-то, как считаете?
---
и это все при том, что
_human
Если учесть что на сервере никакой другой активности не происходит.

полный онлайновый нонсенс
17 ноя 16, 00:59    [19901930]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8815
Зачем такая сложная конструкция с нумерацией, UPDATE TOP (N) вполне достаточно. Поищите, на прошлой неделе рассматривали пример.
17 ноя 16, 10:54    [19902517]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
o-o
если переливать через select into, это прочесть все полностью
+ залогиривать только аллокэйшены страниц.
Вот именно. ИМХО это самый оптимальный вариант, если я правильно понял задачу, и нужно изменить поле для всех записей, а не для небольшого числа по условию.
_human
alexeyvg
А про что вопрос? "Так" - это о чём?

Время геренации записей ~ 4 часа вдвое больше ожидаемого ~ 2 часа.
А время "на кусок" плавно растёт, или скачет, или вырастает резко начиная с какого то момента?
Может, проблема в увеличении файла данных/лога...
17 ноя 16, 11:40    [19902738]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Владислав Колосов
Зачем такая сложная конструкция с нумерацией, UPDATE TOP (N) вполне достаточно. Поищите, на прошлой неделе рассматривали пример.
Для этих условий апдэйт лучше не сделать.
17 ноя 16, 11:41    [19902741]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
раз куча, то голосую за полный перелив..
17 ноя 16, 11:44    [19902757]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
o-o
Guest
alexeyvg
нужно изменить поле для всех записей, а не для небольшого числа по условию.

вроде пишет, апдэйтить по условию надо.
и это 15млн из 270млн.
где-то 1/20 записей, что уже исключает индекс,
лукапить 5% на таком объеме невыгодно
17 ноя 16, 12:20    [19903010]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
o-o
alexeyvg
нужно изменить поле для всех записей, а не для небольшого числа по условию.

вроде пишет, апдэйтить по условию надо.
и это 15млн из 270млн.
где-то 1/20 записей, что уже исключает индекс,
лукапить 5% на таком объеме невыгодно
Если 15млн из 270млн, то может просто сделать апдэйт одной операцией...
17 ноя 16, 12:59    [19903234]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
_human
Member

Откуда:
Сообщений: 569
alexeyvg
Может, проблема в увеличении файла данных/лога...

Места на диске хвататет.
Во вмемя каждого комита данные пишутся на диск и ресурсы освобождаются.

Может нужно еще что-то выполнять после каждого комита?

alexeyvg
Если 15млн из 270млн, то может просто сделать апдэйт одной операцией...

Я планировал лукап такими же кусками по 200 000 записей по всей таблице.

Наверное лучше переписать код для генерации записей и учесть логику апдейта.
Единственное что не устаивает это очередные 4 часа ...

alexeyvg
А время "на кусок" плавно растёт, или скачет, или вырастает резко начиная с какого то момента?


Тяжело сказать.
Единственно что более-мение точно - на 1-е 15 мил уходит 5-8 минут.
17 ноя 16, 13:18    [19903354]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
_human
alexeyvg
А время "на кусок" плавно растёт, или скачет, или вырастает резко начиная с какого то момента?
Тяжело сказать.
Единственно что более-мение точно - на 1-е 15 мил уходит 5-8 минут.
Так логирование вставьте.


_human
Я планировал лукап такими же кусками по 200 000 записей по всей таблице.
То есть всю таблицу нужно проапдейтить?
Всё таки попробуйте с переливкой, как мы вам говорили.
Это же будет последовательное чтение и запись. На скорости диска. То есть секунды-минуты вместо часов.
17 ноя 16, 13:49    [19903544]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить апдейт  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
alexeyvg
Всё таки попробуйте с переливкой, как мы вам говорили.
Это же будет последовательное чтение и запись. На скорости диска. То есть секунды-минуты вместо часов.
Вот попробовал, у меня в 10 раз меньший объём (47 млн записей) перелился за 5 секунд. (на 470 места не хватило, расширять для этого неохота)
Это на медленной тестовой виртуалке на 4 ядра и с медленным динамическим диском, запись шла со скоростью всего 25 мегабайт/сек. У вас наверняка сервер быстрее.
17 ноя 16, 14:08    [19903662]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить