powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Правильное создание индекса
42 сообщений из 42, показаны все 2 страниц
Правильное создание индекса
    #39645681
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, добрый вечер. Прошу дать совет
Исходные данные
есть таблица с логами
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create table dbo.tLogs
(id dsidentifier identity not null
,ObjType int not tull
,DateStart datetime not null
,DateEnd datetime 
,infoObj varchar(300)
,nameObj varchar(40)
,constraint pktLogs primary key (id))

пока в ней пара десятков тестовых дынных, на бою ожидается их большой прирост
есть запрос вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select ObjType,  
         DateStart, 
         DateEnd, 
         infoObj 
 from tLogs 
where nameObj = @nameObj  /*уникальных значений не больше 10 000*/
  and ObjType = @ObjType      /*уникальных значений не больше 20*/
  and DateStart >= @DateStart  /*@DateStart всегда равна getdate() минус пара часов*/ 
  and DateEnd > @DateEnd /*@DateEnd всегда равна getdate() минус пара часов, но она больше @DateStart*/


Предикаты можно поменять местами, составной индекс на таблице пока один - на полях id, ObjType
Сторонние запросы к данной таблице используют лишь индекс описанный выше.
Верным ли будет создать такой составной индекс или есть более приемлемые вариации?
Код: sql
1.
2.
3.
create index someindname
   on dbo.tLogs(nameObj, ObjType, DateStart, DateEnd) 
with (fillfactor = 80)
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39645712
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕР,

Код: sql
1.
2.
create index someindname
   on dbo.tLogs(nameObj, ObjType, DateStart) include (DateEnd, infoObj);
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39645849
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm, благодарю!
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646058
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕР,

Также для большинства случаев рекомендую страничное сжатие, как индекса, так и самой таблицы (data_compression = page).
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646060
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийшК0ДЕР,

Также для большинства случаев рекомендую страничное сжатие, как индекса, так и самой таблицы (data_compression = page).
это кто такое рекомендует?
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646081
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK.ЕвгенийшК0ДЕР,

Также для большинства случаев рекомендую страничное сжатие, как индекса, так и самой таблицы (data_compression = page).
это кто такое рекомендует?
Это я такое рекомендую.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646085
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений,

нагруженные таблицы-то лучше не жать.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646102
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов.Евгений,
нагруженные таблицы-то лучше не жать.
В большинстве случаев нагрузка логирования не превышает считанных процентов от общей нагрузки на систему. Крохотное увеличение нагрузки при записи будет более чем компенсировано приростом скорости чтения лога.

Копать глубже и рассматривать прирост нагрузки в разрезе ресурсов мне сейчас лень. Может, TaPaK соберет стенд и статистику выполнения?
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646133
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийВладислав Колосов.Евгений,
нагруженные таблицы-то лучше не жать.
В большинстве случаев нагрузка логирования не превышает считанных процентов от общей нагрузки на систему. Крохотное увеличение нагрузки при записи будет более чем компенсировано приростом скорости чтения лога.

Копать глубже и рассматривать прирост нагрузки в разрезе ресурсов мне сейчас лень. Может, TaPaK соберет стенд и статистику выполнения?
зачем, я точно никому не рекомендую, никогда. Разве что с местом проблемы(в 2018 году :))
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646137
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKзачем, я точно никому не рекомендую, никогда. Разве что с местом проблемы(в 2018 году :))Выигрыш по месту -- это минимальное из преимуществ сжатия (хотя кому как -- место на производительных но маленьких SSD тоже важно не транжирить). При этом так же экономятся iops'ы и память.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646141
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичTaPaKзачем, я точно никому не рекомендую, никогда. Разве что с местом проблемы(в 2018 году :))Выигрыш по месту -- это минимальное из преимуществ сжатия (хотя кому как -- место на производительных но маленьких SSD тоже важно не транжирить). При этом так же экономятся iops'ы и память.
и платим за всё это cpu
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646152
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKГавриленко Сергей Алексеевичпропущено...
Выигрыш по месту -- это минимальное из преимуществ сжатия (хотя кому как -- место на производительных но маленьких SSD тоже важно не транжирить). При этом так же экономятся iops'ы и память.
и платим за всё это cpuНу так не у всех же дефицит CPU, а всего остального навалом.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646166
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийВ большинстве случаев нагрузка логирования не превышает считанных процентов от общей нагрузки на систему. Крохотное увеличение нагрузки при записи будет более чем компенсировано приростом скорости чтения лога.Вы точно знаете как работает сжатие? Для чего предназначен лог и как он работает? Когда физически пишутся страницы данных/индексов в БД?
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
use msdb;
set xact_abort, nocount on;
go

print @@version;

create table dbo.tr (id tinyint, description varchar(30), elapsed_time int, log_bytes_used bigint);

create table dbo.t1 (id int identity, s varchar(50));
alter table dbo.t1 add constraint PK_t1 primary key clustered (id);

create table dbo.t2 (id int identity, s varchar(50));
alter table dbo.t2 add constraint PK_t2 primary key clustered (id) with (data_compression = page);

