powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться с оптимизацией запросов
38 сообщений из 38, показаны все 2 страниц
Помогите разобраться с оптимизацией запросов
    #40050577
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Давно хотел разобраться в технике оптимизации запросов, и вот представился случай.

Есть вот такая вьюха:
Код: 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.
WITH spis_in_reserv --Оцениваем списания, которые дожны участвовать в расчете резервов в сети
	AS (
		SELECT oper.fldNZ AS OperId, oper.fldPID
		FROM dbo.tblOperation AS oper WITH(NOLOCK)
        JOIN db_Partners.ors.AllPartners AS p ON p.ID = oper.fldPID AND p.RetailChainID = 1 --только списания сети "ЧГ"
		WHERE oper.fldState NOT IN (8, 9) 
		AND NOT EXISTS (
			SELECT 1
			FROM dbo.tblOperHist AS toh WITH(NOLOCK)
			WHERE toh.OperID = oper.fldNZ AND
			  	  toh.[State] = 5 AND CAST(toh.StateDate AS DATE) < CAST(GETDATE() AS DATE)
		) --Списания, у которых статус "выгрузка в матрицу" вчерашний день или ранее, попали в расчет остатков магазина, поэтому в расчете зарезервированного количества товара не участвуют
		AND oper.fldDate >= DATEADD(DAY, -30, CAST(GETDATE() AS DATE)) --Garbadge remove
	),
    
	reservs -- считаем резервы


	AS(
		SELECT sr.fldPID AS PartnerId, ts.fldBookID AS BookId, SUM(ISNULL(ts.fldQuan, 0)) AS QtyRezerved
		FROM dbo.tblSub AS ts WITH(NOLOCK)
		JOIN spis_in_reserv sr ON sr.OperId = ts.fldNZ
		GROUP BY ts.fldBookID, sr.fldPID
	)

	SELECT tsm.PartnerID, 
		tsm.BookID, 
		tsm.rem, 
		ISNULL(r.QtyRezerved, 0) AS [rezerv], 
		ISNULL(tsm.Rem, 0) - ISNULL(r.QtyRezerved, 0) AS [DostupnoRem], 
		ISNULL(tsm.RemInShop, 0) - ISNULL(r.QtyRezerved, 0) AS [DostupnoRemInShop]
	FROM db_Matrix.DBO.tblSuperMain AS tsm WITH(NOLOCK)
	LEFT JOIN reservs r ON tsm.PartnerID = r.PartnerId AND tsm.BookID = r.BookId
	WHERE tsm.Rem > 0;



Выполняю такой запрос:
Код: sql
1.
2.
3.
set statistics io ON
set statistics time on
select top 1000 * from [db_Spisanie].[dbo].[vwWriteOffRezerv_V2] 



Пот полученный результат:
авторВремя синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

(затронуто строк: 1000)
Таблица "Workfile". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Worktable". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSuperMain". Сканирований 1, логических операций чтения 172, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSub". Сканирований 2774, логических операций чтения 12318, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblOperHist". Сканирований 17449, логических операций чтения 52432, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblOperation". Сканирований 2, логических операций чтения 3408, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Partner". Сканирований 1, логических операций чтения 15, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Type". Сканирований 1, логических операций чтения 2, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "PartnerSource". Сканирований 0, логических операций чтения 2, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.

(затронута одна строка)

Время работы SQL Server:
Время ЦП = 375 мс, затраченное время = 999 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время выполнения: 2021-03-04T10:44:04.2216785+03:00

План запроса во вложении.

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

Таблица "tblOperHist". Сканирований 17449

CAST(toh.StateDate AS DATE) < CAST(GETDATE() AS DATE) - плохое выражение, создайте persisted колонку для CAST(toh.StateDate AS DATE) и проиндексируйте или перефразируйте выражение без преобразование к типу дата. Также индекс нужен.
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050618
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

а покажите
Код: sql
1.
sp_helpindex tblOperHist


в базе db_Spisanie
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050628
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
teCa,

а покажите
Код: sql
1.
sp_helpindex tblOperHist


