I don't know how I missed this question
I'd use a CTE:
;WITH maxrec as
(
select max (recno) AS maxrec from tbl_pms_DeliveryInfo di
INNER JOIN tbl_pms_JobOrders jo ON di.jobNo = jo.jobNo
where jo.WarehouseID=@WarehouseID
)
Select j.Route,
'' as Sequence,
'' as Territory,
'' as Region,
t.TruckNo as [Truck No],
dr.DriverName as [Driver Name],
j.Ordernumber as [Invoice],
j.CustomerName as [Customer Name],
CONVERT(DATE,Cast(j.Planneddate as varchar(8)),112)as [Dispatch Date],
d.DeliveryDate as [Delivery Date],
ps.[POD DateTime] as [POD Return Date],
Cast(datediff(day,CONVERT(DATE,Cast(j.Planneddate as varchar(8)),112),d.DeliveryDate)as varchar(8)) as [On Time Delivery KPI],
Cast(datediff(day,d.DeliveryDate,ps.[POD DateTime])as varchar(8)) as [On Time POD KPI]
from tbl_pms_JobOrders j
Inner Join tbl_pms_JobOrders_Trucks_Info jt on jt.JobID=j.JobID
Inner Join tbl_pms_Trucks t on t.TruckID=jt.TruckID
Inner Join tbl_pms_DeliveryInfo d on d.JobID=j.JobID
Inner Join tbl_pms_Trucks_DriversMapping td on td.TruckID = jt.TruckID
Inner Join tbl_pms_DriverInfo dr on dr.DriverID = td.DriverID
Inner Join dbo.tbl_pms_POD_Submit ps on ps.JobID = j.JobID
INNER JOIN maxrec mr ON mr.maxrec = d.recno
Where j.WarehouseID=@WarehouseID and
j.Planneddate between @FromDate and @ToDate
and jt.TruckID != 312;
This gets rid of two levels of subquery, which is what was slow.
I'd also make sure PlannedDate has an index, and WarehouseID has one, too.