create table dbo.t3 (id int identity, s varchar(50));
alter table dbo.t3 add constraint PK_t3 primary key clustered (id) with (data_compression = row);
go

declare @dt datetime2 = sysdatetime(), @c int = 1000000;

begin tran;

while @c > 0
 begin
  insert into dbo.t1 values (cast(newid() as varchar(36)));
  select @c -= 1;
 end;

insert into dbo.tr
select
 1, 'data_compression = none', datediff(ms, @dt, sysdatetime()), sum(dbt.database_transaction_log_bytes_used + dbt.database_transaction_log_bytes_used_system)
from
 sys.dm_tran_current_transaction ct join
 sys.dm_tran_database_transactions dbt on dbt.transaction_id = ct.transaction_id

commit;
go

declare @dt datetime2 = sysdatetime(), @c int = 1000000;

begin tran;

while @c > 0
 begin
  insert into dbo.t2 values (cast(newid() as varchar(36)));
  select @c -= 1;
 end;

insert into dbo.tr
select
 2, 'data_compression = page', datediff(ms, @dt, sysdatetime()), sum(dbt.database_transaction_log_bytes_used + dbt.database_transaction_log_bytes_used_system)
from
 sys.dm_tran_current_transaction ct join
 sys.dm_tran_database_transactions dbt on dbt.transaction_id = ct.transaction_id

commit;
go


declare @dt datetime2 = sysdatetime(), @c int = 1000000;

begin tran;

while @c > 0
 begin
  insert into dbo.t3 values (cast(newid() as varchar(36)));
  select @c -= 1;
 end;

insert into dbo.tr
select
 3, 'data_compression = row', datediff(ms, @dt, sysdatetime()), sum(dbt.database_transaction_log_bytes_used + dbt.database_transaction_log_bytes_used_system)
from
 sys.dm_tran_current_transaction ct join
 sys.dm_tran_database_transactions dbt on dbt.transaction_id = ct.transaction_id

commit;
go

select
 tr.*,
 cast(tr.elapsed_time * 100. / a.min_elapsed_time - 100. as money) elapsed_time_impact_percent,
 cast(tr.log_bytes_used * 100. / a.max_log_bytes_used - 100. as money) log_bytes_used_impact_percent
from
 dbo.tr cross apply
 (select min(elapsed_time), min(log_bytes_used) from dbo.tr) a(min_elapsed_time, max_log_bytes_used)
order
 by id;
go

drop table dbo.tr, dbo.t1, dbo.t2, dbo.t3;
go


Код: plaintext
1.
2.
3.
4.
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) 
	Mar 19 2015 12:32:14 
	Copyright (c) Microsoft Corporation
	Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 17134: ) (Hypervisor)
descriptionelapsed_timelog_bytes_usedelapsed_time_impact_percentlog_bytes_used_impact_percentdata_compression = none51901731167720,002,6408data_compression = page727216866265640,11560,00data_compression = row673216866265629,7110,00


Код: plaintext
1.
2.
3.
4.
Microsoft SQL Server 2017 (RTM-CU4) (KB4056498) - 14.0.3022.28 (X64) 
	Feb  9 2018 19:39:09 
	Copyright (C) 2017 Microsoft Corporation
	Developer Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 17134: ) (Hypervisor)
