Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Update новой колонки 2.5 млрд строк / 25 сообщений из 25, страница 1 из 1
02.02.2018, 19:35
    #39595862
Kopilogus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Коллеги,

поставили задачу оптимизировать таблицу хранения логов в которой 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.
CREATE TABLE [dbo].[log_HttpRequest](
	[id] [bigint] NOT NULL,
	[Method] [varchar](16) NOT NULL,
	[RefererId] [bigint] NULL,
	[UriID] [bigint] NOT NULL,
	[UserAgentId] [bigint] NOT NULL,
	[UserID] [bigint] NULL,
	[SessionID] [bigint] NULL,
	[AspSessionID] [varchar](32) NULL,
	[TimeStamp] [datetime] NOT NULL,
	[ProcessTime] [int] NOT NULL,
	[ServerName] [varchar](32) NULL,
	[RequestTraceGUID] [uniqueidentifier] NULL,
	[ClientIP] [varbinary](16) NULL,
	[NSClientIP] [varbinary](16) NULL,
	[RawUriID] [bigint] NULL,
	[ActualUriId] [bigint] NULL,
	[RequestParameters] [varchar](1024) NULL,
	[SecurityTagId] [bigint] NULL,
	[ServerID] [tinyint] NULL,
	[MethodID] [tinyint] NULL,
 CONSTRAINT [PK_log_HttpRequest] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]



