0

以下の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を他の方法で使用するための克服またはステップはありますか?

4

1 に答える 1

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/クエリはおそらくテーブルスキャンを実行しています(すべての検索または調査行) ではなく、インデックス ルックアップ: インデックス内の値を見つけて、その行に直接移動します。(その列にインデックスがない場合はインデックス参照を実行できず、クラスター化インデックスがない場合は直接移動できません)

于 2013-03-19T09:38:09.173 に答える