2013-03-19 92 views
0

我有下面的sql查询。只有一个表的SQL查询 - 花费太多时间

declare @RoleID int 
SELECT @RoleID = RoleID FROM RoleMaster WHERE RoleEnglishDesc = 'Surveyor' 

SELECT * FROM (
SELECT 
    S.ShiftID, 2 AS Flag, ISNULL(U.Latitude, 0) Latitude, ISNULL(U.Longitude, 0) Longitude, 
    U.EmployeeEnglishName AS ToolTipEnglish, U.EmployeeArabicName AS ToolTipArabic, 
    0 AS CaseStageID, COUNT(C.SurveyorAssigned) AS Assigned 
    -- L.EntryTime AS LastEntryTime 
    -- S1.cnt AS OnBreak 
FROM 
    Users U 
    INNER JOIN dbo.SurveyorShift S ON S.UserId = U.UserID AND S.ShiftStatus = 1 
    LEFT JOIN CaseInfoCommandQueue C ON C.SurveyorAssigned = U.UserID 
WHERE U.IsActive = 1 
    AND NULLIF(NULLIF(U.Latitude, '0'), '') IS NOT NULL 
    AND NULLIF(NULLIF(U.Longitude, '0'), '') IS NOT NULL 
    AND ((U.RoleID = @RoleID) OR (U.RoleID2 = @RoleID) OR (U.RoleID3 = @RoleID)) 
GROUP BY U.UserID, RoleID, Latitude, Longitude, EmployeeEnglishName, EmployeeArabicName, ShiftID 
) D 
OUTER APPLY 
(
SELECT TOP 1 EntryTime FROM DeviceUserLocation DLoc 
WHERE DLoc.ShiftID = D.ShiftID ORDER BY DLoc.EntryTime DESC 
) AS L 

我唯一的问题在最后一个外面申请获取进入时间。因为外部应用只需要10秒。该表的DeviceUserLocation也有条目。任何克服或步骤使用其他方式的顶部1?

+0

使您的表主键和外键作为索引。它将加快您的查询结果。 – Rahul 2013-03-19 09:07:46

回答

0

创建覆盖索引为您的数据,请务必在每张桌子上有一个聚集索引和上述再按键,如果你不知道的聚集和覆盖索引然后在这里:http://en.wikipedia.org/wiki/Database_index#Covering_index,尤其是在这里:https://www.simple-talk.com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/您的查询可能做表扫描(搜索或检查每一行)而不是索引查找:在索引中查找值并直接转到该行。 (它不能做索引查找,如果没有和该列索引,并且它不能直接,如果没有聚集索引)

+0

是的,我在表格的那一列上应用索引,现在看起来工作得非常快。 – 2013-03-19 10:02:19

+0

嗯,做得好,如果每次都有一英镑的答案......但如果这意味着您认为索引与干净的代码一样重要,那么世界是一个更好的地方。 – 2013-03-19 11:18:05