powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос про оптимизацию
9 сообщений из 9, страница 1 из 1
Вопрос про оптимизацию
    #40111924
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Изучаю оптимизацию для увеличения производительности SQL-запросов.

Есть исходные данные:
SQL. Исходные данные
Код: 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.
DROP TABLE IF EXISTS dbo.Продажи;

CREATE TABLE dbo.Продажи
(	
	Период INT NULL,	
	ГруппаКлиентов NVARCHAR(20) NULL,
	Клиент NVARCHAR(20) NULL,
	ГруппаSKU NVARCHAR(20) NULL,
	SKU NVARCHAR(20) NULL,
	Количество INT NOT NULL	
)ON [PRIMARY]; 

SET NOCOUNT ON

DECLARE @Count INT = 1;

WHILE @Count <= 10000 --Большое количество итерации в цикле!
BEGIN
	INSERT INTO dbo.Продажи
		(Период, ГруппаКлиентов, Клиент, ГруппаSKU, SKU, Количество)		
	SELECT
		CAST(CONCAT(Год, Месяц) AS INT), ГруппаКлиентов, Клиент, ГруппаSKU, SKU, Количество	
	FROM
		(SELECT
			Месяц, ГруппаКлиентов, Клиент, ГруппаSKU, SKU, Количество
		FROM
			(VALUES
				('ГруппаКлиентов 1', 'Клиент 1', 'ГруппаSKU 1', 'SKU 1', 10),
				('ГруппаКлиентов 1', 'Клиент 1', 'ГруппаSKU 1', 'SKU 2', 11),
				('ГруппаКлиентов 1', 'Клиент 1', 'ГруппаSKU 1', 'SKU 3', 12),
				('ГруппаКлиентов 1', 'Клиент 1', 'ГруппаSKU 1', 'SKU 4', 13),
				('ГруппаКлиентов 1', 'Клиент 1', 'ГруппаSKU 2', 'SKU 5', 10),
				('ГруппаКлиентов 1', 'Клиент 1', 'ГруппаSKU 2', 'SKU 6', 11),
				('ГруппаКлиентов 1', 'Клиент 1', 'ГруппаSKU 2', 'SKU 7', 12),
				('ГруппаКлиентов 1', 'Клиент 1', 'ГруппаSKU 2', 'SKU 8', 13),
				('ГруппаКлиентов 1', 'Клиент 2', 'ГруппаSKU 1', 'SKU 1', 10),
				('ГруппаКлиентов 1', 'Клиент 2', 'ГруппаSKU 1', 'SKU 2', 11),
				('ГруппаКлиентов 1', 'Клиент 2', 'ГруппаSKU 1', 'SKU 3', 12),
				('ГруппаКлиентов 1', 'Клиент 2', 'ГруппаSKU 1', 'SKU 4', 13),
				('ГруппаКлиентов 1', 'Клиент 2', 'ГруппаSKU 2', 'SKU 5', 10),
				('ГруппаКлиентов 1', 'Клиент 2', 'ГруппаSKU 2', 'SKU 6', 11),
				('ГруппаКлиентов 1', 'Клиент 2', 'ГруппаSKU 2', 'SKU 7', 12),
				('ГруппаКлиентов 1', 'Клиент 2', 'ГруппаSKU 2', 'SKU 8', 13),
				('ГруппаКлиентов 2', 'Клиент 3', 'ГруппаSKU 1', 'SKU 1', 10),
				('ГруппаКлиентов 2', 'Клиент 3', 'ГруппаSKU 1', 'SKU 2', 11),
				('ГруппаКлиентов 2', 'Клиент 3', 'ГруппаSKU 1', 'SKU 3', 12),
				('ГруппаКлиентов 2', 'Клиент 3', 'ГруппаSKU 1', 'SKU 4', 13),
				('ГруппаКлиентов 2', 'Клиент 3', 'ГруппаSKU 2', 'SKU 5', 10),
				('ГруппаКлиентов 2', 'Клиент 3', 'ГруппаSKU 2', 'SKU 6', 11),
				('ГруппаКлиентов 2', 'Клиент 3', 'ГруппаSKU 2', 'SKU 7', 12),
				('ГруппаКлиентов 2', 'Клиент 3', 'ГруппаSKU 2', 'SKU 8', 13),
				('ГруппаКлиентов 2', 'Клиент 4', 'ГруппаSKU 1', 'SKU 1', 10),
				('ГруппаКлиентов 2', 'Клиент 4', 'ГруппаSKU 1', 'SKU 2', 11),
				('ГруппаКлиентов 2', 'Клиент 4', 'ГруппаSKU 1', 'SKU 3', 12),
				('ГруппаКлиентов 2', 'Клиент 4', 'ГруппаSKU 1', 'SKU 4', 13),
				('ГруппаКлиентов 2', 'Клиент 4', 'ГруппаSKU 2', 'SKU 5', 10),
				('ГруппаКлиентов 2', 'Клиент 4', 'ГруппаSKU 2', 'SKU 6', 11),
				('ГруппаКлиентов 2', 'Клиент 4', 'ГруппаSKU 2', 'SKU 7', 12),
				('ГруппаКлиентов 2', 'Клиент 4', 'ГруппаSKU 2', 'SKU 8', 13)
			)AS t(ГруппаКлиентов, Клиент, ГруппаSKU, SKU, Количество)
		CROSS APPLY 
			(SELECT Месяц FROM (VALUES('01'), ('02'), ('03'), ('04'), ('05'), ('06'), 
                                                  ('07'), ('08'), ('09'), ('10'), ('11'), ('12')) t1(Месяц)) t2) t3
	CROSS APPLY 
			(SELECT Год FROM (VALUES('2018'), ('2019'), ('2020')) t(Год)) t4;

	SET @Count = @Count + 1