descriptionelapsed_timelog_bytes_usedelapsed_time_impact_percentlog_bytes_used_impact_percentdata_compression = none68461767626640,002,7216data_compression = page874017207964827,66580,0002data_compression = row835017207930021,9690,00
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646174
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm.ЕвгенийВ большинстве случаев нагрузка логирования не превышает считанных процентов от общей нагрузки на систему. Крохотное увеличение нагрузки при записи будет более чем компенсировано приростом скорости чтения лога.Вы точно знаете как работает сжатие? Для чего предназначен лог и как он работает?
Я говорил про пользовательское логирование (шК0ДЕР - "...есть таблица с логами..."). Либо вы несколько поспешили, либо я выразился недостаточно определенно - выбирайте любой вариант.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646198
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичTaPaKзачем, я точно никому не рекомендую, никогда. Разве что с местом проблемы(в 2018 году :))Выигрыш по месту -- это минимальное из преимуществ сжатия (хотя кому как -- место на производительных но маленьких SSD тоже важно не транжирить). При этом так же экономятся iops'ы и память.Что то я тоже разочаровался в сжатии. Самое большое разочарование - вставка данных, там не то, что "требует CPU", а оно просто упирается в одно ядро, и производительность снижается катастрофически. Использую только ради места на дисках.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646200
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgСамое большое разочарование - вставка данных, там не то, что "требует CPU", а оно просто упирается в одно ядро, и производительность снижается катастрофическиОсобенно BULK - получить вместо 500 гб/с только 5 - это само собой, бай дизайн.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646269
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийЯ говорил про пользовательское логированиеТем более.
А рекомендовать что-то, не зная как это работает и не сделав хотя бы раз нагрузочное тестирование на конкретной системе - удел бустобрехов, вроде некоторых самопровозглашенных "экспертов".
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646332
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm.ЕвгенийЯ говорил про пользовательское логированиеТем более.
А рекомендовать что-то, не зная как это работает и не сделав хотя бы раз нагрузочное тестирование на конкретной системе - удел бустобрехов, вроде некоторых самопровозглашенных "экспертов".
Подчеркну специально для вас: моя рекомендация относилась к большинству случаев возможных вариантов использования логирования, описанного в первом сообщении. И добавлю: прежде всего к тем вариантам, которые мне кажутся естественными, типичными и ожидаемыми для пользовательского логирования.
Разумеется, можно придумать ситуации и наборы данных, когда сжатие практически не даст положительного эффекта, зато проявит все отрицательные. Например, когда вся деятельность системы шК0ДЕР-а будет заключаться в пакетной вставке почти не повторяющихся данных (в рамках страницы) в таблицу лога, запросам к ней, и ничего сверх того. Но я не ставил себе задачей подобное фантазирование и считаю свою оговорку про большинство случаев вполне достаточной.
Наконец, мне показалось, что вы захотели обосновать мою некомпетентность в теме сжатия данных MS SQL единственной, хотя и очень веской фразой "Тем более". Извините, но я не смог увидеть в ней ничего похожего на аргументацию даже при максимальной снисходительности. Я допускаю, что вы можете считать нецелесообразным сжатие таблицы логирования в большинстве типичных случаев, но мне это не мешает. Некоторые наши современники даже верят в плоскую Землю.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646355
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийНаконец, мне показалось, что вы захотели обосновать мою некомпетентностьОбычно собственную компетентность доказывают чем-то большим, чем словоизвержением ни о чем, в стиле "эффективных менеджеров" с "видением". А делать это, как вы честно написали, - лень.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646366
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгенийсчитаю свою оговорку про большинство случаев вполне достаточнойНе знаю, как конкретно у ТС, но "в большинстве случаев" логирование предполагает запись, не предполагает частое чтение, и не предполагает хранение за большое время.
Соответственно, странно было прочитать ваше "Крохотное увеличение нагрузки при записи будет более чем компенсировано приростом скорости чтения лога."
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646381
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm.ЕвгенийНаконец, мне показалось, что вы захотели обосновать мою некомпетентностьОбычно собственную компетентность доказывают чем-то большим, чем словоизвержением ни о чем, в стиле "эффективных менеджеров" с "видением". А делать это, как вы честно написали, - лень.
Эта тема была открыта для получения советов (и я дал таковой), а не для демонстрации доказательств моей компетентности всем желающим и нежелающим, равно как и не для наездов. Вам не лень замусоривать чужую тему "эффективными менеджерами" и т.п оффтопными наездами?
alexeyvg.Евгенийсчитаю свою оговорку про большинство случаев вполне достаточнойНе знаю, как конкретно у ТС, но "в большинстве случаев" логирование предполагает запись, не предполагает частое чтение, и не предполагает хранение за большое время.
Соответственно, странно было прочитать ваше "Крохотное увеличение нагрузки при записи будет более чем компенсировано приростом скорости чтения лога."
Я бы слегка поспорил с "большим временем хранения". Какое оно имеет отношение к теме? Важен объем данных, а он не мал: требуется не просто индекс, а оптимизированный индекс. Миллионы строк? Но главнее другое - отмечена важность быстрого чтения лога.

