2013-03-19 3 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은 또한 lacs 항목을 가지고 있습니다. 다른 방법으로 상위 1 위를 사용하거나 극복하는 단계는 무엇입니까?

+0

테이블 기본 키와 외래 키를 인덱스로 만듭니다 .It 쿼리 결과를 빨리 처리 할 것입니다. – Rahul

답변

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

예, 테이블의 해당 열에 인덱싱을 적용하여 매우 빠르게 작동하는 것처럼 보입니다. –

+0

아, 잘 했어. 그 때마다 대답이 1 파운드가된다면 ... 여전히 인덱스가 좋은 깨끗한 코드만큼 중요하다고 생각한다면 세상은 더 좋은 곳입니다. –

관련 문제