He experimentado situaciones en las que UNION
hizo una consulta mucho más lenta que UNION ALL
con un DISTINCT
después. Entonces, aunque no tengo una explicación para el plan de consulta incorrecto (¿las estadísticas y los índices están bien?), le sugiero que intente lo siguiente:
select distinct * from (
select *
from #finalResults
where intervalEnd is not null
union all
select
two.startTime,
two.endTime,
two.intervalEnd,
one.barcodeID,
one.id,
one.pairId,
one.bookingTypeID,
one.cardID,
one.factor,
two.openIntervals,
two.factorSumConcurrentJobs
from #finalResults as one
inner join #finalResults as two
on two.cardID = one.cardID
and two.startTime > one.startTime
and two.startTime < one.intervalEnd
)