Теперь по записи. Характерным для логирования я бы назвал другие признаки: во-первых, оно вставляет в таблицу одну строку и bulk insert здесь не применяется. Во-вторых, оно неразрывно связано с действием, ресурсозатратным относительно логирования и не должно его значимо замедлять. Приняв это за норму, поставлю вопрос: какова доля операций вставки в таблицу логирования в общей нагрузке сервера? Какую разницу мы увидим между действиями с логированием в несжатую и сжатую таблицу? А примерно следующую: 1 секунда действия + 100 микросекунд логирования против 1 секунды действия + 200 микросекунд логирования. Другими словами, разницу малую и размазанную по времени, а потому малую пренебрежимо.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646397
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийЯ бы слегка поспорил с "большим временем хранения". Какое оно имеет отношение к теме? Важен объем данных, а он не малВажно, будет ли профит от использования сжатия в виде уменьшения стоимости хранилища. Если храним мало, то стоимость низкая, и этот + сжатия можно не учитывать.
.ЕвгенийВажен объем данных, а он не мал: требуется не просто индекс, а оптимизированный индекс.Сжатие к оптимальному индексу не имеет отношения. Самый оптимальный индекс предложен invm в первом же ответе в теме.
.ЕвгенийТеперь по записи. Характерным для логирования я бы назвал другие признаки: во-первых, оно вставляет в таблицу одну строку и bulk insert здесь не применяетсяСамо собой, это был просто крик души про сжатие :-)
.ЕвгенийПриняв это за норму, поставлю вопрос: какова доля операций вставки в таблицу логирования в общей нагрузке сервера? Какую разницу мы увидим между действиями с логированием в несжатую и сжатую таблицу? А примерно следующую: 1 секунда действия + 100 микросекунд логирования против 1 секунды действия + 200 микросекунд логирования. Другими словами, разницу малую и размазанную по времени, а потому малую пренебрежимо.Я лучше приму другую норму - 100 микросекунд действия + 100 микросекунд логирования.
.ЕвгенийНо главнее другое - отмечена важность быстрого чтения лога.Отмечена необходимость быстрого выполнения запроса на выборку.
Про "соотношение чтения и записи" автор не говорил, возможно, оно такое же, как в типичных системах - на миллион запросов на вставку один запрос на чтение.
Вам "лень", вы советуете "собрать стенд", но даже не потрудились спросить у ТС об этом.
И тем более непонятно выглядит "в большинстве случаев".
Сколько видел систем, всегда чтение из логов происходит по письму больших начальников при разборках "кто виноват", "а я этого не вводила", "откуда тут НДС?", раз в месяц. А лог пишется 10 000 раз в секунду. Легко вычислить соотношение, типичное для "большинства систем".
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646414
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg.ЕвгенийВажен объем данных, а он не мал: требуется не просто индекс, а оптимизированный индекс.Сжатие к оптимальному индексу не имеет отношения. Самый оптимальный индекс предложен invm в первом же ответе в теме.
Да что вы говорите?! А затраты на чтение сжатого и несжатого индекса не имеют какого-либо отношения к оптимальности (в случае, когда он занимает несколько страниц)? Как же он оптимален, если его читать дольше?
alexeyvg.ЕвгенийНо главнее другое - отмечена важность быстрого чтения лога.Отмечена необходимость быстрого выполнения запроса на выборку.
Про "соотношение чтения и записи" автор не говорил...
Перечитайте мою фразу и заметьте - я тоже про него не говорил!
Возможно, что лог читается раз в сутки. Однако оптимизируют именно это единственное (или не единственное) чтение, а не запись. Отмечу, что шК0ДЕР не делал оговорки относительно границы допустимого торможения записи в лог. Ну и?
alexeyvgЯ лучше приму другую норму - 100 микросекунд действия + 100 микросекунд логирования.
Положа руку на сердце, вы всерьез считаете подобное соотношение действия и логирования типичным? Поскольку равное по времени логирование - это один insert, то вы постулируете логирование каждого отдельного оператора SQL.
alexeyvgА лог пишется 10 000 раз в секунду. Легко вычислить соотношение, типичное для "большинства систем".
10 000 * 86 400 секунд = практически неуправляемая таблица, если не чистится каждые сутки. Извините, здесь я могу только процитировать великого поэта: "Печально я гляжу на наше поколенье! Его грядущее - иль пусто, иль темно..." В такой лог действительно смотрят исключительно из-под палки. Это действительно типично для большинства систем, с которыми вы имели дело? С моим профессиональным опытом это категорически расходится.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646423
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийalexeyvgЯ лучше приму другую норму - 100 микросекунд действия + 100 микросекунд логирования.
Положа руку на сердце, вы всерьез считаете подобное соотношение действия и логирования типичным? Поскольку равное по времени логирование - это один insert, то вы постулируете логирование каждого отдельного оператора SQL.Ок, логирование нескольких операций. Но часто бывало и один на один, и даже несколько записей в лог на одну запись в рабочие таблицы.
Однако соотношение всё таки не 20000:1, как у вас.

