2013-03-19 87 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