2017-09-28 58 views
0

這個查詢工作正常,只有一個問題,那就是他的執行時間很長。有人可以向我展示一些很好的優化並解釋它們。SQL很長的執行時間

SELECT TOP 5 PC.PersonID, P.FirstName, P.LastName, P.A, COUNT(*) Together 
    FROM PersonCheckIn PC 

    INNER JOIN Person P ON P.PersonID = PC.PersonID 

    WHERE CAST(CheckInDate AS DATE) IN (SELECT CAST(CheckInDate AS DATE) 
         FROM PersonCheckIn C  
          WHERE C.PersonId = 20) AND 

         PC.TimeTableID IN (SELECT CIn.TimeTableID 
         FROM PersonCheckIn CIn 
          WHERE CIn.PersonId = 20) 
    AND PC.PersonId <> 20 -- not count same person 

    GROUP BY PC.PersonId, P.FirstName, P.LastName, P.A 
    ORDER BY Together DESC; 
+1

最低限度你應該[包括實際的執行計劃](https://stackoverflow.com/a/7359705/1260204),你可以使用[粘貼計劃](https://www.brentozar.com/pastetheplan /)並在你的問題中分享鏈接。另外[嘗試自己讀](https://stackoverflow.com/a/759097/1260204),也許你可以找出與您的查詢性能問題(S)。最後,包括[schema DDL](https://en.wikipedia.org/wiki/Data_definition_language)以及正在執行的查詢。 – Igor

+0

如果有很多記錄,那麼順序將需要一段時間。當你刪除兩個派生表時會發生什麼?我同意@Igor – scsimon

回答

0

避免子查詢和IN()語句將drasticaly減少的執行時間......

即使如此CheckInDate不其表的別名在查詢前綴(我們不得不猜測魔女表關注:(),也許這將做的工作:

SELECT TOP 5 PC.PersonID, P.FirstName, P.LastName, P.A, COUNT(*) Together 
    FROM PersonCheckIn PC 
    INNER JOIN Person P ON P.PersonID = PC.PersonID 
    INNER JOIN PersonCheckIn LU ON (LU.PersonId = 20 AND PC.CheckInDate = LU.CheckInDate AND PC.TimeTableID = LU.TimeTableID)  
    WHERE PC.PersonId <> 20 -- not count same person 
    GROUP BY PC.PersonId, P.FirstName, P.LastName, P.A 
    ORDER BY Together DESC; 

如果沒有,請:
- 設置缺少別名
- 給使用數據structur。即
- 給我們提供數據例子。
- 給我們預期的結果例子。