.ЕвгенийalexeyvgА лог пишется 10 000 раз в секунду. Легко вычислить соотношение, типичное для "большинства систем".
10 000 * 86 400 секунд = практически неуправляемая таблица, если не чистится каждые сутки. Извините, здесь я могу только процитировать великого поэта: "Печально я гляжу на наше поколенье! Его грядущее - иль пусто, иль темно..." В такой лог действительно смотрят исключительно из-под палки. Это действительно типично для большинства систем, с которыми вы имели дело? С моим профессиональным опытом это категорически расходится.Видимо да, расходимся, у меня системы были высоконагруженные, работали надёжно, так что читать из лога приходилось редко, причём, как вы говорите, "из-под палки", то есть выполняя запросы бизнеса по исследованию какого то редкого инцидента, а не просто из любопытства или хулиганства.
.Евгений10 000 * 86 400 секунд = практически неуправляемая таблицаДа, интересно ваше замечание, что значит "неуправляемая"? Из неё запрос нельзя сделать, что ли?
Нормально всё "управляется", не такая большая таблица, хранить можно столько, сколько скажет бизнес, технических ограничений тут нет, соответственно, в таких случаях это решает бизнес, а не технический специалист. Впрочем, если хранить такой лог, например, год, тогда уже можно подумать о сжатии.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646443
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgОк, логирование нескольких операций. Но часто бывало и один на один, и даже несколько записей в лог на одну запись в рабочие таблицы.
Однако соотношение всё таки не 20000:1, как у вас.
Тогда взгляните на это с другой стороны. Сопоставимая нагрузка действий и их логирования означает, что оптимизация последнего посредством исключения избыточных сведений означает соответствующий рост производительности системы. Утрируя, на одном и том же оборудовании одновременно обслуживается тысяча клиентов с полным логированием, или две тысячи - с сокращенным. А то и больше. Или бизнесу неведомо, что такое стоимость владения?
alexeyvgВидимо да, расходимся, у меня системы были высоконагруженные, работали надёжно, так что читать из лога приходилось редко, причём, как вы говорите, "из-под палки", то есть выполняя запросы бизнеса по исследованию какого то редкого инцидента, а не просто из любопытства или хулиганства.
Любопытство или хулиганство здесь не при чем. Хороший лог обеспечивает легкую и удобную локализацию любой мнимой или реальной проблемы с данными или производительностью. Кому-то не нравится цифра, результат действий или время реакции - лог покажет, кем, какие и когда элементы системы (хп, задачи и т.п.) были запущены, с какими аргументами и в какой последовательности, свяжет их с интерфейсом или конкретными процессами. В подавляющем большинстве случаев этого достаточно для воспроизведения и дальнейшего анализа проблемы. Дальнейшая детализация в логе возможна только по отдельному запросу. Так я делал сам, такой же подход видел в чужих системах, с которыми приходилось работать.
alexeyvgДа, интересно ваше замечание, что значит "неуправляемая"? Из неё запрос нельзя сделать, что ли?
Потому что с таблицей в миллиарды записей и более нельзя произвести ad-hoc действия за разумное время. Ходить можно только по дорожкам индексов, сошел с них - сиди и жди. Можешь час ждать, можешь более. Да и индексы не панацея - уровней больше, бегать дольше. Неуправляемую глыбу можно послать в оперативу, кубы или какую-нибудь бигдатую систему, но зачем? Надо просто взять и отсечь лишнее - 99 и 9 в периоде процентов.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646515
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений,

авторнельзя произвести ad-hoc действия за разумное время. Ходить можно только по дорожкам индексов
синее и мягкое... A_OLAP второй
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646548
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийalexeyvgВидимо да, расходимся, у меня системы были высоконагруженные, работали надёжно, так что читать из лога приходилось редко, причём, как вы говорите, "из-под палки", то есть выполняя запросы бизнеса по исследованию какого то редкого инцидента, а не просто из любопытства или хулиганства.
Любопытство или хулиганство здесь не при чем. Хороший лог обеспечивает легкую и удобную локализацию любой мнимой или реальной проблемы с данными или производительностью. Кому-то не нравится цифра, результат действий или время реакции - лог покажет, кем, какие и когда элементы системы (хп, задачи и т.п.) были запущены, с какими аргументами и в какой последовательности, свяжет их с интерфейсом или конкретными процессами. В подавляющем большинстве случаев этого достаточно для воспроизведения и дальнейшего анализа проблемы. Дальнейшая детализация в логе возможна только по отдельному запросу. Так я делал сам, такой же подход видел в чужих системах, с которыми приходилось работать.Именно. Так почему тогда вы писали:
.ЕвгенийalexeyvgА лог пишется 10 000 раз в секунду. Легко вычислить соотношение, типичное для "большинства систем".
10 000 * 86 400 секунд = практически неуправляемая таблица, если не чистится каждые сутки. Извините, здесь я могу только процитировать великого поэта: "Печально я гляжу на наше поколенье! Его грядущее - иль пусто, иль темно..." В такой лог действительно смотрят исключительно из-под палки. Это действительно типично для большинства систем, с которыми вы имели дело? С моим профессиональным опытом это категорически расходится.?
Это оно и есть - "редкие чтения для исследование проблем", а не "читается чаще, чем пишется".

.ЕвгенийalexeyvgДа, интересно ваше замечание, что значит "неуправляемая"? Из неё запрос нельзя сделать, что ли?
Потому что с таблицей в миллиарды записей и более нельзя произвести ad-hoc действия за разумное время. Ходить можно только по дорожкам индексов, сошел с них - сиди и жди. Можешь час ждать, можешь более. Да и индексы не панацея - уровней больше, бегать дольше. Неуправляемую глыбу можно послать в оперативу, кубы или какую-нибудь бигдатую систему, но зачем? Надо просто взять и отсечь лишнее - 99 и 9 в периоде процентов.Повторю за TaPaK - "синее и мягкое".
"Исследование проблем" абсолютно не связано с временем хранения. Даже если храним сотню петабайт лога за годы, это не на миллисекунду не замедлит эти самые "ad-hoc действия" с этим логом, по сравнению с хранением одних суток. Ну, может, как раз на миллисекунду замедлит, прочитать пару лишних страниц индекса.
"Сходить с дорожки индекса" не надо, как минимум должен быть индекс по времени (в том или ином виде, например, у ТС для этого есть ID), что делает нагрузку при изучении лога независимой от его размера.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646592
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgЭто оно и есть - "редкие чтения для исследование проблем", а не "читается чаще, чем пишется".
Я не понимаю, о чем вы говорите. Кто сказал "читается чаще, чем пишется", кому вы возражаете? Мне указанную фразу приписывать не надо. Я могу считать желательным более активное использование просмотра лога, нежели раз в сутки, но не надо доводить мое мнение до полного абсурда.
alexeyvgДаже если храним сотню петабайт лога за годы, это не на миллисекунду не замедлит эти самые "ad-hoc действия" с этим логом, по сравнению с хранением одних суток.
Это заведомая неправда.
1.Вы знаете, как количество индексированных строк связано с количеством уровней индекса, а оно, в свою очередь, со временем поиска по индексу? Вы точно не хотите отдать хотя бы миллисекунду на лишний уровень?
2.Когда ваши действия не ложатся на индекс, в случае относительно небольшой таблицы у вас есть фуллскан. В случае относительно большой - у вас его фактически нет.
Какой бы придумать для начала простой пример...Пусть у нас будет лог с некластерным индексом по времени. Приходит жалоба, что временами тормозит заведение проводки. Я лезу в лог, собираю записи о продолжительности заведения проводки за сутки, большей заданного порога. Для суточной таблицы это будет сделано посредством фуллскана (Cl.Ind.Sc), для петабайтной - NL < Nc.Ind.Se+KL. Напомню, что в сутках у нас под миллиард записей, и как себя покажет NL на таком количестве строк?

