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

Есть 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
30.06.2018, 10:16
    #39667812
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
ferzmikkЕсть SQL-запрос (без выделенного), который формируется за 6 минут при возвращении 20 000 строк.А в многоточии что, там нет TOP nnn ?
...
Рейтинг: 0 / 0
30.06.2018, 10:26
    #39667815
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
alexeyvgferzmikkЕсть SQL-запрос (без выделенного), который формируется за 6 минут при возвращении 20 000 строк.А в многоточии что, там нет TOP nnn ?TOP нет
...
Рейтинг: 0 / 0
30.06.2018, 11:12
    #39667825
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
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
30.06.2018, 11:21
    #39667827
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
ferzmikkНо если добавить ORDER BY, то выполняется дольше полтора часа, даже не дожидался.

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

Попробуйте сделать первый запрос INTO #temp, а потом выбрать из неё с сортировкой, думаю, и без всяких индексов 20 тыщ должно отсортировать быстро.
...
Рейтинг: 0 / 0
30.06.2018, 12:52
    #39667847
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
alexeyvgВидимо, как то криво строится план, сортирует в таблицах до накладывания ограничений.Подскажите, как можно скорректировать планы запросов?
Можно сравнить планы...Нужно обращать внимание на процент стоимости?
...
Рейтинг: 0 / 0
30.06.2018, 14:53
    #39667859
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
ferzmikkМожно сравнить планы...Нужно обращать внимание на процент стоимости?Нужно посмотреть, где делается сортировка.
ferzmikkalexeyvgВидимо, как то криво строится план, сортирует в таблицах до накладывания ограничений.Подскажите, как можно скорректировать планы запросов?Можно попробовать обновить статистику.
...
Рейтинг: 0 / 0
02.07.2018, 10:43
    #39668205
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
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
02.07.2018, 10:47
    #39668208
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
ferzmikk,

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

зы

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


текущая реальность сильно не рекомендует так делать... CREATE TABLE вместе с индексом и INSERT.... ms никогда не победит tempdb до конца :)
...
Рейтинг: 0 / 0
02.07.2018, 10:59
    #39668214
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
TaPaKтекущая реальность сильно не рекомендует так делать... Почему?
CREATE TABLE вместе с индексом и INSERT.... Я правильно понимаю, что после того, как табличную переменную Выгрузка4 - вставляем в созданную таблицу с индексами (не временная, назовем Таблица1) и там внутри сортируем? Или после вставки SELECT * FROM Таблица1 GROUP BY ...?
...
Рейтинг: 0 / 0
02.07.2018, 11:33
    #39668223
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
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
02.07.2018, 17:11
    #39668454
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос. Order by
ferzmikkЯ правильно понимаю, что после того, как табличную переменную Выгрузка4 - вставляем в созданную таблицу с индексами (не временная, назовем Таблица1) и там внутри сортируем? Или после вставки SELECT * FROM Таблица1 GROUP BY ...?Вы попробуйте индекс вообще не делать. Не факт, что сортировка при создании индекса будет быстрее, чем при выборке. Всё таки там нужно сохранять отсортированные данные.

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

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

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

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

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

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

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


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