powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос. Order by
18 сообщений из 18, страница 1 из 1
Вопрос. Order by
    #39667808
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть SQL-запрос (без выделенного), который формируется за 6 минут при возвращении 20 000 строк.
SQL-запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WITH
Выгрузка1 AS (
    SELECT
        ...
)
SELECT
	*
FROM
	Выгрузка4
ORDER BY
	[Город],
	[Клиент],
	[Регион ТТ],
	[Код ТТ],
	[Код привязанного ассортимента],
	[Тип общего SKU],
	[Общее SKU],
	[SKU]

Но если добавить ORDER BY, то выполняется дольше полтора часа, даже не дожидался.

Как можно обойти эту проблему? Есть вариант толкать в TEMPORARY TABLE и задавать индексы. Скажите, какие есть другие варианты?
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39667812
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkЕсть SQL-запрос (без выделенного), который формируется за 6 минут при возвращении 20 000 строк.А в многоточии что, там нет TOP nnn ?
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39667815
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgferzmikkЕсть SQL-запрос (без выделенного), который формируется за 6 минут при возвращении 20 000 строк.А в многоточии что, там нет TOP nnn ?TOP нет
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39667825
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgferzmikkЕсть SQL-запрос (без выделенного), который формируется за 6 минут при возвращении 20 000 строк.А в многоточии что, там нет TOP nnn ?
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.
73.
74.
75.
76.
77.
78.
79.
...,
Выгрузка4 AS (
	SELECT
		Таб1.[Город],
		Таб1.[Клиент],
		Таб1.[Регион ТТ],		
		Таб1.[Код ТТ],		
		Таб1.[Торговая точка],		
		Таб1.[Адрес ТТ],
		Таб1.[Код привязанного ассортимента],
		Таб1.[Тип общего SKU],
		Таб1.[Общее SKU],
		Таб1.[SKU],
		Таб1.[Отгрузки шт],
		Таб1.[Новинка],
		Таб1.[Кол-во ТТ],
		Таб2.[Кол-во SKU в общем SKU],
		Таб2.[Кол-во отгрузок в общем SKU],
		Таб2.[Кол-во новинок в общем SKU],		
		(CASE
			WHEN Таб2.[Кол-во SKU в общем SKU] = 1 THEN
				(CASE
					WHEN Таб1.[Отгрузки шт] > 0 AND Таб1.[Новинка] = 'Да' THEN '' 
					WHEN Таб1.[Отгрузки шт] > 0 AND Таб1.[Новинка] = '' THEN '' 
					WHEN Таб1.[Отгрузки шт] = 0 AND Таб1.[Новинка] = 'Да' THEN 'Да' 
					WHEN Таб1.[Отгрузки шт] = 0 AND Таб1.[Новинка] = '' THEN ''
				ELSE
					''
				END) 
			WHEN Таб2.[Кол-во SKU в общем SKU] = 2 THEN
				(CASE
					WHEN Таб2.[Кол-во отгрузок в общем SKU]] = 1 AND Таб2.[Кол-во новинок в общем SKU] = 2 AND Таб1.[Отгрузки шт] = 0 THEN 'Да' 
					WHEN Таб2.[Кол-во отгрузок в общем SKU]] = 0 AND Таб2.[Кол-во новинок в общем SKU] = 2 THEN 'Да' 
					WHEN Таб2.[Кол-во отгрузок в общем SKU]] = 0 AND Таб2.[Кол-во новинок в общем SKU] = 1 AND Таб1.[Новинка] = 'Да' THEN 'Да' 
				ELSE
					''
				END)
		END) AS [Осталось отгрузить ТТ]
	FROM
		Выгрузка3 Таб1
	OUTER APPLY
		(SELECT
			[Код ТТ],
			[Код привязанного ассортимента],
			[Тип общего SKU]],
			[Общее SKU],
			COUNT([SKU]) AS [Кол-во SKU в общем SKU],
			SUM(CASE WHEN [Отгрузки шт] > 0 THEN 1 ELSE 0 END) AS [Кол-во отгрузок в общем SKU],
			SUM(CASE WHEN [Новинка] = 'Да' THEN 1 ELSE 0 END) AS [Кол-во новинок в общем SKU]			
		FROM
			Выгрузка3 Таб
		WHERE
			Таб1.[Код ТТ] = Таб.[Код ТТ] 
			AND
			Таб1.[Код привязанного ассортимента] = Таб.[Код привязанного ассортимента]
			AND
			Таб1.[Тип общего SKU] = Таб.[Тип общего SKU]
			AND
			Таб1.[Общее SKU] = Таб.[Общее SKU]
		GROUP BY
			[Код ТТ],
			[Код привязанного ассортимента],
			[Тип общего SKU],
			[Общее SKU]) Таб2
)

