Во-первых, есть ли у вас индекс по столбцу orderno
в таблице items
? Я полагаю, вы не возвращаете много строк ... поэтому отсутствующий индекс может быть убийцей.
Тогда я был бы склонен изменить запрос, чтобы избежать необходимости в group by
следующим образом (при условии, что я, конечно, понимаю ваше намерение):
select
cms.custnum
, cms.odr_date
, cms.orderno
, internetid
, ltrim(rtrim(cust.firstname))+' '+ltrim(rtrim(cust.lastname)) as recipient
, ord_total
, ordertype
, order_st2
, websitestatdesc
, holdcode
from (
select *, (
select count(distinct(ship_to))
from items
where cms.orderno = items.orderno and ship_to <> 0
) distinct_ship_to_count
, (
select top 1 ship_to
from items
where cms.orderno = items.orderno and ship_to <> 0
) distinct_ship_to
from cms
) cms
join statdesc on cms.order_st2 = statdesc.statcode
--join items on cms.orderno = items.orderno
join cust on
case
when cms.distinct_ship_to_count = 1 then cms.distinct_ship_to
when cms.shipnum <> 0 then cms.shipnum
else cms.custnum
end = cust.custnum
where cms.custnum = 3300
and statdesc.stattype = 'O'
--group by cms.orderno, cms.custnum, cms.odr_date, internetid, firstname, lastname, ord_total, ordertype, order_st2, websitestatdesc, holdcode
order by cms.orderno desc