Индекс тип записи + дата не предлагать: как я уже сказал, "действия не ложатся на индекс".

TaPaKсинее и мягкое... A_OLAP второй
Вы упорно возбуждаете во мне чувство неприязни к украинцам и насекомым. Однако заверяю: у вас ничего не получится. По крайней мере - в отношении первых.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646598
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийalexeyvgЭто оно и есть - "редкие чтения для исследование проблем", а не "читается чаще, чем пишется".
Я не понимаю, о чем вы говорите. Кто сказал "читается чаще, чем пишется", кому вы возражаете? Мне указанную фразу приписывать не надо. Я могу считать желательным более активное использование просмотра лога, нежели раз в сутки, но не надо доводить мое мнение до полного абсурда.
alexeyvgДаже если храним сотню петабайт лога за годы, это не на миллисекунду не замедлит эти самые "ad-hoc действия" с этим логом, по сравнению с хранением одних суток.
Это заведомая неправда.
1.Вы знаете, как количество индексированных строк связано с количеством уровней индекса, а оно, в свою очередь, со временем поиска по индексу? Вы точно не хотите отдать хотя бы миллисекунду на лишний уровень?
2.Когда ваши действия не ложатся на индекс, в случае относительно небольшой таблицы у вас есть фуллскан. В случае относительно большой - у вас его фактически нет.
Какой бы придумать для начала простой пример...Пусть у нас будет лог с некластерным индексом по времени. Приходит жалоба, что временами тормозит заведение проводки. Я лезу в лог, собираю записи о продолжительности заведения проводки за сутки, большей заданного порога. Для суточной таблицы это будет сделано посредством фуллскана (Cl.Ind.Sc), для петабайтной - NL < Nc.Ind.Se+KL. Напомню, что в сутках у нас под миллиард записей, и как себя покажет NL на таком количестве строк?

Индекс тип записи + дата не предлагать: как я уже сказал, "действия не ложатся на индекс".

TaPaKсинее и мягкое... A_OLAP второй
Вы упорно возбуждаете во мне чувство неприязни к украинцам и насекомым. Однако заверяю: у вас ничего не получится. По крайней мере - в отношении первых.
дарагуля, расскажи нам почему же кхм нельзя
"произвести ad-hoc действия за разумное время"
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646617
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журналы бывают разные, в моей практике встречались две основные группы - контроль ошибок, редко используется для чтения, и пользовательские. Оба вида являются сильно нагруженными, первый по записи, второе - меньше по записи, больше по чтению. Теоретически, пользовательские журналы можно было бы сжимать на уровне страниц, т.к. их содержимое однотипно. Однако, при достижении некоторого порога обращений это уже становится невыгодным. Собственно, я также не нашел особой выгоды использования сжатия, учитывая проблемы, связанные с модернизацией таблиц (а при работе с продажами это происходит часто).
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646715
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.ЕвгенийalexeyvgЭто оно и есть - "редкие чтения для исследование проблем", а не "читается чаще, чем пишется".
Я не понимаю, о чем вы говорите. Кто сказал "читается чаще, чем пишется", кому вы возражаете? Мне указанную фразу приписывать не надо. Я могу считать желательным более активное использование просмотра лога, нежели раз в сутки, но не надо доводить мое мнение до полного абсурда.Вы советуете решение, которое замедлит работу системы.
Для того, что бы выполняемый раз в неделю (несколько раз в день) разработчиками в целях отладки запрос выполнялся на n процентов быстрее. Я утверждаю, что это вредный совет, и ещё есть люди, придерживающиеся такого же мнения.

Вы там что то сначала говорили, что в типичных системах чтений лога будет намного, намного больше, чем записей. Кто такое говорил? Вы говорили: "Крохотное увеличение нагрузки при записи будет более чем компенсировано приростом скорости чтения лога." 21416958

