powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Прошу помощи в оптимизации запроса....
20 сообщений из 20, страница 1 из 1
Прошу помощи в оптимизации запроса....
    #38329398
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не могу оптимизировать, точнее не знаю как, работает 8 сек (это при основной таблице в 74к записей, и связанной с ней в 4 записи)
Код: 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.
declare @mindate int
set @mindate=2012   

select Eo.FedRegion, Eo.Shortname,
	'Result'=case
	when 
	(SELECT top(1) id
	FROM dbo.PrimaryEduDocImportPackage
	WHERE dbo.PrimaryEduDocImportPackage.EduOrgId = EO.Id
	and  PrimaryEduDocImportPackage.StatusId not in (6,7,3,5,101) and PrimaryEduDocImportPackage.IssueYear = @mindate) is null 
	then 0--'Не предоставлены', 

	when 
	(SELECT top(1) id
	FROM dbo.PrimaryEduDocImportPackage  
	WHERE dbo.PrimaryEduDocImportPackage.EduOrgId = EO.Id
	and  PrimaryEduDocImportPackage.StatusId in (3,5,101) and PrimaryEduDocImportPackage.StatusId not in (6,7)  and PrimaryEduDocImportPackage.IssueYear = @mindate) is not null 
	then 1--'Предоставлены, но требуется повторная отправка данных (выявлены ошибки при обработке)'
	when 
	(SELECT top(1) id
	FROM dbo.PrimaryEduDocImportPackage
	WHERE dbo.PrimaryEduDocImportPackage.EduOrgId = EO.Id
	and  PrimaryEduDocImportPackage.StatusId in (6,7) and PrimaryEduDocImportPackage.IssueYear = @mindate) is not null 
	then 2--'Предоставлены'
	else 0
	end,
	'someyear'=case
	when ((select top(1) id
	from dbo.EduOrgYearStatus
	where dbo.EduOrgYearStatus.EduOrgId=EO.Id and dbo.EduOrgYearStatus.[Year] = @mindate
	and EduOrgYearStatus.EduOrgActive=1 and EduOrgYearStatus.EduOrgHasAccred=1 and EduOrgYearStatus.EduOrgIssuesDocs=0
	and EduOrgYearStatus.EduOrgIssuesStateDocs=0 and EduOrgYearStatus.EduOrgLicensed=1) is not null)
	or
	((select top(1) id
	from dbo.EduOrgYearStatus
	where dbo.EduOrgYearStatus.EduOrgId=EO.Id and dbo.EduOrgYearStatus.[Year] = @mindate
	and EduOrgYearStatus.EduOrgActive=1 and EduOrgYearStatus.EduOrgHasAccred=0 and EduOrgYearStatus.EduOrgIssuesDocs=0
	and EduOrgYearStatus.EduOrgIssuesStateDocs=0 and EduOrgYearStatus.EduOrgLicensed=1) is not null)
	or
	((select top(1) id
	from dbo.EduOrgYearStatus
	where dbo.EduOrgYearStatus.EduOrgId=EO.Id and dbo.EduOrgYearStatus.[Year] = @mindate
	and EduOrgYearStatus.EduOrgActive=1 and EduOrgYearStatus.EduOrgHasAccred=1 and EduOrgYearStatus.EduOrgIssuesDocs=0
	and EduOrgYearStatus.EduOrgIssuesStateDocs=0 and EduOrgYearStatus.EduOrgLicensed=1) is not null)	
	or
	((select top(1) id
	from dbo.EduOrgYearStatus
	where dbo.EduOrgYearStatus.EduOrgId=EO.Id and dbo.EduOrgYearStatus.[Year] = @mindate
	and EduOrgYearStatus.EduOrgActive=1 and EduOrgYearStatus.EduOrgHasAccred=0 and EduOrgYearStatus.EduOrgIssuesDocs=0
	and EduOrgYearStatus.EduOrgIssuesStateDocs=0 and EduOrgYearStatus.EduOrgLicensed=0) is not null)
	or 
	((select top(1) id
	from dbo.EduOrgYearStatus
	where dbo.EduOrgYearStatus.EduOrgId=EO.Id and dbo.EduOrgYearStatus.[Year] = @mindate
	and EduOrgYearStatus.EduOrgActive=2 and EduOrgYearStatus.EduOrgHasAccred=0 and EduOrgYearStatus.EduOrgIssuesDocs=0
	and EduOrgYearStatus.EduOrgIssuesStateDocs=0 and EduOrgYearStatus.EduOrgLicensed=0) is not null)
	then 0
	else 1
	end
	from EducationOrganization EO inner join dbo.EduOrgForm OPF on EO.OrgFormId = OPF.Id
