2017-08-07 21 views
-2

私はこの出力で最適化SQLクエリ

--create view [dbo].[vw_trnSchemeActivityExecutionStatus] 
--as 
select 
    mstSchemeID, mstSchemeName, mstSchemeNFOStartDate, mstSchemeNFOClosureDate, 
    mstSchemeAllotmentDate, mstSchemeIsActive,mstSchemeNFOType, mstSchemeIsWoundOff, 
    mstSchemeCompletedActivity, mstschemeCreatedOn, 
    Completed, Pending, PendingToday, PendingDueDate, FutureActivity, 
    (PendingDueDate + PendingToday + FutureActivity + Completed) as Total 
from 
    (select 
     sum(case when ActivityExecutionDueDate <> '' 
         and convert(varchar(10), ActivityExecutionDueDate, 112) < convert(varchar(10), GETDATE(), 112) 
         and (isnull(trnActivityExecutionDate, '') = '' or trnActivityExecutionStatus= 'P') 
        then 1 
        else 0 
       end) as PendingDueDate, 
     sum(case when ActivityExecutionDueDate <> '' 
         and convert(varchar(10), ActivityExecutionDueDate, 112) > convert(varchar(10), GETDATE(), 112) 
         and isnull(trnActivityExecutionDate, '') = '' 
        then 1 
        else 0 
       end) as FutureActivity, 
     sum(case when ActivityExecutionDueDate <> '' 
         and isnull(trnActivityExecutionDate, '') = '' 
         and convert(varchar(10), ActivityExecutionDueDate, 112) = convert(varchar(10), getdate(), 112) 
        then 1 
        else 0 
       end) as PendingToday, 
     sum(case when ActivityExecutionDueDate <> '' 
         and isnull(trnActivityExecutionDate, '') = '' 
        then 1 
        else 0 
       end) as Pending, 
     sum(case when ActivityExecutionDueDate <> '' 
         and trnActivityExecutionDate <> '' 
         and trnActivityExecutionStatus = 'C' 
        then 1 
        else 0 
       end) as Completed, 
     mstSchemeID, mstSchemeName, mstSchemeNFOStartDate, mstSchemeNFOClosureDate, 
     mstSchemeAllotmentDate, mstSchemeIsActive, mstSchemeNFOType,  
     mstSchemeIsWoundOff, mstSchemeCompletedActivity, mstschemeCreatedOn 
    from 
     vw_trnSchemeActivityExecution 
     where 
      ActivityCheckListItemIsActive = 1 and mstSchemeIsActive = 1 
     group by 
      mstSchemeID, mstSchemeName, mstSchemeNFOStartDate, mstSchemeNFOClosureDate, 
      mstSchemeAllotmentDate, mstSchemeIsActive, mstSchemeNFOType, mstSchemeIsWoundOff, 
      mstSchemeCompletedActivity, mstschemeCreatedOn) b 

を最適化するための2つのビューを持っては1時40分で54行として来ます。

そして、上記のビューで使用される2番目のビューは次のようになります。このビューで

