SQL Server – Troubleshooting Incorrect Execution Plans

execution-plansql serversql-server-2008-r2

I'm running a select query. On certain days it's using an incorrect execution plan. Other days it's using the correct execution plan. I have verified with (nolock) option, index stats, blocking, CPU, and memory load; everything is normal. Are there any other ways to check why it is using the wrong execution plan?

The query:

DECLARE @ProjectName as nvarchar
DECLARE @vehicleName as nvarchar
DECLARE @fromDate as datetime2
DECLARE @toDate as datetime2

select 
    d.DDSEventId, d.PrjName, d.VehicleName, d.StartTime, d.EndTime, 
    e.Name, s.Value, es.Name, s.DDSSignalId, e.ProcessId, e.EventId, 
    d.VehiclePos, e.DefaultDescription, es.DefaultDescription, 
    d.CarName, d.ExclusionState
from
    DDSEvents d
inner join 
    Events e on d.DiagnosticConfigurationId = e.DiagnosticConfigurationId 
             and d.EventId = e.EventId 
             and d.ProcessId = e.ProcessId
left join 
    DDSSignals s on d.DDSEventId = s.DDSEventId 
                 and s.StartTime = d.StartTime
left join 
    EnvironmentSignals es on s.EnvironmentSignalId = es.EnvironmentSignalId
where 
    d.PrjName = @projectName and
    d.VehicleName = @vehicleName and
    d.StartTime >= @fromDate and
    d.StartTime < @toDate

Correct plan

Correct execution plan

Wrong plan

Wrong Execution Plan

I have declared the same variables for both execution plans.

Best Answer

An execution plan could change for the same parameters for numerous reasons. Different set options such as ANSI_NULLS etc., statistics updates or data variance between executions.

As you are using SQL Server 2008 R2, you can control the plan using query hints. However, these should be avoided where possible as they are hard-coded and will remain in place when data volumes change in the future. Far better to let the optimiser choose the best plan after you maintain statistics and indexes appropriately.

If you really need to fix a query plan, a plan guide is another option as you don't have to modify any code.

If you ever upgrade to SQL Server 2016, the Query Store also allows you to fix the plan for a query with a single click.