Теперь вы это не говорите (Мне указанную фразу приписывать не надо), но продолжаете настаивать, что для типичных систем нужно включать сжатие.
.ЕвгенийalexeyvgДаже если храним сотню петабайт лога за годы, это не на миллисекунду не замедлит эти самые "ad-hoc действия" с этим логом, по сравнению с хранением одних суток.
Это заведомая неправда.
1.Вы знаете, как количество индексированных строк связано с количеством уровней индекса, а оно, в свою очередь, со временем поиска по индексу? Вы точно не хотите отдать хотя бы миллисекунду на лишний уровень?Вы не увидели мою фразу "Ну, может, как раз на миллисекунду замедлит, прочитать пару лишних страниц индекса."? Просто случайно недоцитировали, бывает :-)
.Евгений2.Когда ваши действия не ложатся на индекс, в случае относительно небольшой таблицы у вас есть фуллскан. В случае относительно большой - у вас его фактически нет.Я описывал подход, повторю ещё раз - при наличии кластерного индекса на инкрементное ID или на Дату, вы будете фактически работать с локальным фрагментом данных, далее делая фильтры хоть по LIKE %%
Т.е. вместо того, что бы оставить данные за последний день, вы можете поставить условие "последний день", и наслаждаться выборками с любыми условиями. При этом вам точно так же будет доступен и пребыдущий день, и вообще все дни года.

.ЕвгенийПусть у нас будет лог с некластерным индексом по времени.Отличный пример!

А давайте лучше сделаем таблицу с полем IMAGE, лог будем хранить в нём в виде документа WORD, и на этих данных докажем необходимость стирания лога каждый день?

Разумеется, для лога работы чего либо делают кластерный индекс по дате или инкременту, как же иначе? Это же лог!
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646792
.Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВы советуете решение, которое замедлит работу системы.
Я уже объяснял вам свою позицию, что замедление работы системы (точнее, ее логируемых элементов) может оказаться пренебрежимо малым, но запрос на чтение может ускориться значительно.
alexeyvgДля того, что бы выполняемый раз в неделю (несколько раз в день) разработчиками в целях отладки запрос выполнялся на n процентов быстрее. Я утверждаю, что это вредный совет...
Для ситуаций, когда замедлением вставки лога можно пренебречь, а ускорение чтения желательно, этот совет будет полезен.
alexeyvg"Крохотное увеличение нагрузки при записи будет более чем компенсировано приростом скорости чтения лога."
"читается чаще, чем пишется"
Вы не находите, что наши фразы несколько различаются?
Лично я - нахожу. Могу повторить свою мысль еще один раз: ускорение чтения лога может оказаться для пользователей системы гораздо более важным и потому компенсировать замедление записи в лог (которое, вполне возможно, останется незамеченным).
alexeyvgВы не увидели мою фразу "Ну, может, как раз на миллисекунду замедлит, прочитать пару лишних страниц индекса."? Просто случайно недоцитировали, бывает :-)
Да, не заметил и недоцитировал, извиняюсь.
alexeyvgЯ описывал подход, повторю ещё раз - при наличии кластерного индекса на инкрементное ID или на Дату
Дату выбрасываем сразу, объяснять причины или не будете возражать? В таком случае у нас остается кластерный индекс по ID (допустим, bigint, хотя некоторые люди используют GUID, но не буду отвлекаться на развлечения) и некластерный индекс по дате. Так вот, именно такая таблица и была моим примером. Вы этого не заметили?
alexeyvg...вы будете фактически работать с локальным фрагментом данных, далее делая фильтры хоть по LIKE %%
Т.е. вместо того, что бы оставить данные за последний день, вы можете поставить условие "последний день", и наслаждаться выборками с любыми условиями. При этом вам точно так же будет доступен и пребыдущий день, и вообще все дни года.
Вы описываете работу с диапазоном кластерного индекса. А дата заложена в некластерный индекс. Миллиард строк по нему вы будете добывать очень долго. Можно, конечно, соорудить костыли, но это уже несерьезно.
А серьезно - это лог разумной величины без ненужных данных, который бегает быстро и в любом направлении, по индексу или без такового. Ну или почти в любом - в жизни без компромиссов не обойтись. При желании и умении можно соорудить такое даже для xml сообщений...
TaPaKдарагуля, расскажи нам почему же кхм нельзя...
Тут и такие ники появляются? Надо же...
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646794
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений,

авторВы описываете работу с диапазоном кластерного индекса. А дата заложена в некластерный индекс. Миллиард строк по нему вы будете добывать очень долго.
Обучение SQL по сказкам дядюшки Римуса
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646809
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Евгений,

Вы утверждаете что сжатие индекса дает прирост скорости чтения, но это утверждение должно быть обусловлено дополнительным уточнением в каких случаях накладные расходы на чтение и распаковку сжатых страниц будут выгодней дополнительных затрат CPU.

