powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оператор Sort и Spill Level
31 сообщений из 31, показаны все 2 страниц
Оператор Sort и Spill Level
    #39749057
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello world!
Есть две таблицы. У обеих есть кластерный индекс. Первая содержит 242575 , а вторая 97142 записей.
Код: 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.
CREATE TABLE [tmp].[T_abc_branch_](
	[DTST] [int] NOT NULL, [DTED] [int] NOT NULL, [Product_Key] [int] NOT NULL, [Branch_Key] [int] NOT NULL,
	[ABC_Количество] [nvarchar](5) NOT NULL,	[Rating_Количество] [bigint] NOT NULL,
	[ABC_Доход] [nvarchar](5) NOT NULL,		[Rating_Доход] [bigint] NOT NULL,
	[ABC_Оборот] [nvarchar](5) NOT NULL,		[Rating_Оборот] [bigint] NOT NULL,
	[ABC_Клиенты] [nvarchar](5) NOT NULL,		[Rating_Клиенты] [bigint] NOT NULL,
	[ABC_Частота] [nvarchar](5) NOT NULL,		[Rating_Частота] [bigint] NOT NULL,
	[ABC_ОстаткиШт] [nvarchar](5) NOT NULL,		[Rating_ОстаткиШт] [bigint] NOT NULL,
	[ABC_ОстаткиRUB] [nvarchar](5) NOT NULL,	[Rating_ОстаткиRUB] [bigint] NOT NULL,
	[ABC_ВЕС] [nvarchar](5) NOT NULL,		[Rating_ВЕС] [bigint] NOT NULL,
	[ABC_ОБЪЕМ] [nvarchar](5) NOT NULL,		[Rating_ОБЪЕМ] [bigint] NOT NULL
) 
CREATE UNIQUE CLUSTERED INDEX [IC_U_T_abc_branch_:Год:Product_Key:Branch_Key:] ON [tmp].[T_abc_branch_]
(
	[DTST] ASC,
	[DTED] ASC,
	[Product_Key] ASC,
	[Branch_Key] ASC
)
CREATE TABLE [dim].[ABC_Branch_SKU](
	[ABC_Key] [int] IDENTITY(1,1) NOT NULL,
	[ABC_Количество] [nvarchar](50) NOT NULL,	[ABC_Количество_ORD] [smallint] NOT NULL,
	[ABC_Доход] [nvarchar](50) NOT NULL,		[ABC_Доход_ORD] [smallint] NOT NULL,
	[ABC_Оборот] [nvarchar](50) NOT NULL,		[ABC_Оборот_ORD] [smallint] NOT NULL,
	[ABC_Клиенты] [nvarchar](50) NOT NULL,		[ABC_Клиенты_ORD] [smallint] NOT NULL,
	[ABC_Частота] [nvarchar](50) NOT NULL,		[ABC_Частота_ORD] [smallint] NOT NULL,
	[ABC_ОстаткиШт] [nvarchar](50) NOT NULL,	[ABC_ОстаткиШт_ORD] [smallint] NOT NULL,
	[ABC_ОстаткиRUB] [nvarchar](50) NOT NULL,	[ABC_ОстаткиRUB_ORD] [smallint] NOT NULL,
	[ABC_ВЕС] [nvarchar](50) NOT NULL,		[ABC_ВЕС_ORD] [smallint] NOT NULL,
	[ABC_ОБЪЕМ] [nvarchar](50) NOT NULL,		[ABC_ОБЪЕМ_ORD] [smallint] NOT NULL
)
CREATE UNIQUE CLUSTERED INDEX [IC_U_ABC_Branch_SKU:ABC_Key:] ON [dim].[ABC_Branch_SKU]
(
	[ABC_Key] ASC
)

Перед выполнением основного запроса обновляю статистики.
Код: sql
1.
2.
UPDATE STATISTICS [DWH_Staging_Area].[tmp].[T_abc_branch_] [IC_U_T_abc_branch_:Год:Product_Key:Branch_Key:] WITH FULLSCAN
UPDATE STATISTICS [DWH].[dim].[ABC_Branch_SKU] [IC_U_ABC_Branch_SKU:ABC_Key:] WITH FULLSCAN

Скрипт основного запроса
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
		SELECT	 ABC_.ABC_Key, ABC.*
		FROM	[DWH_Staging_Area].[tmp].[T_abc_branch_] AS ABC
		JOIN	[DWH].[dim].[ABC_Branch_SKU] AS ABC_
			ON	ABC.[ABC_Количество] = ABC_.[ABC_Количество] AND
				ABC.[ABC_Доход] = ABC_.[ABC_Доход]  AND
				ABC.[ABC_Оборот] = ABC_.[ABC_Оборот]  AND
				ABC.[ABC_Клиенты] = ABC_.[ABC_Клиенты] AND
				ABC.[ABC_Частота] = ABC_.[ABC_Частота] AND
				ABC.[ABC_ОстаткиШт] = ABC_.[ABC_ОстаткиШт] AND
				ABC.[ABC_ОстаткиRUB] = ABC_.[ABC_ОстаткиRUB] AND
				ABC.[ABC_ВЕС] = ABC_.[ABC_ВЕС] AND
				ABC.[ABC_ОБЪЕМ] = ABC_.[ABC_ОБЪЕМ] 
		OPTION (RECOMPILE)	

