2017-09-28 59 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。即
- 给我们提供数据例子。
- 给我们预期的结果例子。