в базе db_Spisanie
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050629
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Почти половина затраченного времени ушла на ожидание SOS_SCHEDULER_YIELD, т.е. проблемы с процессорным ресурсом
2. Неверная оценка кардинальности предиката oper.fldState NOT IN (8, 9). Попробуйте заменить на oper.fldState < 8 or oper.fldState > 9
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050631
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Таблица "tblOperHist". Сканирований 17449
Это не сканирование таблицы. Это сканирование диапазона индекса.
Владислав Колосов
CAST(toh.StateDate AS DATE) < CAST(GETDATE() AS DATE) - плохое выражение, создайте persisted колонку для CAST(toh.StateDate AS DATE) и проиндексируйте или перефразируйте выражение без преобразование к типу дата. Также индекс нужен.
Прежде, чем писать, посмотрели бы что в плане в Seek Predicate...
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050643
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
2. Неверная оценка кардинальности предиката oper.fldState NOT IN (8, 9). Попробуйте заменить на oper.fldState < 8 or oper.fldState > 9


Данная корректировка дала значительный прирост:

авторТаблица "Worktable". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Type". Сканирований 12, логических операций чтения 24, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblOperation". Сканирований 0, логических операций чтения 32850, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSub". Сканирований 1274, логических операций чтения 47309, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Partner". Сканирований 0, логических операций чтения 2548, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "PartnerSource". Сканирований 0, логических операций чтения 2548, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSuperMain". Сканирований 5, логических операций чтения 206, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Worktable". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.

(затронута одна строка)

Время работы SQL Server:
Время ЦП = 187 мс, затраченное время = 114 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050684
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm

2. Неверная оценка кардинальности предиката oper.fldState NOT IN (8, 9). Попробуйте заменить на oper.fldState < 8 or oper.fldState > 9


похоже что план не от указанного запроса - 8-ки нет

<ScalarOperator ScalarString="[db_Spisanie].[dbo].[tblOperation].[fldDate] as [oper].[fldDate]>=dateadd(day,(-30),CONVERT(date,getdate(),0)) AND ([db_Spisanie].[dbo].[tblOperation].[fldState] as [oper].[fldState]<(9) OR [db_Spisanie].[dbo].[tblOperation].[fldState] as [oper].[fldState]>(9))">
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050686
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
8-ки нет
8 - в Seek Predicate, 9 - в Predicate
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050687
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
komrad
8-ки нет
8 - в Seek Predicate, 9 - в Predicate

вижу, спасибо
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050691
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
2. Неверная оценка кардинальности предиката oper.fldState NOT IN (8, 9). Попробуйте заменить на oper.fldState < 8 or oper.fldState > 9


Можете объяснить, почему oper.fldState NOT IN (8, 9) медленнее чем oper.fldState < 8 or oper.fldState > 9?
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050692
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
komrad
teCa,

а покажите
Код: sql
1.
sp_helpindex tblOperHist


в базе db_Spisanie


сравните 2-й и 4-й индексы - могут оказаться полными дубликатами
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050703
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
Можете объяснить, почему oper.fldState NOT IN (8, 9) медленнее чем oper.fldState < 8 or oper.fldState > 9?
Во-первых, вы не показали новый план.

NOT IN (8, 9) - берет из индекса строки с oper.fldState < 8 и oper.fldState > 8 и потом отфильтровывает строки с oper.fldState = 9
oper.fldState < 8 or oper.fldState > 9 - скорее всего, сразу берет из индекса строки с oper.fldState < 8 и oper.fldState > 9
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050710
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
teCa
Можете объяснить, почему oper.fldState NOT IN (8, 9) медленнее чем oper.fldState < 8 or oper.fldState > 9?
Во-первых, вы не показали новый план.

NOT IN (8, 9) - берет из индекса строки с oper.fldState < 8 и oper.fldState > 8 и потом отфильтровывает строки с oper.fldState = 9
oper.fldState < 8 or oper.fldState > 9 - скорее всего, сразу берет из индекса строки с oper.fldState < 8 и oper.fldState > 9


Спасибо за разъяснение, прикладываю новый план.
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050749
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
прикладываю новый план.

