powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизировать подзапрос
16 сообщений из 16, страница 1 из 1
Оптимизировать подзапрос
    #39920404
BlackEric
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В очень большом запросе для 2008 сервера очень медленно работает следующий кусок:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
outer apply (
		select top(1) cast(1 as bit) as ex
		from ASV_ResolutionTasks rt with(nolock)
		inner join TaskHistory th with(nolock)
			on th.RowID = rt.RowID
		inner join RoleUsers ru with(nolock)
			on ru.ID=rt.ControllerID
				and ru.UserID=1
		where rt.ID=rs.ID and rt.ControlCompleted=0
		and 
		(
			(adci.ForAdministrative=1 and ru.IsDeputy=0)
			or
			(adci.ForAdministrative=0)
		)
		and 
	 	(
	 		(th.OptionID != 1 and 
			 		th.OptionID != 2)
			or 
			  th.OptionID is null
		  	)
) is_task



Как можно его оптимизировать?
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920417
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие индексы есть на таблицах из запроса?
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920419
1C Developer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перепишите 42 строку.
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920428
BlackEric
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Первичные ключи по RowID и некоторое число неуникальных. Судя по плану - индексы используются.
Я вот думаю, если этот кусок попытатся вынести в материализованное представление - это поможет?
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920430
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1C Developer
Перепишите 42 строку.
обычно, ошибка в 17-й строке. А 42 - это правильный ответ на любой неправильный вопрос. ;)
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920431
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackEric
Первичные ключи по RowID и некоторое число неуникальных.
Весьма содержательно.

Не хотите отвечать - тогда показывайте актуальный план.
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920432
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackEric,

если у вас в этом подзаросе есть корреляция на данные из внешней таблицы - как вы оформите подзапрос в виде представления, да ещё и материализованного?
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920437
BlackEric
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
План в аттаче
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920446
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackEric,

По плану - нечему там тормозить. Что и подтверждается статистикой по выполнению и ожиданиям. CPU - 13 мс, ожиданий ASYNC_NETWORK_IO - 267 мс
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920816
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlackEric
В очень большом запросе для 2008 сервера очень медленно работает следующий кусок:

Как можно его оптимизировать?

Вангую:
Тормозит у вас не этот кусок, а то, что он миллион раз вызывается внешней частью запроса.
Там outer apply (select top (1) ... - значит будет nested loop, этот кусок вызовется 1 раз для каждой строки внешней выборки. Если во внешней выборке - миллион строк, то миллион раз и прокрутится.
Замените outer apply на left join, a необходимую вам "верхнюю" запись получайте пронумеровав Row_number() over (partition by rt.ID order by 1/0) N
1/0 - потому что у вас там top (1) без сортировки.
Ну и во внешнем запросе сделайте Select из этой выборки Where N=1.
Engine в таком случае, возможно, сможет использовать другие варианты соединения, hash или merge join, и ваш подзапрос, возможно, будет вызван 1 раз.

Такие общие соображения.
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920877
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackEric
В очень большом запросе для 2008 сервера очень медленно работает следующий кусок:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
outer apply (
		select top(1) cast(1 as bit) as ex
		from ASV_ResolutionTasks rt with(nolock)
		inner join TaskHistory th with(nolock)
			on th.RowID = rt.RowID
		inner join RoleUsers ru with(nolock)
			on ru.ID=rt.ControllerID
				and ru.UserID=1
		where rt.ID=rs.ID and rt.ControlCompleted=0
		and 
		(
			(adci.ForAdministrative=1 and ru.IsDeputy=0)
			or
			(adci.ForAdministrative=0)
		)
		and 
	 	(
	 		(th.OptionID != 1 and 
			 		th.OptionID != 2)
			or 
			  th.OptionID is null
		  	)
) is_task



Как можно его оптимизировать?


top(1) без order by - явный признак ненужности. Ибо запрашивающему пофиг, что там возвратится.
=> убрать совсем.
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39920880
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по select top(1) cast(1 as bit) as ex у вопрошающего есть еще вариант: выучить таки exists().
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39921693
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Судя по select top(1) cast(1 as bit) as ex у вопрошающего есть еще вариант: выучить таки exists().

Ему нужно получить признак наличия записей в подзапросе.
Как EXISTS поможет улучшить запрос?
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39922106
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович
aleks222
Судя по select top(1) cast(1 as bit) as ex у вопрошающего есть еще вариант: выучить таки exists().

Ему нужно получить признак наличия записей в подзапросе.
Как EXISTS поможет улучшить запрос?


exists выполняется через join.
Ежели ты не в курсе, join эффективнее apply.
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39922187
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
top(1) без order by - явный признак ненужности. Ибо запрашивающему пофиг, что там возвратится.
=> убрать совсем.
Если записей гарантировано будет не более одной, то пофиг на order by. А вот top 1 может таки подсказать оптимизатору, что записей будет не более одной, а 100500 тыщ, что может повлиять на план в лучшую сторону, если оптимизатор ошибся со статистикой.
...
Рейтинг: 0 / 0
Оптимизировать подзапрос
    #39922203
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
join эффективнее apply.


а что, уже добавили физический оператор объединения apply?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизировать подзапрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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