SELECT
	*
FROM
	Выгрузка4
ORDER BY
	[Город],
	[Клиент],
	[Регион ТТ],
	[Код ТТ],
	[Код привязанного ассортимента],
	[Тип общего SKU],
	[Общее SKU],
	[SKU]

...
Рейтинг: 0 / 0
Вопрос. Order by
    #39667827
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkНо если добавить ORDER BY, то выполняется дольше полтора часа, даже не дожидался.

Как можно обойти эту проблему? Есть вариант толкать в TEMPORARY TABLE и задавать индексы. Скажите, какие есть другие варианты?Видимо, как то криво строится план, сортирует в таблицах до накладывания ограничений.
Можно сравнить планы...

Попробуйте сделать первый запрос INTO #temp, а потом выбрать из неё с сортировкой, думаю, и без всяких индексов 20 тыщ должно отсортировать быстро.
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39667847
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВидимо, как то криво строится план, сортирует в таблицах до накладывания ограничений.Подскажите, как можно скорректировать планы запросов?
Можно сравнить планы...Нужно обращать внимание на процент стоимости?
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39667859
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkМожно сравнить планы...Нужно обращать внимание на процент стоимости?Нужно посмотреть, где делается сортировка.
ferzmikkalexeyvgВидимо, как то криво строится план, сортирует в таблицах до накладывания ограничений.Подскажите, как можно скорректировать планы запросов?Можно попробовать обновить статистику.
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668205
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgПопробуйте сделать первый запрос INTO #temp, а потом выбрать из неё с сортировкой, думаю, и без всяких индексов 20 тыщ должно отсортировать быстро.
SQL-запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
WITH
Выгрузка1 AS (
    SELECT
        ...
)

Select * INTO #Выгрузка FROM Выгрузка4
CREATE /*CLUSTERED*/ INDEX i1 ON #Выгрузка([Город],[Клиент],[Регион ТТ],[Код ТТ],[Код привязанного ассортимента], [Тип общего SKU], [Общее SKU], [SKU]); 

SELECT
	*
FROM
	Выгрузка4
ORDER BY
	[Город],
	[Клиент],
	[Регион ТТ],
	[Код ТТ],
	[Код привязанного ассортимента],
	[Тип общего SKU],
	[Общее SKU],
	[SKU]

Выполняется намного быстрее. Но не хотелось бы использовать времянку, так как увеличивает TempDB.
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668208
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

авторНо не хотелось бы использовать времянку, так как увеличивает TempDB.
а на кой она вообще тогда :)

зы

Код: sql
1.
2.
Select * INTO #Выгрузка FROM Выгрузка4
CREATE /*CLUSTERED*/ INDEX i1 ON #Выгрузка(


текущая реальность сильно не рекомендует так делать... CREATE TABLE вместе с индексом и INSERT.... ms никогда не победит tempdb до конца :)
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668214
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKтекущая реальность сильно не рекомендует так делать... Почему?
CREATE TABLE вместе с индексом и INSERT.... Я правильно понимаю, что после того, как табличную переменную Выгрузка4 - вставляем в созданную таблицу с индексами (не временная, назовем Таблица1) и там внутри сортируем? Или после вставки SELECT * FROM Таблица1 GROUP BY ...?
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668223
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