https://www.sql.ru/forum/actualfile.aspx?id=22289688] Приложенный файл (vwWriteOffRezerv_V3.zip - 12Kb)
Судя по всему, это уже другой запрос, а не обсуждаемый.
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050753
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
teCa
прикладываю новый план.

https://www.sql.ru/forum/actualfile.aspx?id=22289688] Приложенный файл (vwWriteOffRezerv_V3.zip - 12Kb)
Судя по всему, это уже другой запрос, а не обсуждаемый.


Странно, ошибиться не мог.

Текст вьюхи с исправлением NOT IN

Код: 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.
CREATE  VIEW [dbo].[vwWriteOffRezerv_V5]
AS

	WITH spis_in_reserv --Оцениваем списания, которые дожны участвовать в расчете резервов в сети
	AS (
		SELECT oper.fldNZ AS OperId, oper.fldPID
		FROM dbo.tblOperation AS oper WITH(NOLOCK)
        JOIN db_Partners.ors.AllPartners AS p ON p.ID = oper.fldPID AND p.RetailChainID = 1 --только списания сети "ЧГ"
		WHERE oper.fldState < 8 or oper.fldState>9 
		AND NOT EXISTS (
			SELECT 1
			FROM dbo.tblOperHist AS toh WITH(NOLOCK)
			WHERE toh.OperID = oper.fldNZ AND
			  	  toh.[State] = 5 AND CAST(toh.StateDate AS DATE) < CAST(GETDATE() AS DATE)
		) --Списания, у которых статус "выгрузка в матрицу" вчерашний день или ранее, попали в расчет остатков магазина, поэтому в расчете зарезервированного количества товара не участвуют
		AND oper.fldDate >= DATEADD(DAY, -30, CAST(GETDATE() AS DATE)) --Garbadge remove
	),
    
	reservs -- считаем резервы


	AS(
		SELECT sr.fldPID AS PartnerId, ts.fldBookID AS BookId, SUM(ISNULL(ts.fldQuan, 0)) AS QtyRezerved
		FROM dbo.tblSub AS ts WITH(NOLOCK)
		JOIN spis_in_reserv sr ON sr.OperId = ts.fldNZ
		GROUP BY ts.fldBookID, sr.fldPID
	)

	SELECT tsm.PartnerID, 
		tsm.BookID, 
		tsm.rem, 
		ISNULL(r.QtyRezerved, 0) AS [rezerv], 
		ISNULL(tsm.Rem, 0) - ISNULL(r.QtyRezerved, 0) AS [DostupnoRem], 
		ISNULL(tsm.RemInShop, 0) - ISNULL(r.QtyRezerved, 0) AS [DostupnoRemInShop]
	FROM db_Matrix.DBO.tblSuperMain AS tsm WITH(NOLOCK)
	LEFT JOIN reservs r ON tsm.PartnerID = r.PartnerId AND tsm.BookID = r.BookId
	WHERE tsm.Rem > 0;


GO



Вызов:
Код: sql
1.
2.
3.
set statistics io ON
set statistics time on
select top 1000 * from [db_Spisanie].[dbo].[vwWriteOffRezerv_V5] 



Статистика:
авторВремя синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

(затронуто строк: 1000)
Таблица "Worktable". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Type". Сканирований 9, логических операций чтения 18, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblOperation". Сканирований 0, логических операций чтения 50485, физических операций чтения 2, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSub". Сканирований 1421, логических операций чтения 71145, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Partner". Сканирований 0, логических операций чтения 2842, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "PartnerSource". Сканирований 0, логических операций чтения 2842, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSuperMain". Сканирований 5, логических операций чтения 211, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 75, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Worktable". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.

(затронута одна строка)

Время работы SQL Server:
Время ЦП = 358 мс, затраченное время = 182 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

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

Кстати, предложение top может влиять на форму плана.