При его выполнении используется план запроса, в котором оператор Sort сливает данные на диск, хотя кардинальность вычислена правильно. Подскажите с чем это связано?
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749058
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749069
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А откуда сиквелу знать сколько будет в итоге строк? Если у вас статистика не по тем полям по которым идет соединение, ну и если по правде не вижу проблемы. Может банально не хватать памяти. Как вариант можно убрать RECOMPILE и посмотреть что с планом.
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749075
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так нэ лезет в память!
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749078
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда серверу особо хочется посортировать,
можно ему явно влепить hash join в запрос
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749080
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDentonА откуда сиквелу знать сколько будет в итоге строк? Если у вас статистика не по тем полям по которым идет соединение Данные спилятся в операторе Sort до выполнения соединения.
AlanDentonМожет банально не хватать памяти. Как это проверять?
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749081
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123когда серверу особо хочется посортировать,
можно ему явно влепить hash join в запрос
что вы, что вы, сейчас понабегут апологеты "безхинтового" программирования.
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749088
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Расшарьте план выполнения в формате sqlplan пжл
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749092
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagrus2,

версия сиквела у вас какая?

можете попробовать поэкспериментировать с вариациями
Код: sql
1.
2.
option (maxdop 1)
option (querytraceon 7470)
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749093
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123когда серверу особо хочется посортировать,
можно ему явно влепить hash join в запрос
Попробовал, но у такого запроса(hash join) стоимость получилась больше, чем у исходного(merge join + sort).
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749095
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ffYagrus2,

версия сиквела у вас какая?


Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)
Oct 20 2015 15:36:27
Copyright (c) Microsoft Corporation
Business Intelligence Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749096
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexYasha123когда серверу особо хочется посортировать,
можно ему явно влепить hash join в запрос
что вы, что вы, сейчас понабегут апологеты "безхинтового" программирования.
на прежнем месте у 2008 R2 временами сносило крышу,
массово мерджил там, где еще накануне красовался hash, им же самим выбранный.
натурально, с сортировкой обеих таблиц (огромных таблиц).
прибили хинтами, благо данные в таблицы только добавлялись.
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749098
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagrus2Yasha123когда серверу особо хочется посортировать,
можно ему явно влепить hash join в запрос
Попробовал, но у такого запроса(hash join) стоимость получилась больше, чем у исходного(merge join + sort).
да наплевать на стоимость.
запустите и убедитесь.
вы видите, какие объемы он решил посортировать?
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749099
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот кстати и ответ, с чего вдруг полез merge.
потому что hash видите ли вдруг подорожал.
еще бы он вменяемо объяснил, в честь чего подорожание
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749103
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDentonРасшарьте план выполнения в формате sqlplan пжл
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749106
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123да наплевать на стоимость.
запустите и убедитесь.
вы видите, какие объемы он решил посортировать?
Не пойму вас.
Я параллельно запустил два запроса. Первый в хинтом на HASH JOIN. Через просмотр Execution plan вижу такую картинку
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749107
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, кстати, и не 2008 это был,
а 2012.
у меня все хранится.
могу подарить желающим поломать голову,
какого черта у него хэш подорожал.
реально же хэш был быстрее в 3,5 раз
и в темпдб не лазил


Warning: The join order has been enforced because a local join hint is used.
Table 'TAB_PROCEDURE_T'. Scan count 9, logical reads 3534693, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'TAB_TABELLONE_DATI_AGGIUNTIVI_T_day'. Scan count 9, logical reads 137616, physical reads 0, read-ahead reads 7, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 155434, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1903553 row(s) affected)

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 39484 ms, elapsed time = 47835 ms.

Table 'TAB_TABELLONE_DATI_AGGIUNTIVI_T_day'. Scan count 9, logical reads 137792, physical reads 0, read-ahead reads 10, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'TAB_PROCEDURE_T'. Scan count 9, logical reads 3534693, physical reads 0, read-ahead reads 16, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1903553 row(s) affected)

(1 row(s) affected)
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749109
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagrus2,
что непонятного?
вы смотрите оценку в попугаях.
а я вам говорю запустить оба запроса и сравнить время выполнения.
реальное время выполнения
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749110
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,
Размер сортируемой таблицы 36,133 MB
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749112
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagrus2Размер сортируемой таблицы 36,133 MB
вообще да, ваши таблицы хиловаты.
в моем случае 27Гб было в основной таблице.
тем не менее, ему приспичило сортировать
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749115
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