END

SET NOCOUNT OFF

SELECT COUNT(*) AS [Количество строк] FROM dbo.Продажи;


Создаем разные индексы
SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE CLUSTERED INDEX ClusteredIndex
	ON dbo.Продажи (Период ASC, ГруппаКлиентов ASC, Клиент ASC, ГруппаSKU ASC, SKU ASC, Количество ASC)
	ON [PRIMARY];
GO

--CREATE NONCLUSTERED INDEX NonClusteredIndex1
--	ON dbo.Продажи (Период, ГруппаКлиентов, Клиент, ГруппаSKU, SKU, Количество)
--	ON [PRIMARY];
--GO

CREATE NONCLUSTERED INDEX NonClusteredIndex2
	ON dbo.Продажи (SKU)
	ON [PRIMARY];
GO


CREATE NONCLUSTERED INDEX NonClusteredIndex3
	ON dbo.Продажи (Количество)
	ON [PRIMARY];


Запускаем разные выгрузки
SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SET STATISTICS IO ON
SELECT
	ГруппаКлиентов,
	Клиент,
	ГруппаSKU,
	SKU,
	Количество
FROM
	dbo.Продажи
WHERE
	--NOT SKU = 'SKU 4'
	--SKU = 'SKU 1' OR SKU = 'SKU 2' OR SKU = 'SKU 3'
	Количество = 13
	--ГруппаКлиентов = 'ГруппаКлиентов 1' AND Клиент = 'Клиент 1' AND ГруппаSKU = 'ГруппаSKU 1' AND SKU = 'SKU 1' AND Количество < 13
	--ГруппаКлиентов = 'ГруппаКлиентов 1' AND Клиент = 'Клиент 1' AND ГруппаSKU = 'ГруппаSKU 1' AND SKU = 'SKU 1'
	--ГруппаКлиентов = 'ГруппаКлиентов 1' AND Клиент = 'Клиент 1' AND ГруппаSKU = 'ГруппаSKU 1' 
	--ГруппаКлиентов = 'ГруппаКлиентов 1' AND Клиент = 'Клиент 1'
SET STATISTICS IO OFF

SQL
Код: 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.
SET STATISTICS IO ON

SELECT
	ГруппаКлиентов,
	Клиент,
	ГруппаSKU,
	SKU,
	SUM(Количество) AS Количество
FROM
	dbo.Продажи
WHERE
	--NOT SKU = 'SKU 4'
	--SKU = 'SKU 1' OR SKU = 'SKU 2' OR SKU = 'SKU 3'
	Количество = 13
	--ГруппаКлиентов = 'ГруппаКлиентов 1' AND Клиент = 'Клиент 1' AND ГруппаSKU = 'ГруппаSKU 1' AND SKU = 'SKU 1' AND Количество < 13
	--ГруппаКлиентов = 'ГруппаКлиентов 1' AND Клиент = 'Клиент 1' AND ГруппаSKU = 'ГруппаSKU 1' AND SKU = 'SKU 1'
	--ГруппаКлиентов = 'ГруппаКлиентов 1' AND Клиент = 'Клиент 1' AND ГруппаSKU = 'ГруппаSKU 1' 
	--ГруппаКлиентов = 'ГруппаКлиентов 1' AND Клиент = 'Клиент 1'