Есть таблица: 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 часов ((

Есть мысли как сделать быстрее?
...
Рейтинг: 0 / 0
02.02.2018, 19:37
    #39595863
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Подготовьте заранее все справочники, а потом перелейте (bulk-ом) в новую таблицу с заменой названий на id
...
Рейтинг: 0 / 0
02.02.2018, 19:38
    #39595864
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
KopilogusЕсть мысли как сделать быстрее?В связи с потенциальной возможностью расщепления страниц при апдейте, переливка данных в новую таблицу может оказаться быстрее.
...
Рейтинг: 0 / 0
02.02.2018, 19:55
    #39595871
Kopilogus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Гавриленко Сергей Алексеевич,

Мысль понял, но есть и второй этап:

избавиться от бесполезного суррогатного ключа [id] который не используется и построить кластерный индекс по полю [TimeStamp] которое активно используют в запросах, опять же вопрос - лить в уже подготовленную таблицу с кластерным индексом или залить кучу (что явно быстрее) а уже после построить индекс?

Есть еще сомнения относительно полей ServerID и MethodID, стоит ли их включать в кластерный индекс или создать отдельно некластеризованный по каждому полю?

Селекты в основном 3х видов: как правило у всех присутствует поиск по TimeStamp, очень часто TimeStamp + ServerID, реже все три поля (и есть особенность колонки MethodID - часто ищут по MethodID=3 который не особенно селективен, 40% записей это "3" есть также и NULL значения).

Стоит ли использовать секционирование + сжатие данных?
Таблица по требованию бизнеса должна хранить данные за 5 лет, один месяц примерно 350 млн записей, средний размер строки 0.5KB данные не могут модифицироваться, т.е. только INSERT с последующим (не факт что частым SELECT - разбор инцидентов по запросу)
...
Рейтинг: 0 / 0
02.02.2018, 20:03
    #39595877
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Kopilogusить в уже подготовленную таблицу с кластерным индексом или залить кучу (что явно быстрее) а уже после построить индекс?Если лить с минимальным логированием, сразу в кластерный индекс будет быстрее.

KopilogusТаблица по требованию бизнеса должна хранить данные за 5 лет, один месяц примерно 350 млн записей, средний размер строки 0.5KB данные не могут модифицироваться, т.е. только INSERT с последующим (не факт что частым SELECT - разбор инцидентов по запросу)Если через пять лет не хотите проблем с удалением, то лучше секционировать сразу.

KopilogusСелекты в основном 3х видов: как правило у всех присутствует поиск по TimeStampЕсли поиск по TimeStamp по диапазону, то добавлять какие-либо поля после этого поля в ключ смысла не имеет.

Kopilogus+ сжатие данных?sp_estimate_compression_savings в помощь.
...
Рейтинг: 0 / 0
02.02.2018, 20:16
    #39595881
Kopilogus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Гавриленко Сергей АлексеевичKopilogusить в уже подготовленную таблицу с кластерным индексом или залить кучу (что явно быстрее) а уже после построить индекс?Если лить с минимальным логированием, сразу в кластерный индекс будет быстрее.

KopilogusТаблица по требованию бизнеса должна хранить данные за 5 лет, один месяц примерно 350 млн записей, средний размер строки 0.5KB данные не могут модифицироваться, т.е. только INSERT с последующим (не факт что частым SELECT - разбор инцидентов по запросу)Если через пять лет не хотите проблем с удалением, то лучше секционировать сразу.

KopilogusСелекты в основном 3х видов: как правило у всех присутствует поиск по TimeStampЕсли поиск по TimeStamp по диапазону, то добавлять какие-либо поля после этого поля в ключ смысла не имеет.

Kopilogus+ сжатие данных?sp_estimate_compression_savings в помощь.

вчера пробовал лить в уже подготовленные секции с функцией по полю TimeStamp - каждый год в одну секцию, сутки работало, не дождался... Правда таблицу джойнил со справочниками, чтобы выдергивать ServerID и MethodID и лил по 50 тыс записей, т.к. все это на боевом сервере, чтобы не нагружать систему.

удалять будем полюбому, т.к. схдшники не дадут столько ресурсов под логи..

в целом идея понятна, спасибо!
...
Рейтинг: 0 / 0
02.02.2018, 20:26
    #39595887
Kopilogus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Коллеги, еще вопрос в сабж:

у кого есть какие мысли насчет использования поля [id] bigint IDENTITY(1,1) PK_Clastered повсеместно в базе на больших таблицах (транзакции, логи и т.п.) я чел новый в конторе, разрабы внятно не могут ответить на этот вопрос, пока база была маленькая все летало, сейчас куча траблов с блокировками и производительностью - эти поля в селектах не используют...
...
Рейтинг: 0 / 0
02.02.2018, 21:45
    #39595925
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
раз это логи, то колоночный индекс сделайте, если бизнес-логика это допускает,
весить будет в разы меньше, чем раньше
...
Рейтинг: 0 / 0
02.02.2018, 22:28
    #39595947
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Гавриленко Сергей АлексеевичЕсли лить с минимальным логированием, сразу в кластерный индекс будет быстрее.

Если через пять лет не хотите проблем с удалением, то лучше секционировать сразу.Хм, а если таблица будет секционироваться, разве не быстрее лить в таблицы кучи по секциям, потом строить на них индекс, и потом присоединять к секционированной таблице?

Тут, правда, вопрос, как выбирать данные в диапазоне по полю TimeStamp, индекса же по нему нет, да и был бы - не легче, получать данные лукапом...
...
Рейтинг: 0 / 0
02.02.2018, 22:31
    #39595948
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
KopilogusСтоит ли использовать секционирование + сжатие данных?Будет медленный bulk insert
...
Рейтинг: 0 / 0
02.02.2018, 23:18
    #39595961
Kopilogus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Критикраз это логи, то колоночный индекс сделайте, если бизнес-логика это допускает,
весить будет в разы меньше, чем раньше

Есть идея оставить только кластерный индекс в таблице log_htttpRequestArchive, предполагая что запросы будут крайне редкими в этой таблице. Оперативные логи будем хранить за сутки *куда навешано много селект-счетчиков* и будет таблица log_httpRequestHistory которая будет хранить актуальные логи за 3 месяца, предполагаем что селект запросы будут относительно не частыми..
...
Рейтинг: 0 / 0
02.02.2018, 23:24
    #39595962
Kopilogus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
alexeyvgГавриленко Сергей АлексеевичЕсли лить с минимальным логированием, сразу в кластерный индекс будет быстрее.

Если через пять лет не хотите проблем с удалением, то лучше секционировать сразу.Хм, а если таблица будет секционироваться, разве не быстрее лить в таблицы кучи по секциям, потом строить на них индекс, и потом присоединять к секционированной таблице?

Тут, правда, вопрос, как выбирать данные в диапазоне по полю TimeStamp, индекса же по нему нет, да и был бы - не легче, получать данные лукапом...

вопрос со старыми архивными данными, вернее селект к ним, сейчас не столько важен, сколько свободное место на железном сервере где хранят логи, каждый день приносит прирост порядка 20Гиг, т.е.уже пожар пора тушить, разрабы не особо парятся что лить в логи, как DBA и кодер в прошлом могу сказать, что можно было бы сделать лучше, но бизнес логика диктует свои законы удалять нельзя, вот и извращаемся с тем что имеем...
...
Рейтинг: 0 / 0
03.02.2018, 11:48
    #39596018
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Kopilogusalexeyvgпропущено...
Хм, а если таблица будет секционироваться, разве не быстрее лить в таблицы кучи по секциям, потом строить на них индекс, и потом присоединять к секционированной таблице?

Тут, правда, вопрос, как выбирать данные в диапазоне по полю TimeStamp, индекса же по нему нет, да и был бы - не легче, получать данные лукапом...

вопрос со старыми архивными данными, вернее селект к ним, сейчас не столько важен, сколько свободное место на железном сервере где хранят логи, каждый день приносит прирост порядка 20Гиг, т.е.уже пожар пора тушить, разрабы не особо парятся что лить в логи, как DBA и кодер в прошлом могу сказать, что можно было бы сделать лучше, но бизнес логика диктует свои законы удалять нельзя, вот и извращаемся с тем что имеем...Это всё понятно. Я говорил о процессе первоначальной переливки, о том, как за минимальное время на имеющемся оборудовании и месте на стораджах изменить таблицу.

А так, вообще, если данные не удаляются, то может и секционирование не нужно?....
...
Рейтинг: 0 / 0
04.02.2018, 18:47
    #39596410
Kopilogus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
alexeyvgKopilogusпропущено...


вопрос со старыми архивными данными, вернее селект к ним, сейчас не столько важен, сколько свободное место на железном сервере где хранят логи, каждый день приносит прирост порядка 20Гиг, т.е.уже пожар пора тушить, разрабы не особо парятся что лить в логи, как DBA и кодер в прошлом могу сказать, что можно было бы сделать лучше, но бизнес логика диктует свои законы удалять нельзя, вот и извращаемся с тем что имеем...Это всё понятно. Я говорил о процессе первоначальной переливки, о том, как за минимальное время на имеющемся оборудовании и месте на стораджах изменить таблицу.

А так, вообще, если данные не удаляются, то может и секционирование не нужно?....

Вот я и сам теперь в сомнениях нужен ли мне этот геморрой...
...
Рейтинг: 0 / 0
05.02.2018, 12:20
    #39596659
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Гавриленко Сергей АлексеевичKopilogusить в уже подготовленную таблицу с кластерным индексом или залить кучу (что явно быстрее) а уже после построить индекс? Если лить с минимальным логированием, сразу в кластерный индекс будет быстрее.

авторвчера пробовал лить в уже подготовленные секции с функцией по полю TimeStamp - каждый год в одну секцию, сутки работало, не дождался...

Гавриленко писал про минимальное логирование .
для кластерного это означает лить с таблоком,
да еще и отсортированные данные.
у вас ни того, ни другого нет
...
Рейтинг: 0 / 0
09.02.2018, 11:44
    #39599565
Kopilogus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
В итоге залил в уже подготовленную таблицу с кластерным индексом и включенным Page сжатием.
Процесс занял 20 часов, эффект от сжатия составил 260%.
...
Рейтинг: 0 / 0
09.02.2018, 12:04
    #39599584
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
нужно был кластерный колоночный индекс делать, все равно же это логи,
тогда эффект занятому по месту приближался бы к х10
...
Рейтинг: 0 / 0
09.02.2018, 12:27
    #39599612
архивариус
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Критикнужно был кластерный колоночный индекс делать, все равно же это логи,
тогда эффект занятому по месту приближался бы к х10
+1 (стоило посмотреть в сторону колумсторе)
и для логов можно получить выигрыш в скорости выполнения запросов потом ( с агрегированием которые)
...
Рейтинг: 0 / 0
09.02.2018, 12:29
    #39599614
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
KopilogusВ итоге залил в уже подготовленную таблицу с кластерным индексом и включенным Page сжатием.
Процесс занял 20 часов, эффект от сжатия составил 260%.
балк в таблицу со сжатием всегда медленнее,
чем просто балк + компрессия потом.
...
Рейтинг: 0 / 0
09.02.2018, 13:05
    #39599632
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Yasha123,

при чем тут это?
"потом" можно как включить сжатие, так и создать колоночный индекс с COLUMNSTORE_ARCHIVE

а можно было создать промежуточную таблицу, в которой все это делать, а потом переключать ее как секцию в основную архивную
...
Рейтинг: 0 / 0
09.02.2018, 13:06
    #39599633
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Yasha123,

я думал, вы мне ответили, не то отписал
...
Рейтинг: 0 / 0
09.02.2018, 13:39
    #39599655
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Kopilogus,

Версия какая? В районе 2014 появился функционал оптимального добавления колонки с дефолтовым или нулловым зачением, при которым не происходит перестроение таблиц.
...
Рейтинг: 0 / 0
09.02.2018, 13:51
    #39599669
Kopilogus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
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) никто не отменял :)
...
Рейтинг: 0 / 0
09.02.2018, 13:56
    #39599673
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
a_voroninKopilogus,

Версия какая? В районе 2014 появился функционал оптимального добавления колонки с дефолтовым или нулловым зачением, при которым не происходит перестроение таблиц.
фича появилась в 2012.
но при чем туд добавление колонки с дефолтом- константой ?
он же меняет тип колонки путем переноса имеющегося
в подготовленную колонку другого типа.
какая уж тут константа
...
Рейтинг: 0 / 0
09.02.2018, 14:42
    #39599703
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Update новой колонки 2.5 млрд строк
Yasha123a_voroninKopilogus,

Версия какая? В районе 2014 появился функционал оптимального добавления колонки с дефолтовым или нулловым зачением, при которым не происходит перестроение таблиц.
фича появилась в 2012.
но при чем туд добавление колонки с дефолтом- константой ?
он же меняет тип колонки путем переноса имеющегося
в подготовленную колонку другого типа.
какая уж тут константа

Добавить новые колонки
Порционно перенеси туда значения
Порционно обнулить старые
Попробовать дропнуть пустые -- возможно будет не так страшно
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Update новой колонки 2.5 млрд строк / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]