у вас предполагаемые планы приложены :(
заинтересовали, а конкретики не дали.
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749121
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ffYasha123,

у вас предполагаемые планы приложены :(
заинтересовали, а конкретики не дали.

конктерика в статистике выполнения под спойлером.
прилагаю то, что сохранилось.
я уже у другого клиента,
тем не менее, я точно помню, что планы полетели массово.
причем, скорее всего, это было после введения page compression
на ряде таблиц.
компрессию убирать не пожелали, зато потребовали срочно вернуться к прежнему времени выполнения.
так что хинтами пришлось прибить.
конфигурация сервера 100% не менялась,
данные в таблицах с одного дня на другой по сотне-тысяче строк лишь прибавляли.
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749126
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ были сохранены предполагаемые,
чтобы было видно оценку при выборе плана.
это кстати был как раз нетипичный случай, где хэш стоил меньше,
но он его все равно не выбирал.
в других случаях он еще и считал, что хэш дороже.
сейчас еще покопаюсь, если найду вывалю сюда.
--
этот случай странен вдвойне, потому что должен выбирать с меньшей стоимостью,
а на деле было не так
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749127
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так там merge промахивается в оценке в 50раз
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749294
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123Yagrus2,
а я вам говорю запустить оба запроса и сравнить время выполнения.
реальное время выполненияЧерез HASH JOIN время выполнения получилось меньше.
Скрипт Время
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
	
SELECT	ABC_.ABC_Key, 
	ABC.DTST,	
	ABC.DTED,	
	Product_Key,	
	Branch_Key
into #q2
FROM	[DWH_Staging_Area].[tmp].[T_abc_branch_] AS ABC
JOIN	[DWH].[dim].[ABC_Branch_SKU] AS ABC_
  ON	ABC.[ABC_Количество] = ABC_.[ABC_Количество] AND
	ABC.[ABC_Доход] = ABC_.[ABC_Доход]  AND
	ABC.[ABC_Оборот] = ABC_.[ABC_Оборот]  AND
	ABC.[ABC_Клиенты] = ABC_.[ABC_Клиенты] AND
	ABC.[ABC_Частота] = ABC_.[ABC_Частота] AND
	ABC.[ABC_ОстаткиШт] = ABC_.[ABC_ОстаткиШт] AND
	ABC.[ABC_ОстаткиRUB] = ABC_.[ABC_ОстаткиRUB] AND
	ABC.[ABC_ВЕС] = ABC_.[ABC_ВЕС] AND
	ABC.[ABC_ОБЪЕМ] = ABC_.[ABC_ОБЪЕМ] 
OPTION (RECOMPILE , HASH JOIN)	

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
(242575 row(s) affected)

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 1435 ms,  elapsed time = 405 ms.
SQL Server parse and compile time: 
   CPU time = 5 ms, elapsed time = 5 ms.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT	ABC_.ABC_Key, 
	ABC.DTST,	
	ABC.DTED,	
	Product_Key,	
	Branch_Key
into #q3
FROM	[DWH_Staging_Area].[tmp].[T_abc_branch_] AS ABC
JOIN	[DWH].[dim].[ABC_Branch_SKU] AS ABC_
  ON	ABC.[ABC_Количество] = ABC_.[ABC_Количество] AND
	ABC.[ABC_Доход] = ABC_.[ABC_Доход]  AND
	ABC.[ABC_Оборот] = ABC_.[ABC_Оборот]  AND
	ABC.[ABC_Клиенты] = ABC_.[ABC_Клиенты] AND
	ABC.[ABC_Частота] = ABC_.[ABC_Частота] AND
	ABC.[ABC_ОстаткиШт] = ABC_.[ABC_ОстаткиШт] AND
	ABC.[ABC_ОстаткиRUB] = ABC_.[ABC_ОстаткиRUB] AND
	ABC.[ABC_ВЕС] = ABC_.[ABC_ВЕС] AND
	ABC.[ABC_ОБЪЕМ] = ABC_.[ABC_ОБЪЕМ] 
OPTION (RECOMPILE)

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
(242575 row(s) affected)

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 4946 ms,  elapsed time = 1723 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749300
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну а я про что.
иногда ему хочется посортировать даже там, где не надо, и он сортирует.
и когда мне не хочется, чтобы он это делал, я влепляю хинт.
вы лучше знаете свои данные,
на моих, например, было известно,
что их будет только больше, и что лучше hash join.
поэтому хинт и ныне там
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749325
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

авторкакого черта у него хэш подорожал

Так пересмотрели же стоимости начиная с 2014.
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749333
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь обсуждается 2012-ый сервер
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749342
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, какую формулу использует hash join для получается Estimated Number of Rows?
Что можно сделать для улучшения оценки?
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749343
Фотография Yagrus2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagrus2,
...
Рейтинг: 0 / 0
Оператор Sort и Spill Level
    #39749388
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yagrus2,

у вас нет ничего что бы помогло sql адекватно посчитат оценку.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оператор Sort и Spill Level
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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