--	left join dbo.PrimaryEduDocImportPackage on EO.id=dbo.PrimaryEduDocImportPackage.EduOrgId
	where 
	
	EO.LeadingEduOrgId is null 
	and EO.IsActive = 1
	and EO.Id <> '5F6A52CE-060E-47DA-84E5-23DD412EFFCA'


всю хранимку могу показать, суть в том, что мне нужен был цикл на несколько дат (реализовал через while), но суть не в этом....именно этот кусок жрёт огромную часть ресурсов. Куда капнуть? не кидайтесь тапками, не силён я в оптимизации
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329404
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pew pew pew,

у вас на каждую запись в выборке выполняется куча однотипных коррелированных подзапросов. Избавляйтесь от этого. К тому же TOP принято использовать с ORDER BY.
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329412
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
эм, писать такие подзапросы я умею, а про избавление можно подробнее?
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329415
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pew pew pew,

OUTER/CROSS APPLY, если позволяет версия сервера
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329427
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
окей, я напишу cross apply для каждого из условий (хотя смысл этого, условия однотипны, но всё-таки разные...или я чего-то не понимаю?) и будет быстрее?
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329431
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pew pew pew,

объедините все ваши условия так, чтобы получить необходимые данные
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329480
LexusR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй что нибудь в таком ключе
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select Eo.FedRegion, Eo.Shortname
,Result = (select top 1  case when p.StatusId in (6,7) then 2
			when p.StatusId in (3,5,101) then 1
		               else 0
                                    end
               from dbo.PrimaryEduDocImportPackage p on p.EduOrgId=EO.Id and p.IssueYear = @mindate
               order by 1 desc
               )
,someyear=......
from EducationOrganization EO inner join dbo.EduOrgForm OPF on EO.OrgFormId = OPF.Id
where 
EO.LeadingEduOrgId is null 
and EO.IsActive = 1
and EO.Id <> '5F6A52CE-060E-47DA-84E5-23DD412EFFCA'
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329503
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pew pew pew,
и обычно вместо конструкции when (select top (1) ...) is not null пишут when exists (select ... )
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329579
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LexusR,
Это облегчение конструкции, на план запроса никак не влияет.... :(
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329584
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pew pew pew, ну и где план?
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329610
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329612
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329628
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pew pew pewLexusR,
Это облегчение конструкции, на план запроса никак не влияет.... :(не верю
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329643
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, изменения есть, но не в производительности, на скорость не повлияло
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329644
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329667
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pew pew pew,

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

и вместо простыни 'someyear' можно написать так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
	'someyear' = case
	when exists(
		select eoys.EduOrgActive, eoys.EduOrgHasAccred, eoys.EduOrgLicensed
		from dbo.EduOrgYearStatus AS eoys
		where eoys.EduOrgId=EO.Id and eoys.[Year] = @mindate and eoys.EduOrgIssuesDocs = 0 and eoys.EduOrgIssuesStateDocs = 0

		intersect 
		select EduOrgActive, EduOrgHasAccred, EduOrgLicensed from (values 
			(1, 1, 1),
			(1, 0, 1),
			(1, 1, 1),
			(1, 0, 0),
			(2, 0, 0)
		) a(EduOrgActive, EduOrgHasAccred, EduOrgLicensed)

	) then 1 else 0 end
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329711
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
План последнего запроса был первым опубликован, вторым я запилил простыню
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329716
pew pew pew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сейчас перепишу полностью тогда , опубликую чуть позже
...
Рейтинг: 0 / 0
Прошу помощи в оптимизации запроса....
    #38329784
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL.RU - работаем за спасибо.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Прошу помощи в оптимизации запроса....
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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