Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Коллеги, поставили задачу оптимизировать таблицу хранения логов в которой 2.5 млрд строк. Первый этап - изменить поля Method на MethodID и ServerName на ServerID - оба поля tinyint, структура исходной талицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Есть таблица: tb_Framework_Servers(ServerID tinyint, Servername varchar(32)) подготовленная заранее - содержит 68 записей Сначала делаю ALTER TABLE ADD ServerID tinyint затем запустил: update log_HttpRequest Set log_HttpRequest.ServerID = tb_Framework_Servers.ServerID from tb_Framework_Servers where log_HttpRequest.ServerName = tb_Framework_Servers.ServerName Выполняется уже более 5 часов (( Есть мысли как сделать быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 19:35 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Подготовьте заранее все справочники, а потом перелейте (bulk-ом) в новую таблицу с заменой названий на id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 19:37 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
KopilogusЕсть мысли как сделать быстрее?В связи с потенциальной возможностью расщепления страниц при апдейте, переливка данных в новую таблицу может оказаться быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 19:38 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей Алексеевич, Мысль понял, но есть и второй этап: избавиться от бесполезного суррогатного ключа [id] который не используется и построить кластерный индекс по полю [TimeStamp] которое активно используют в запросах, опять же вопрос - лить в уже подготовленную таблицу с кластерным индексом или залить кучу (что явно быстрее) а уже после построить индекс? Есть еще сомнения относительно полей ServerID и MethodID, стоит ли их включать в кластерный индекс или создать отдельно некластеризованный по каждому полю? Селекты в основном 3х видов: как правило у всех присутствует поиск по TimeStamp, очень часто TimeStamp + ServerID, реже все три поля (и есть особенность колонки MethodID - часто ищут по MethodID=3 который не особенно селективен, 40% записей это "3" есть также и NULL значения). Стоит ли использовать секционирование + сжатие данных? Таблица по требованию бизнеса должна хранить данные за 5 лет, один месяц примерно 350 млн записей, средний размер строки 0.5KB данные не могут модифицироваться, т.е. только INSERT с последующим (не факт что частым SELECT - разбор инцидентов по запросу) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 19:55 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Kopilogusить в уже подготовленную таблицу с кластерным индексом или залить кучу (что явно быстрее) а уже после построить индекс?Если лить с минимальным логированием, сразу в кластерный индекс будет быстрее. KopilogusТаблица по требованию бизнеса должна хранить данные за 5 лет, один месяц примерно 350 млн записей, средний размер строки 0.5KB данные не могут модифицироваться, т.е. только INSERT с последующим (не факт что частым SELECT - разбор инцидентов по запросу)Если через пять лет не хотите проблем с удалением, то лучше секционировать сразу. KopilogusСелекты в основном 3х видов: как правило у всех присутствует поиск по TimeStampЕсли поиск по TimeStamp по диапазону, то добавлять какие-либо поля после этого поля в ключ смысла не имеет. Kopilogus+ сжатие данных?sp_estimate_compression_savings в помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 20:03 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей АлексеевичKopilogusить в уже подготовленную таблицу с кластерным индексом или залить кучу (что явно быстрее) а уже после построить индекс?Если лить с минимальным логированием, сразу в кластерный индекс будет быстрее. KopilogusТаблица по требованию бизнеса должна хранить данные за 5 лет, один месяц примерно 350 млн записей, средний размер строки 0.5KB данные не могут модифицироваться, т.е. только INSERT с последующим (не факт что частым SELECT - разбор инцидентов по запросу)Если через пять лет не хотите проблем с удалением, то лучше секционировать сразу. KopilogusСелекты в основном 3х видов: как правило у всех присутствует поиск по TimeStampЕсли поиск по TimeStamp по диапазону, то добавлять какие-либо поля после этого поля в ключ смысла не имеет. Kopilogus+ сжатие данных?sp_estimate_compression_savings в помощь. вчера пробовал лить в уже подготовленные секции с функцией по полю TimeStamp - каждый год в одну секцию, сутки работало, не дождался... Правда таблицу джойнил со справочниками, чтобы выдергивать ServerID и MethodID и лил по 50 тыс записей, т.к. все это на боевом сервере, чтобы не нагружать систему. удалять будем полюбому, т.к. схдшники не дадут столько ресурсов под логи.. в целом идея понятна, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 20:16 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Коллеги, еще вопрос в сабж: у кого есть какие мысли насчет использования поля [id] bigint IDENTITY(1,1) PK_Clastered повсеместно в базе на больших таблицах (транзакции, логи и т.п.) я чел новый в конторе, разрабы внятно не могут ответить на этот вопрос, пока база была маленькая все летало, сейчас куча траблов с блокировками и производительностью - эти поля в селектах не используют... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 20:26 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
раз это логи, то колоночный индекс сделайте, если бизнес-логика это допускает, весить будет в разы меньше, чем раньше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 21:45 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей АлексеевичЕсли лить с минимальным логированием, сразу в кластерный индекс будет быстрее. Если через пять лет не хотите проблем с удалением, то лучше секционировать сразу.Хм, а если таблица будет секционироваться, разве не быстрее лить в таблицы кучи по секциям, потом строить на них индекс, и потом присоединять к секционированной таблице? Тут, правда, вопрос, как выбирать данные в диапазоне по полю TimeStamp, индекса же по нему нет, да и был бы - не легче, получать данные лукапом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 22:28 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
KopilogusСтоит ли использовать секционирование + сжатие данных?Будет медленный bulk insert ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 22:31 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Критикраз это логи, то колоночный индекс сделайте, если бизнес-логика это допускает, весить будет в разы меньше, чем раньше Есть идея оставить только кластерный индекс в таблице log_htttpRequestArchive, предполагая что запросы будут крайне редкими в этой таблице. Оперативные логи будем хранить за сутки *куда навешано много селект-счетчиков* и будет таблица log_httpRequestHistory которая будет хранить актуальные логи за 3 месяца, предполагаем что селект запросы будут относительно не частыми.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 23:18 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
alexeyvgГавриленко Сергей АлексеевичЕсли лить с минимальным логированием, сразу в кластерный индекс будет быстрее. Если через пять лет не хотите проблем с удалением, то лучше секционировать сразу.Хм, а если таблица будет секционироваться, разве не быстрее лить в таблицы кучи по секциям, потом строить на них индекс, и потом присоединять к секционированной таблице? Тут, правда, вопрос, как выбирать данные в диапазоне по полю TimeStamp, индекса же по нему нет, да и был бы - не легче, получать данные лукапом... вопрос со старыми архивными данными, вернее селект к ним, сейчас не столько важен, сколько свободное место на железном сервере где хранят логи, каждый день приносит прирост порядка 20Гиг, т.е.уже пожар пора тушить, разрабы не особо парятся что лить в логи, как DBA и кодер в прошлом могу сказать, что можно было бы сделать лучше, но бизнес логика диктует свои законы удалять нельзя, вот и извращаемся с тем что имеем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2018, 23:24 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Kopilogusalexeyvgпропущено... Хм, а если таблица будет секционироваться, разве не быстрее лить в таблицы кучи по секциям, потом строить на них индекс, и потом присоединять к секционированной таблице? Тут, правда, вопрос, как выбирать данные в диапазоне по полю TimeStamp, индекса же по нему нет, да и был бы - не легче, получать данные лукапом... вопрос со старыми архивными данными, вернее селект к ним, сейчас не столько важен, сколько свободное место на железном сервере где хранят логи, каждый день приносит прирост порядка 20Гиг, т.е.уже пожар пора тушить, разрабы не особо парятся что лить в логи, как DBA и кодер в прошлом могу сказать, что можно было бы сделать лучше, но бизнес логика диктует свои законы удалять нельзя, вот и извращаемся с тем что имеем...Это всё понятно. Я говорил о процессе первоначальной переливки, о том, как за минимальное время на имеющемся оборудовании и месте на стораджах изменить таблицу. А так, вообще, если данные не удаляются, то может и секционирование не нужно?.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.02.2018, 11:48 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
alexeyvgKopilogusпропущено... вопрос со старыми архивными данными, вернее селект к ним, сейчас не столько важен, сколько свободное место на железном сервере где хранят логи, каждый день приносит прирост порядка 20Гиг, т.е.уже пожар пора тушить, разрабы не особо парятся что лить в логи, как DBA и кодер в прошлом могу сказать, что можно было бы сделать лучше, но бизнес логика диктует свои законы удалять нельзя, вот и извращаемся с тем что имеем...Это всё понятно. Я говорил о процессе первоначальной переливки, о том, как за минимальное время на имеющемся оборудовании и месте на стораджах изменить таблицу. А так, вообще, если данные не удаляются, то может и секционирование не нужно?.... Вот я и сам теперь в сомнениях нужен ли мне этот геморрой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.02.2018, 18:47 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Гавриленко Сергей АлексеевичKopilogusить в уже подготовленную таблицу с кластерным индексом или залить кучу (что явно быстрее) а уже после построить индекс? Если лить с минимальным логированием, сразу в кластерный индекс будет быстрее. авторвчера пробовал лить в уже подготовленные секции с функцией по полю TimeStamp - каждый год в одну секцию, сутки работало, не дождался... Гавриленко писал про минимальное логирование . для кластерного это означает лить с таблоком, да еще и отсортированные данные. у вас ни того, ни другого нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2018, 12:20 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
В итоге залил в уже подготовленную таблицу с кластерным индексом и включенным Page сжатием. Процесс занял 20 часов, эффект от сжатия составил 260%. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 11:44 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
нужно был кластерный колоночный индекс делать, все равно же это логи, тогда эффект занятому по месту приближался бы к х10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 12:04 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Критикнужно был кластерный колоночный индекс делать, все равно же это логи, тогда эффект занятому по месту приближался бы к х10 +1 (стоило посмотреть в сторону колумсторе) и для логов можно получить выигрыш в скорости выполнения запросов потом ( с агрегированием которые) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 12:27 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
KopilogusВ итоге залил в уже подготовленную таблицу с кластерным индексом и включенным Page сжатием. Процесс занял 20 часов, эффект от сжатия составил 260%. балк в таблицу со сжатием всегда медленнее, чем просто балк + компрессия потом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 12:29 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Yasha123, при чем тут это? "потом" можно как включить сжатие, так и создать колоночный индекс с COLUMNSTORE_ARCHIVE а можно было создать промежуточную таблицу, в которой все это делать, а потом переключать ее как секцию в основную архивную ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 13:05 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Yasha123, я думал, вы мне ответили, не то отписал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 13:06 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Kopilogus, Версия какая? В районе 2014 появился функционал оптимального добавления колонки с дефолтовым или нулловым зачением, при которым не происходит перестроение таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 13:39 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
a_voronin, Microsoft SQL Server 2014 (SP2-CU7) (KB4032541) - 12.0.5556.0 (X64) Aug 17 2017 12:07:38 Copyright (c) Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) По условию перед заливкой нужно было еще заменить поля ServerName И MethodName на ServerID и MethodID: left join к 2м справочным таблицам с проверкой ISNULL(ServerID, 0) никто не отменял :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 13:51 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
a_voroninKopilogus, Версия какая? В районе 2014 появился функционал оптимального добавления колонки с дефолтовым или нулловым зачением, при которым не происходит перестроение таблиц. фича появилась в 2012. но при чем туд добавление колонки с дефолтом- константой ? он же меняет тип колонки путем переноса имеющегося в подготовленную колонку другого типа. какая уж тут константа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 13:56 |
|
||
|
Update новой колонки 2.5 млрд строк
|
|||
|---|---|---|---|
|
#18+
Yasha123a_voroninKopilogus, Версия какая? В районе 2014 появился функционал оптимального добавления колонки с дефолтовым или нулловым зачением, при которым не происходит перестроение таблиц. фича появилась в 2012. но при чем туд добавление колонки с дефолтом- константой ? он же меняет тип колонки путем переноса имеющегося в подготовленную колонку другого типа. какая уж тут константа Добавить новые колонки Порционно перенеси туда значения Порционно обнулить старые Попробовать дропнуть пустые -- возможно будет не так страшно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2018, 14:42 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39599614&tid=1690312]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
96ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 420ms |

| 0 / 0 |
