ChrisM@Work (7/22/2014)
-- change the index to support a nested loops join between rs and r
-- with seeks to r on id and residual predicate of RNT and Man:
create nonclustered index IX_A on dbo.R
(Id,RNT,Man)
include (M,D)
-- change the non-sargable predicate in your WHERE clause
AND DATEDIFF(DAY, rs.LM, GETDATE()) <= @b-2
-- to something like this:
AND rs.LM > DATEADD(DAY,0-@B,GETDATE())
-- with no sample data to code against, you will have to tweak this yourself.
HI ..thx for your input ..much appreciate it !!
I have 1 heavy CPU time Sproc with high logical read on worktable as below ( any idea how to rewrite the query )
CREATE PROCEDURE [dbo].[GR]
@GN INT
AS
BEGIN
DECLARE @False bit, @True bit
SET @False = 0
SET @True = 1
SELECTR.RId,
iB.*,
CS.ContainerId,
CS.REPosition 'Position',
CS.StopIdStatus,
CS.[Route],
CS.LastConnected,
CS.LastStatusProcessed,
CS.LMR,
R.LT as LastTransactionBatch,
CS.LastStatusCreationTime,
B.RegNumber,
PJN.[Count] [PendingJobNumbers],
IssMarkedDoNotExport.[Count] [IssMarkedDoNotExport],
IssNotApproved.[Count] [IssNotApproved],
IssExported.[Count] [IssExported],
B.IsActive 'IsBActive',
GD.GName,
GD.GId,
G.GCode,
Iss.OutstandingIss,
LatestIsWithJobNumber.JobNumber,
OldestIs.TimeStatusStored 'OldestIs',
LatestInShiftMessage.IsInShift 'IsInShift',
(SELECT COUNT(*) FROM SMDE S INNER JOIN ROS I ON S.REOutstandingIsId = I.Id WHERE I.RId = R.RId AND DoNotExport = 0 AND IsExported = 0 AND Approved = 0) ReadyForApproval,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.IsOos = 1)
THEN @True ELSE @False END AS PossessOosFault,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.IsREFault = 1)
THEN @True ELSE @False END AS PossessREFault,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.IsSoftwareIs = 1)
THEN @True ELSE @False END AS PossessSoftwareIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.IsRemoteCommsIs = 1)
THEN @True ELSE @False END AS PossessRemoteCommsIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.IsLocalCommsIs = 1)
THEN @True ELSE @False END AS PossessLocalCommsIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.IsTimeSyncIs = 1)
THEN @True ELSE @False END AS PossessTimeSyncIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.IsDataTransferIs = 1)
THEN @True ELSE @False END AS PossessDataTransferIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.IsLocationInfoSuspect = 1)
THEN @True ELSE @False END AS PossessLocationInfoSuspect,
/* From 9459-67043 */
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.BitNo = 0)
THEN @True ELSE @False END AS PossessOysterNotOperationalIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.BitNo = 2)
THEN @True ELSE @False END AS PossessEmvNotOperationalIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.BitNo = 3)
THEN @True ELSE @False END AS PossessAutonomousModeIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.BitNo = 31)
THEN @True ELSE @False END AS PossessInvalidDateTimeIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.BitNo = 58)
THEN @True ELSE @False END AS PossessEmergencyAcceptanceIs,
CASE WHEN EXISTS (SELECT 1 FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN RSSB ON B.BitRef = I.BitRef
WHERE I.RId = R.RId AND B.BitNo = 1)
THEN @True ELSE @False END AS PossessItsoNotOperationalIs,
OldestNotRaisedNotPendingSendableIs.OldestNotRaisedNotPendingSendableIsMins,
DT.DeviceType,
DT.DisplayName [DeviceTypeName]
FROMREs R
LEFT JOINRef_DeviceTypes DT ON DT.DeviceType = R.DeviceType
OUTER APPLY(SELECT TOP 1 *
FROM RECS
WHERE RId = R.RId) CS
OUTER APPLY (SELECT TOP 1 B.*
FROM BCurrentREs BCR
INNER JOIN Bes B ON B.Id = BCR.BId
WHERE BCR.RId = R.RId) B
OUTER APPLY(SELECT TOP 1 *
FROM Gs
WHERE GN = R.GN) G
OUTER APPLY (SELECT TOP 1 *
FROM GDs
WHERE GId = R.GN) GD
OUTER APPLY (SELECT COUNT(*) OutstandingIss
FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
WHERE I.RId = R.RId) Iss
OUTER APPLY (SELECT TOP 1 CASE WHEN H.IsSet = 1 THEN CAST(0 AS bit) ELSE CAST(1 AS bit) END AS IsInShift
FROM RSH H
INNER JOIN RSSRSS ON RSS.BitRef = H.BitRef
WHERE H.RId = R.RId
AND RSS.IsInShift = 1
ORDER BY H.UtsDate DESC, H.UtsTime DESC, H.Seconds DESC, H.MessageSequenceNumber DESC) LatestInShiftMessage
OUTER APPLY (SELECT TOP 1 I.*, H.TimeStatusStored
FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
WHERE I.RId = R.RId AND I.JobNumber IS NOT NULL
ORDER BY H.TimeStatusStored DESC) LatestIsWithJobNumber
OUTER APPLY (SELECT Count(*) [Count]
FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN SMDE X on X.REOutstandingIsId = I.Id
WHERE I.RId = R.RId AND (I.JobNumber IS NULL OR I.JobNumber = '') AND X.Approved = 1) PendingJobNumbers
OUTER APPLY (SELECT TOP 1 DATEDIFF(MI, H.TimeStatusStored, GETDATE()) OldestNotRaisedNotPendingSendableIsMins
FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN SMDE X on X.REOutstandingIsId = I.Id
WHERE I.RId = R.RId AND (I.JobNumber IS NULL OR I.JobNumber = '')
AND X.Approved = 0 AND X.DoNotExport = 0 AND LatestIsWithJobNumber.JobNumber IS NULL
AND PendingJobNumbers.[Count] = 0
ORDER BY DATEDIFF(MI, H.TimeStatusStored, GETDATE()) DESC) OldestNotRaisedNotPendingSendableIs
OUTER APPLY (SELECT Count(*) [Count]
FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN SMDE X on X.REOutstandingIsId = I.Id
WHERE I.RId = R.RId AND X.DoNotExport = 1) IssMarkedDoNotExport
OUTER APPLY (SELECT Count(*) [Count]
FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN SMDE X on X.REOutstandingIsId = I.Id
WHERE I.RId = R.RId AND X.Approved = 0 AND X.DoNotExport = 0) IssNotApproved
OUTER APPLY (SELECT Count(*) [Count]
FROM ROS I
INNER JOIN RSH H ON I.RSHId = H.Id
INNER JOIN SMDE X on X.REOutstandingIsId = I.Id
WHERE I.RId = R.RId AND X.IsExported = 1) IssExported
OUTER APPLY (SELECT TOP 1 iB.[TimeStamp] [iBTimeStamp], iB.TripType, TripType.[Description] [TripTypeDescription]
FROM [iBStatus] iB
INNER JOIN Ref_TripType TripType ON iB.TripType = TripType.Id
WHERE iB.RId = R.RId
ORDER BY iB.TimeStamp DESC) iBDetails
OUTER APPLY (SELECT TOP 1 I.*, H.TimeStatusStored FROM ROS I INNER JOIN RSH H ON I.RSHId = H.Id WHERE I.RId = R.RId ORDER BY H.TimeStatusStored ASC) OldestIs
WHERER.GN = @GN OR (@GN = -1 AND G.GCode IS NULL)
ORDER BY
CASE WHEN OldestIs.TimeStatusStored IS NULL THEN 1 ELSE 0 END,
OldestIs.TimeStatusStored
END