2017-07-14 8 views
-1

実行しようとしているクエリがあります。今は、開始日と終了日のパラメータを使用しています。約50秒後、合計33行が得られます。これは非常に時間がかかると感じています。パラメータを削除すると、1582行が返されます。これは戻って53秒しかかかりません。SQL Serverクエリの実行に50秒以上かかる

私は何をすべきか分かりません。私は余分な結合を取り除こうとしました(いくつかありました)。これはクエリの戻り時間を短縮するものではありませんでした。可能であれば、30秒以内にクエリを返すことができます。ありがとうございました。

DECLARE @StartDate DATETIME 
SET @StartDate = '2017-04-30 00:00:00.000' 
SET @EndDate = '2017-07-31 08:00:00.000' 
SELECT 
a.PrimaryEventID, 
b.Event_Name as 'PrimaryEventName', 
b.Event_StartTime as 'EventDate', 
e.UserLastName+', '+e.UserFirstName as 'Operator', 
f.Activity_MetaDataFieldValue as 'Type', 
'Status' = Case 
     When c.EventStatus = 0 then 'Tent' 
     When c.EventStatus = 1 then 'Appr' 
     When c.EventStatus = 2 then 'Pend' 
     Else 'No Status Found' 
End, 
CONVERT(varchar(20), a.PrimaryEventID)+'|'+CONVERT(varchar(20), e.UserId) 
as 'JoinColumn', 
b1.Activity_MetaDataTypeID 
FROM 
    views.mcd_DWH_LinkedEvents a 
    Left JOIN dwh.mcd_DWH_Events b ON a.PrimaryEventID = b.Event_ID 
    Left JOIN rawViews.mcd_DWH_ActivitiesBasicData b1 on b.EventActivity_ID = b1.Activity_ID 
    Left JOIN dwh.mcd_DWH_Events c ON a.LinkedEventID = c.Event_ID 
    Left JOIN dwh.mcd_FWT_UserEventAssociations_Detailed_Manager d ON a.LinkedEventID = d.Event_ID 
    Left JOIN views.mcd_FWT_UsersBasicData e ON d.User_ID = e.UserID 
    Left JOIN views.mcd_FWT_ActivitiesExtraDetails f ON c.EventActivity_ID = f.Activity_ID and f.Activity_MetaDataFieldName = 'Type' 
    Left JOIN views.mcd_FWT_TrainingProgramsBasicData g ON c.EventTrainingProgram_ID = g.TrainingProgramID 
    Left JOIN views.mcd_FWT_MPlansBasicData h ON g.TrainingProgram_MPlanID = h.MPlanID 
WHERE d.Activity_TypeID = 57 
    and b.Event_StartTime between @StartDate and @EndDate 
    and (f.Activity_MetaDataFieldValue = 'Qual' or f.Activity_MetaDataFieldValue = 'Run' or f.Activity_MetaDataFieldValue = 'Assess') 
GROUP by a.PrimaryEventID, b.Event_Name,b.Event_StartTime, h.MPlanName, f.Activity_MetaDataFieldValue, e.UserLastName, e.UserFirstName, c.EventStatus, e.UserId, b1.Activity_MetaDataTypeID 
+1

参加する列にインデックスがありますか?また、 'b.Event_StartTime'はDATETIMEフィールドでもあります(つまり、クエリに使用する変数と同じデータ型ですか?そうでない場合、インデックスは使用されません) – RToyo

+1

クエリプランを見るとそれはすべてのインデックスを示唆していますか?私が推測しなければならないことがあれば、おそらくすべてのビューはそれぞれ数秒かかるでしょう。 – SteveB

+4

少なくとも実行計画を見なければ、ここでは何もできません。 – DavidG

答えて

1

まず、期待と現実を打ち消しましょう。論理的には、Whereステートメントでクエリの実行時間が短縮されると仮定しているようです。論理的には、それは理にかなっているようですが、これはSQL Serverの動作方法ではありません。 |

https://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/from我々はOUTER

  • GROUP
  • CUBE BY
  • ON
  • FROM

    1. の操作の順序を参照してください考えてみましょう
    2. BY
    3. を備えたROLLUP
    4. DISTINCT 10順序を選択
    5. TOP

    SQL Serverが実際にあなたのWHEREパラメータで、それを制限その後、完全なクエリを完了します。主要でない場合(すべてのテーブル内のフィールドEvent_StartTime

  • イベントID、LinkedEventID、およびユーザーIDの

    • dwh.mcd_DWH_Events:あなたは、このデータベース内のテーブルへの管理アクセスを持っている場合、私は最低でも、上のインデックスを追加することを検討しますフィールド上のキー)
    • dwh.mcd_FWT_UserEventAssociations_Detailed_Managerは、フィールド上のActivity_MetaDataFieldValue
    • views.mcd_FWT_ActivitiesExtraDetails

    良いActivity_TypeID経験則は日付であり、IDは索引付けされるべきであり、一般的に、あなたが合理的にwhereステートメントに定期的に配置する予定のフィールドです。

  • +1

    良い点はありますが、OPが持っている問題には実際には答えられません。なぜなら、十分な情報がないため誰も答えられないからです。 – DavidG

    +1

    これは**論理的な動作の順序です。物理的ではありません。 「SQL Serverは実際に完全なクエリを完了した後、WHEREパラメータでSQL Serverを制限します」という文言は、一般的に真であると考えることはできません。これはクエリオプティマイザのポイントです。 –

    関連する問題