При выборке небольших объемов данных, да это действительно из за меньшего объема индексных страниц выборка может быть быстрой.
При выборке больших объемов данных затраты процессорного времени нивелируют меньший объем страниц данных.
Особенно для PAGE сжатия.

Мне кажется вот так сходу давать совет на включение сжатия для индекса без предварительных тестов, на неизвестной системе довольно неблагоразумно. Может получится так что у ТС довольно быстрая дисковая подсистема и никудышные камни, тем самым включение сжатия даст совсем не прирост производительности.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646836
шК0ДЕР,


Код: sql
1.
2.
and DateStart >= @DateStart  /*@DateStart всегда равна getdate() минус пара часов*/ 
and DateEnd > @DateEnd /*@DateEnd всегда равна getdate() минус пара часов, но она больше @DateStart*/



DateEnd > @DateEnd Опечатка?

invm,

Код: sql
1.
2.
create index someindname
   on dbo.tLogs(nameObj, ObjType, DateStart) include (DateEnd, infoObj);



A можно полюбопытствовать почему DateEnd лучше в часть include вписать ?

Заранее спасибо.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646862
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПалЪ СанычЪA можно полюбопытствовать почему DateEnd лучше в часть include вписать ?В показанном запросе столбец DeteEnd не может быть задействован в предикате поиска по индексу. Поэтому нет смысла включать его в ключ.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646951
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ffПри выборке небольших объемов данных, да это действительно из за меньшего объема индексных страниц выборка может быть быстрой.
При выборке больших объемов данных затраты процессорного времени нивелируют меньший объем страниц данных.
Особенно для PAGE сжатия.Вообще никакой логики в ваших словах. Это все равно что сказать чем больше база тем меньше толку от различных оптимизаций.

Если вычитка с диска малого количества данных занимает скажем 1 секунду в сжатом виде и 5 в не сжатом, то если данных в 10 раз больше то это уже будет 10 секунд против 50. Процентное соотношение процессорного времени ко времени выборки будет абсолютно одинаковое что для малого что для большого объема данных, и что там когда нивелируется вообще не понятно. К тому же при малом количестве данных вероятность, что они будет закэшированы значительно выше чем при большом, следовательно больший выигрыш таки будет при большем количестве данных.
90% серверов что я видел имеют огромный запас по CPU, в то же время редко где стоят SSD, так что большую часть ожиданий составляют таки ожидания диска, а вовсе не процессорного времени. Может быть это весьма древняя статистика. но все же, ожидания диска на втором месте:
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39646966
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mind,

Вы как то странно трактуете мое высказывание.

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

Но опять же это не оптимизация рабочей нагрузки сервера, это оптимизация хранения.
Про объемы базы я ничего не говорил, я сказал что надо смотреть на тип нагрузки запросов выборки, в OLTP при частых запросах довольно незначительного объема данных сжатие может дать выигрыш. больше данных в буффер пуле, мелкие выборки в основном с поисками по индексам, выигрыш по меньшим операциям IO будет преобладать над затратами по сжиганию процессора.

А в каком нибудь OLAP/DWH при гиганских объемах очень не факт что время необходимое на декомпрессию данных будет иметь выигрыш в сравнении с приростом IO.

При этом отмечу что в последнее время борьба за ресурсы CPU играет довольно существенную роль в сравнении с ресурсами систем хранения. Объемы памяти в серверах значительно вырасли если взять к примеру картину на 10 лет назад, системы хранения тоже довольно неплохо совершенствуются, многие переходят на SSD, в итоге получаем картину что нужные данные в итоге могут вообще очень неплохо помещаться в оператве, а вот значительного прироста по камням замечено не было.

Все это конечно имхо, я не претендую на звание эксперта, можете трактовать как хотите.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39647368
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПалЪ СанычЪDateEnd > @DateEnd Опечатка?
Нет, не опечатка
Это выборка процессов, которые не выполнились в необходимый интервал времени
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39647482
.ЕвгенийalexeyvgЯ описывал подход, повторю ещё раз - при наличии кластерного индекса на инкрементное ID или на Дату
Дату выбрасываем сразу, объяснять причины или не будете возражать?Пожалуйста, объясните.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39649077
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ffА в каком нибудь OLAP/DWH при гиганских объемах очень не факт что время необходимое на декомпрессию данных будет иметь выигрыш в сравнении с приростом IO.В МС явно думали по другому сделав сжатие в column store индексах по-дефолту. А еще в некоторых специализированных программно-аппаратных решениях для OLAP/DWH (где реально гиганские объмы) сжатие данных реализовали сразу на уровне железа в FPGA.
...
Рейтинг: 0 / 0
Правильное создание индекса
    #39649094
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mind,

мы же говорим о rowstore не надо сюда приплетать CS который для нагрузок DWH/OLAP предпочтительней, я про него ничего не говорил.

вот в принципе статья с некоторыми тестами https://sqlperformance.com/2017/01/sql-performance/compression-effect-on-performance
конечно притянуто за уши, но приблизительно описывает те моменты на которые стоит обратить внимание при решении включения сжатия.
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Правильное создание индекса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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