потому что гладиолусы там

авторyou use these methods as best practices in future Transact-SQL development:

Remove the DROP TABLE commands for any temporary tables that won't be reused within the same execution of the stored procedure. SQL Server will remove the temporary tables when the session that created the temporary tables has ended.

Avoid using the TRUNCATE TABLE command against temporary tables.

Avoid altering temporary tables after they have been created.

If indexes are created against the temporary table, consider moving these to inline index creation statements within the CREATE TABLE command.
со старыми проблемами с блокировками системных объектов tempdb
https://support.microsoft.com/en-us/help/4131193/performance-issues-occur-in-form-of-pagelatch-ex-and-pagelatch-sh-wait
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668454
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkЯ правильно понимаю, что после того, как табличную переменную Выгрузка4 - вставляем в созданную таблицу с индексами (не временная, назовем Таблица1) и там внутри сортируем? Или после вставки SELECT * FROM Таблица1 GROUP BY ...?Вы попробуйте индекс вообще не делать. Не факт, что сортировка при создании индекса будет быстрее, чем при выборке. Всё таки там нужно сохранять отсортированные данные.

TaPaKсо старыми проблемами с блокировками системных объектов tempdbДумаю, у ТС не такие нагрузки и не столько пользователей, что бы такие тонкости учитывать. Если он смотрит, как ускорить запрос с часов до минут. Какая нибудь ночная выгрузка, когда пользователи спят дома :-)
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668458
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

авторДумаю, у ТС не такие нагрузки и не столько пользователей, что бы такие тонкости учитывать. Если он смотрит, как ускорить запрос с часов до минут. Какая нибудь ночная выгрузка, когда пользователи спят дома :-)
нисомненно, проблемы вроде от 4к одновременных объектов. Речь про то, что мягкие намекают на стандарт разработки с исключением этих телодвижений
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668593
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgferzmikkЯ правильно понимаю, что после того, как табличную переменную Выгрузка4 - вставляем в созданную таблицу с индексами (не временная, назовем Таблица1 ) и там внутри сортируем? Или после вставки SELECT * FROM Таблица1 GROUP BY ...?Вы попробуйте индекс вообще не делать. Не факт, что сортировка при создании индекса будет быстрее, чем при выборке. Всё таки там нужно сохранять отсортированные данные.Получилось. Без индексов.

Интересует такой вопрос, если два пользователя или более одновременно вызвали процедуру, то как тут распределится Таблица1 ? Или надо прописать запрос так, что используется ли кем то Таблица1 или нет? В MS SQL Server есть какие нибудь технологии, которые учитывает или отлавливают такие подобные случаи?
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668616
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkИнтересует такой вопрос, если два пользователя или более одновременно вызвали процедуру, то как тут распределится Таблица1 ?Эээ, конечно, нужно использовать временную таблицу, не надо постоянную.
Вот как вы писали: Select * INTO #Выгрузка FROM Выгрузка4

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

С постоянной таблицей будет, во первых, медленней, во вторых, нужно будет разделять данные по коннектом, для чего придётся создавать кластерный индекс по SPID, в общем, всё будет хуже.
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668626
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgПотом, после завершения выполнения процедуры, таблица #Выгрузка сама удалится, ничего для этого делать не надо , ну и запускать можно в каком угодно количестве экземпляров, из разных коннектов.Как сама может удалиться без DROP #Выгрузка ? Или не удаляется, после завершения запроса, потому что там индексы есть?
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668628
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

вы хоть sql начните изучать, а не бомбите форму идиотизмом
...
Рейтинг: 0 / 0
Вопрос. Order by
    #39668712
Eleanor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkКак сама может удалиться без DROP #Выгрузка ?
Из документации :
Временные таблицы автоматически удаляются при выходе за пределы области определения , если не удалять их явно с помощью инструкции DROP TABLE.
Локальная временная таблица, созданная хранимой процедурой, удаляется автоматически при завершении хранимой процедуры.

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


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