--CREATE VIEW [dbo].[vw_trnSchemeActivityExecution] 
--AS 
select mstSchemeID,mstSchemeName,mstSchemeNFOStartDate,mstSchemeNFOClosureDate,mstSchemeAllotmentDate, 
mstSchemeIsActive, mstSchemeIsWoundOff, mstSchemeCompletedActivity, mstSchemeNFOType,mstSchemeCreatedOn, 
ActivityExecutionID,ActivityExecutionName, ActivityCheckListItemIsActive,ActivityCheckListItemDocumentTemplateID 
,ActivityCheckListItemDocumentAttachmentRequired,ActivityCheckListItemEmailGroupID, ActivityCheckListItemEmailTemplateID, 
ActivityCheckListItemNatureofActivity ,ActivityExecutionDueDate,ActivityCheckListItemAllowExternalDocument, 
t.trnActivityExecutionID,t.trnActivityExecutionSchemeID,t.trnActivityExecutionDate, 
t.trnActivityExecutionStatus,t.trnActivityExecutionCreatedBy, 
t.trnActivityExecutionDueDate, t.trnSchemeActivityExecutionID, t.trnActivityExecutionRemark, 
CASE WHEN cnt > 0 THEN 1 ELSE 0 END AS 'IsDocumentAttached' 
    from 
    (select 
    s.mstSchemeID, s.mstSchemeName, 
    s.mstSchemeNFOStartDate, 
    s. mstSchemeNFOClosureDate, 
    s.mstSchemeAllotmentDate, 
    s.mstSchemeIsActive, 
    s.mstSchemeIsWoundOff, 
    s.mstSchemeCompletedActivity, 
    s.mstSchemeNFOType, 
    s.mstSchemeCreatedOn, 
    a.ActivityCheckListItemID as [ActivityExecutionID], 
    a.ActivityCheckListItemName as [ActivityExecutionName], 
    a.ActivityCheckListItemIsActive, 
    a.ActivityCheckListItemDocumentTemplateID, 
    a.ActivityCheckListItemDocumentAttachmentRequired, 
    a.ActivityCheckListItemEmailGroupID, 
    a.ActivityCheckListItemEmailTemplateID, 
    a.ActivityCheckListItemNatureofActivity, 
    a.ActivityCheckListItemTimelineOn, 
    a.ActivityCheckListItemTimelineOperator, 
    a.ActivityCheckListItemTimelineDays, 
    a.ActivityCheckListItemAllowExternalDocument, 
    case 
     when ActivityCheckListItemTimelineOn = 'S' and ActivityCheckListItemTimelineOperator = '1' 
     then (select dbo.fnGetNextPreviousWorkingDay(s.mstSchemeNFOStartDate,a.ActivityCheckListItemTimelineDays)) 

    when ActivityCheckListItemTimelineOn = 'S' and ActivityCheckListItemTimelineOperator = '0' 
    then (select dbo.fnGetNextPreviousWorkingDay(s.mstSchemeNFOStartDate,-a.ActivityCheckListItemTimelineDays)) 

    when ActivityCheckListItemTimelineOn = 'C' and ActivityCheckListItemTimelineOperator = '1' 
    then (select dbo.fnGetNextPreviousWorkingDay(s.mstSchemeNFOClosureDate,a.ActivityCheckListItemTimelineDays)) 

    when ActivityCheckListItemTimelineOn = 'C' and ActivityCheckListItemTimelineOperator = '0' 
    then (select dbo.fnGetNextPreviousWorkingDay(s.mstSchemeNFOClosureDate,-a.ActivityCheckListItemTimelineDays)) 

    when ActivityCheckListItemTimelineOn = 'A' and ActivityCheckListItemTimelineOperator = '1' 
    then (select dbo.fnGetNextPreviousWorkingDay(s.mstSchemeAllotmentDate,a.ActivityCheckListItemTimelineDays)) 

    when ActivityCheckListItemTimelineOn = 'A' and ActivityCheckListItemTimelineOperator = '0' 
    then (select dbo.fnGetNextPreviousWorkingDay(s.mstSchemeAllotmentDate,-a.ActivityCheckListItemTimelineDays)) 

end as [ActivityExecutionDueDate] 
from vw_mstScheme s cross join 
mstActivityCheckListItems a where a.ActivityCheckListItemIsActive = 1 and s.mstSchemeNFOType='C') m --s.mstSchemeIsActive = 1 and 
left join trnSchemeActivityExecution t on t.trnActivityExecutionSchemeID = m.mstSchemeID and 
      t.trnActivityExecutionID = m.ActivityExecutionID 
LEFT JOIN (
SELECT mstActivityID,count(TemplateID) as cnt FROM dbo.mstActivityItemDocuments a 
inner join mstTemplates t on t.TemplateID = a.mstDocumentID and (t.TemplateType = 'D' or t.TemplateType = 'B') 
GROUP BY mstActivityID 
)cte1 ON m.ActivityExecutionID= cte1.mstActivityID 

9500行

誰もがこのクエリに

+0

詳細を提供するまで誰でもあなたを助けることはできません。あなたはやや低いレベルを開始し、最初に 'vw_mstScheme'レベルで何が起こるかを調べるべきですか?次に、次のレベルでビューを最適化しようとする場合があります。 とにかく、ここで使用している構造体(テーブル、インデックスなど)についての情報を提供する必要があります。 –

+0

SSMSの実行計画と欠落しているインデックスのヒントを使用します。このように、問題はあまりにも広範であり、答えることができません。 –

答えて

1

を最適化するために助けることができる2時35分で来ますSQL実行計画は、クエリの最適化を開始する最も良い方法です。これはボトルネックを示し、クエリのどの部分が実行時間が長くなっています。

また、ソースビューで利用可能な行数を共有します。いいえを理解する。これらの結果を生成するためにクエリ処理を実行します。