GROUP BY
	ГруппаКлиентов,
	Клиент,
	ГруппаSKU,
	SKU

SET STATISTICS IO OFF


Создаем еще один индекс вместо обычного кластерного
SQL
Код: sql
1.
2.
3.
4.
5.
6.
CREATE CLUSTERED COLUMNSTORE INDEX ClusteredIndex
	ON
		dbo.Продажи
	WITH
		(DROP_EXISTING = ON, COMPRESSION_DELAY = 0, DATA_COMPRESSION = COLUMNSTORE)
	ON [PRIMARY]


Необходимо ускорить производительность для запросов.

1. Я правильно понимаю, что для ускорения производительности в данном случае не нужно использовать только PRIMARY, а нужно создавать отдельные файловые группы? Если да, то насколько значительно это ускорит?

2. Какие еще варианты существуют для улучшения производительности в данном случае?
...
Рейтинг: 0 / 0
Вопрос про оптимизацию
    #40111931
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk


1. Я правильно понимаю, что для ускорения производительности в данном случае не нужно использовать только PRIMARY, а нужно создавать отдельные файловые группы? Если да, то насколько значительно это ускорит?

2. Какие еще варианты существуют для улучшения производительности в данном случае?


1. Ты не заметишь.
2. Подумать. На тему: "нафига козе баян?".
...
Рейтинг: 0 / 0
Вопрос про оптимизацию
    #40111943
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk Какие еще варианты существуют для улучшения производительности в данном случае?индексированая вьюха
https://docs.microsoft.com/ru-ru/sql/relational-databases/views/create-indexed-views?view=sql-server-ver15
...
Рейтинг: 0 / 0
Вопрос про оптимизацию
    #40111955
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

надо создать покрывающий индекс по количеству, но это может иметь последствия - увеличатся затраты на хранения и вставку.
...
Рейтинг: 0 / 0
Вопрос про оптимизацию
    #40111965
flexgen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все эти индексы что были созданы, они используются? Что вернет вот такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT   OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], 
         I.[NAME] AS [INDEX NAME], 
         USER_SEEKS, 
         USER_SCANS, 
         USER_LOOKUPS, 
         USER_UPDATES 
FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S 
         INNER JOIN SYS.INDEXES AS I 
           ON I.[OBJECT_ID] = S.[OBJECT_ID] 
              AND I.INDEX_ID = S.INDEX_ID 
WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1
...
Рейтинг: 0 / 0
Вопрос про оптимизацию
    #40112032
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk

2. Какие еще варианты существуют для улучшения производительности в данном случае?


анализировать statistics io и реальные планы выполнения
чем меньше чтений - тем быстрее запрос

зачем создавать кластерный индекс по всем столбцам?

запустить sp_BlitzIndex для этой таблицы и проанализировать результат
https://www.brentozar.com/blitzindex/

[spoiler] про индексы-- Clustered Index
YouTube Video
...
Рейтинг: 0 / 0
Вопрос про оптимизацию
    #40112506
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk
Здравствуйте!

Изучаю оптимизацию для увеличения производительности SQL-запросов.



Я имел дело с такой таблицей продажи где-то на 6 проектах. Где она сотни лямов или больше лярда строк была. Со временем устанавливается некий набор индексов от 6 до 10, которые устраивает всех, кто в ней ковыряется.

Но как правило требуется месячное партиционирование по дате.

Если требуется очень разнообразная аналитика -- тут однозначно надо делать OLAP кубы.

Если это ERP система, то там обычно фильтрация по номеру чека, пользователю и т.п. Со временем 4-6 индексов также устаканиваются.

Так что никакой универсальной системы индексов никто не предложит. Анализируй запросы. Создавай индексы.
...
Рейтинг: 0 / 0
Вопрос про оптимизацию
    #40115672
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
зачем создавать кластерный индекс по всем столбцам?
Я пока экспериментирую с разными индексами. Просто в разных запросах используются различные комбинации полей в WHERE и GROUP BY.
...
Рейтинг: 0 / 0
Вопрос про оптимизацию
    #40115674
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
flexgen
Все эти индексы что были созданы, они используются?
По идее должны не все использоваться. Экспериментирую, чтобы подобрать наиболее оптимальный.

flexgen
Что вернет вот такой запрос:
OBJECT NAME INDEX NAME USER_SEEKS USER_SCANS USER_LOOKUPS USER_UPDATESПродажи NULL 0 3 0 0Продажи index4 1 0 0 0Продажи NonClusteredIndex2 0 0 0 0
Учитывая, что какие то индексы удаляю и добавляю другие.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос про оптимизацию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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