Как повысить производительность 10-минутного запроса?
У меня есть запрос, который занимает примерно 10 минут, чтобы выполнить и получить результаты. Когда я пытаюсь разбить его на части и запустить, он, кажется, работает нормально, в течение нескольких секунд.
Я попытался изменить подвыборку верхней части запроса и определить, является ли это причиной проблемы, но это было не так. Он выдал некоторые результаты в течение 3 секунд.
Затем я прогнал нижнюю часть отдельно,
join(select glP.fkosControlNumberStatus....
И он побежал в течение 1 секунды.
Я пытаюсь научиться читать предполагаемый план выполнения, но он становится все более запутанным и трудным для меня, чтобы проследить эту проблему.
Кто-нибудь может помочь мне в улучшении производительности этого запроса, пожалуйста?
Что я уже пробовал:
Set Nocount On Declare @YearEndDate DateTime = '2016-12-31' set @YearEndDate = dbo.fnGetDatePartOnly(@YearEndDate) Select Distinct glPostExtended.BatchNumber, postData.fkosControlNumberStatus, postData.AccountSegment Fund, postdata.Debit, postData.Credit, postdata.DistAmountTotal, glPostExtended.SubLedger Module, glPost.SourceJENumber, glPost.PostToDate From glPost WITH (NOLOCK) --This joins limits the glPostExtended Records from duplicating glPost Records for Summarized posting join (Select fkglPost, MAX(fkglDist) as fkglDist, COUNT(fkglDist) as RecordCount From glPostExtended WITH (NOLOCK) Group By fkglPost) as glPostExtendedLimiter on glPost.PK = glPostExtendedLimiter.fkglPost join glPostExtended WITH (NOLOCK) on glPostExtendedLimiter.fkglPost = glPostExtended.fkglPost and (glPostExtendedLimiter.fkglDist = glPostExtended.fkglDist or glPostExtended.fkglDist is null) join (select glP.fkosControlNumberStatus, glP.SourceJENumber, AccountSegment, sum(case when glP.DistAmount > 0 then glP.DistAmount else 0 end) Debit, sum(case when glP.DistAmount < 0 then glP.DistAmount else 0 end) Credit, sum(glP.DistAmount) DistAmountTotal from glPost glP WITH (NOLOCK) join glAccountingPeriod WITH (NOLOCK) on glAccountingPeriod.pk = glP.fkglAccountingPeriod join glFiscalYear WITH (NOLOCK) on glFiscalYear.pk = glAccountingPeriod.fkglFiscalYear join glAccount WITH (NOLOCK) on glAccount.pk = glFiscalYear.fkglAccount where dbo.fnGetDatePartOnly(glFiscalYear.PeriodEnd) = @YearEndDate and glP.fkMLSosCodeEntryType = 2202 group by glP.fkosControlNumberStatus, glP.SourceJENumber, AccountSegment) postdata on postdata.fkosControlNumberStatus = glPost.fkosControlNumberStatus and postdata.SourceJENumber = glPost.SourceJENumber where postdata.DistAmountTotal <> 0 and glPost.fkMLSosCodeEntryType = 2202 order by glPostExtended.BatchNumber, glPost.SourceJENumber, postData.AccountSegment
Попробовал изменить верхнюю часть подселективного соединения Вот так, и это не заняло слишком много времени
Select Distinct glPostExtended.BatchNumber, --postData.fkosControlNumberStatus, --postData.AccountSegment Fund, --postdata.Debit, --postData.Credit, --postdata.DistAmountTotal, glPostExtended.SubLedger Module, glPost.SourceJENumber, glPost.PostToDate From (Select fkglPost, MAX(fkglDist) as fkglDist, COUNT(fkglDist) as RecordCount From glPostExtended WITH (NOLOCK) Group By fkglPost) as glPostExtendedLimiter join glPostExtended WITH (NOLOCK) on glPostExtendedLimiter.fkglPost = glPostExtended.fkglPost and (glPostExtendedLimiter.fkglDist = glPostExtended.fkglDist or glPostExtended.fkglDist is null) inner join glPost WITH (NOLOCK) on glPostExtendedLimiter.fkglPost = glPost.PK
ZurdoDev
Вам нужно обратиться к плану выполнения. Мы никак не можем знать, что заставляет его тянуться так долго.
RickZeeland
Однажды у меня была такая загадочная проблема,как перестройка / реорганизация индексов.
Видишь http://www.sql-server-performance.com/2007/rebuilding-indexes/