К тому же, у вас там ошибка. Нужно
Код: sql
1.
2.
WHERE (oper.fldState < 8 or oper.fldState>9)
		AND NOT EXISTS (
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050771
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
В общем затраченное время уменьшилось за счет параллелизма.
И форма плана стала другой.

Кстати, предложение top может влиять на форму плана.

К тому же, у вас там ошибка. Нужно
Код: sql
1.
2.
WHERE (oper.fldState < 8 or oper.fldState>9)
		AND NOT EXISTS (



Действительно, после добавления скобок производительность вернулась к прежним значениям.

авторВремя синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

(затронуто строк: 1000)
Таблица "Workfile". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Worktable". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSuperMain". Сканирований 1, логических операций чтения 172, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSub". Сканирований 2906, логических операций чтения 12891, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblOperHist". Сканирований 17593, логических операций чтения 52885, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblOperation". Сканирований 2, логических операций чтения 1759, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Partner". Сканирований 1, логических операций чтения 15, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Type". Сканирований 1, логических операций чтения 2, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "PartnerSource". Сканирований 0, логических операций чтения 2, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.

(затронута одна строка)

Время работы SQL Server:
Время ЦП = 515 мс, затраченное время = 1354 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050802
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите план для
Код: sql
1.
select checksum_agg(checksum(*)) from [db_Spisanie].[dbo].[vwWriteOffRezerv_V5]
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050942
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Покажите план для
Код: sql
1.
select checksum_agg(checksum(*)) from [db_Spisanie].[dbo].[vwWriteOffRezerv_V5]


-22871429

Простите за глупый вопрос, что это и для чего?
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050944
Jhonny-2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
teCa,
У Вас же вроде бы план попросили, а не результат запроса.
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050948
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
komrad
teCa,

а покажите
Код: sql
1.
sp_helpindex tblOperHist



в базе db_Spisanie




А зачем нафигачили столько одинаковых индексов?
1,3
2,4,5
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050960
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jhonny-2005
teCa,
У Вас же вроде бы план попросили, а не результат запроса.


Действительно.
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050993
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa,

1. Поудаляйте ненужные индексы
2. Создайте индекс, рекомендованный в последнем плане.
3. У вас нехватка ресурсов (CPU и память)
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40050996
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
teCa,
3. У вас нехватка ресурсов (CPU и память)


А как вы это увидели?
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051007
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
А как вы это увидели?
Статистика ожиданий в корневом итераторе плана: PAGEIOLATCH_SH и SOS_SCHEDULER_YIELD
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051011
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик

А зачем нафигачили столько одинаковых индексов?
1,3
2,4,5


там могут быть инклюды
sp_helpindex их не показывает

подобные "дубли" вполне могут оказаться покрывающими для каких-то отдельных запросов
надо смотреть статистику использования, имхо
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051032
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
teCa
А как вы это увидели?
Статистика ожиданий в корневом итераторе плана: PAGEIOLATCH_SH и SOS_SCHEDULER_YIELD


Выполнил dbcc sqlperf(waitstats), смотрю на поле SOS_SCHEDULER_YIELD, примерно час назад скидывал статистику ожиданий, на данный момент такое значение имею в поле Wait Time: 6355340.

Правильно я понимаю, что это время в миллисекундах запросы ожидали "доступа" к процессору?
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051041
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
invm
пропущено...
Статистика ожиданий в корневом итераторе плана: PAGEIOLATCH_SH и SOS_SCHEDULER_YIELD


Выполнил dbcc sqlperf(waitstats), смотрю на поле SOS_SCHEDULER_YIELD, примерно час назад скидывал статистику ожиданий, на данный момент такое значение имею в поле Wait Time: 6355340.

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


статистику лучше не скидывать вручную - это статистика по всему серверу и она может/будет отличаться от сессионной и тем более для вашего запроса
лучше выполните скрипт отсюда и покажите результат

https://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051044
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
teCa
пропущено...

Выполнил dbcc sqlperf(waitstats), смотрю на поле SOS_SCHEDULER_YIELD, примерно час назад скидывал статистику ожиданий, на данный момент такое значение имею в поле Wait Time: 6355340.

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


статистику лучше не скидывать вручную - это статистика по всему серверу и она может/будет отличаться от сессионной и тем более для вашего запроса
лучше выполните скрипт отсюда и покажите результат


https://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/

Перед вашим ответом, еще раз сбрасывал статистику...
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051051
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa

Перед вашим ответом, еще раз сбрасывал статистику...

тогда надо подождать некоторое время (зависит от типичной нагрузки)
иначе смысла в таких "моментальных" срезах нет

если хотите узнать статистику по сессиям - смотрите sys.dm_exec_session_wait_stats
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051056
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
teCa

Перед вашим ответом, еще раз сбрасывал статистику...

тогда надо подождать некоторое время (зависит от типичной нагрузки)
иначе смысла в таких "моментальных" срезах нет

если хотите узнать статистику по сессиям - смотрите sys.dm_exec_session_wait_stats


Спасибо большое за полезную информацию!
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051077
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
komrad
пропущено...

тогда надо подождать некоторое время (зависит от типичной нагрузки)
иначе смысла в таких "моментальных" срезах нет

если хотите узнать статистику по сессиям - смотрите sys.dm_exec_session_wait_stats


Спасибо большое за полезную информацию!


Прежде, чем "оптимизировать" - надо научиться писать запросы.
Ловля блох в густой шерсти планов - бесперспективна, пока пишущий рисует такие конструкции

Код: sql
1.
2.
3.
4.
5.
aTable1 as t1 left outer join ( select x from aTable2 group by x) as t2 on  t1.x = t2.x

-- в оригинале
	FROM db_Matrix.DBO.tblSuperMain AS tsm WITH(NOLOCK)
	LEFT JOIN reservs r ON tsm.PartnerID = r.PartnerId AND tsm.BookID = r.BookId
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051084
teCa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
teCa
пропущено...


Спасибо большое за полезную информацию!


Прежде, чем "оптимизировать" - надо научиться писать запросы.
Ловля блох в густой шерсти планов - бесперспективна, пока пишущий рисует такие конструкции

Код: sql
1.
2.
3.
4.
5.
aTable1 as t1 left outer join ( select x from aTable2 group by x) as t2 on  t1.x = t2.x

-- в оригинале
	FROM db_Matrix.DBO.tblSuperMain AS tsm WITH(NOLOCK)
	LEFT JOIN reservs r ON tsm.PartnerID = r.PartnerId AND tsm.BookID = r.BookId



Как часто бывает в практике DBA, одни пишут - другим приходится оптимизировать.
Очень был бы рад поднять свой скил в выявлении неоптимальных запросов как DBA, но согласен, что было бы гораздо проще, если бы я имел скил продвинутого разработчика t-sql.
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051095
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa

Спасибо большое за полезную информацию!


вот описание самых типичных вейтов
https://www.sqlskills.com/blogs/paul/worrying-wait-type/
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051127
Александр Бердышев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teCa
invm
2. Неверная оценка кардинальности предиката oper.fldState NOT IN (8, 9). Попробуйте заменить на oper.fldState < 8 or oper.fldState > 9


Данная корректировка дала значительный прирост:

авторТаблица "Worktable". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Type". Сканирований 12, логических операций чтения 24, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblOperation". Сканирований 0, логических операций чтения 32850, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSub". Сканирований 1274, логических операций чтения 47309, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Partner". Сканирований 0, логических операций чтения 2548, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "PartnerSource". Сканирований 0, логических операций чтения 2548, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "tblSuperMain". Сканирований 5, логических операций чтения 206, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.
Таблица "Worktable". Сканирований 0, логических операций чтения 0, физических операций чтения 0, операций чтения страничного сервера 0, операций чтения, выполненных с упреждением 0, операций чтения страничного сервера, выполненных с упреждением 0, логических операций чтения LOB 0, физических операций чтения LOB 0, операций чтения LOB страничного сервера 0, операций чтения LOB, выполненных с упреждением 0, операций чтения LOB страничного сервера, выполненных с упреждением 0.

(затронута одна строка)

Время работы SQL Server:
Время ЦП = 187 мс, затраченное время = 114 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051129
Александр Бердышев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас не мог получиться прирост производительности просто от того, что таблицы закешировались?
...
Рейтинг: 0 / 0
Помогите разобраться с оптимизацией запросов
    #40051131
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Бердышев
У вас не мог получиться прирост производительности просто от того, что таблицы закешировались?

нет, внесенное исправление изменило логику запроса

https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1334016&msg=22289774
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться с оптимизацией запросов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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