2017-07-14 138 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那裏我們看到的

  1. 操作的順序
  2. ON
  3. OUTER
  4. WHERE
  5. GROUP BY
  6. CUBE | ROLLUP
  7. HAVING
  8. 選擇
  9. DISTINCT 10 ORDER BY
  10. TOP

SQL Server實際上你的WHERE參數完成完整的查詢然後限制它。如果非要在這個數據庫中的表管理訪問,我會考慮在加入索引,以最小:

  • 現場Event_StartTime
  • 事件ID,LinkedEventID和用戶名在每個表dwh.mcd_DWH_Events(如果不是主鍵)
  • dwh.mcd_FWT_UserEventAssociations_Detailed_Manager現場Activity_TypeID現場Activity_MetaDataFieldValue

一個好的

  • views.mcd_FWT_ActivitiesExtraDetails經驗法則是日期和id應該被編入索引,並且一般而言,您將合理地定期將其放置到where語句中的任何字段。

  • +1

    所有的優點,但他們可能並沒有真正回答OP的問題,主要是因爲沒有足夠的信息,所以沒有人可以回答這個問題...... – DavidG

    +1

    這是**邏輯**操作順序。不是物理的。 「SQL Server實際完成完整的查詢,然後通過WHERE參數限制它」絕對不是您可以認爲通常是真實的陳述。這是查詢優化器的重點。 –

    相關問題