Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest
не могу оптимизировать, точнее не знаю как, работает 8 сек (это при основной таблице в 74к записей, и связанной с ней в 4 записи)
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), но суть не в этом....именно этот кусок жрёт огромную часть ресурсов. Куда капнуть? не кидайтесь тапками, не силён я в оптимизации
12 июл 13, 14:13    [14558113]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
pew pew pew,

у вас на каждую запись в выборке выполняется куча однотипных коррелированных подзапросов. Избавляйтесь от этого. К тому же TOP принято использовать с ORDER BY.
12 июл 13, 14:19    [14558152]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest
эм, писать такие подзапросы я умею, а про избавление можно подробнее?
12 июл 13, 14:23    [14558186]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
pew pew pew,

OUTER/CROSS APPLY, если позволяет версия сервера
12 июл 13, 14:24    [14558200]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest
окей, я напишу cross apply для каждого из условий (хотя смысл этого, условия однотипны, но всё-таки разные...или я чего-то не понимаю?) и будет быстрее?
12 июл 13, 14:32    [14558286]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
pew pew pew,

объедините все ваши условия так, чтобы получить необходимые данные
12 июл 13, 14:34    [14558311]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
попробуй что нибудь в таком ключе
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'
12 июл 13, 14:50    [14558475]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
pew pew pew,
и обычно вместо конструкции when (select top (1) ...) is not null пишут when exists (select ... )
12 июл 13, 14:57    [14558530]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest
LexusR,
Это облегчение конструкции, на план запроса никак не влияет.... :(
12 июл 13, 15:41    [14558884]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
pew pew pew, ну и где план?
12 июл 13, 15:43    [14558909]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest


К сообщению приложен файл. Размер - 111Kb
12 июл 13, 15:58    [14559056]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest


К сообщению приложен файл. Размер - 18Kb
12 июл 13, 15:58    [14559064]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
pew pew pew
LexusR,
Это облегчение конструкции, на план запроса никак не влияет.... :(
не верю
12 июл 13, 16:10    [14559142]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest
Прошу прощения, изменения есть, но не в производительности, на скорость не повлияло
12 июл 13, 16:19    [14559210]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest


К сообщению приложен файл. Размер - 102Kb
12 июл 13, 16:19    [14559216]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2551
pew pew pew,

последний вариант запроса увидим?
12 июл 13, 16:28    [14559309]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
pew pew pew,

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

	'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
12 июл 13, 16:40    [14559407]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest
План последнего запроса был первым опубликован, вторым я запилил простыню
12 июл 13, 16:51    [14559492]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
pew pew pew
Guest
сейчас перепишу полностью тогда , опубликую чуть позже
12 июл 13, 16:54    [14559513]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи в оптимизации запроса....  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
SQL.RU - работаем за спасибо.
12 июл 13, 17:42    [14559878]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить