Использование SQL Server 2000. У меня есть таблица, которая получает дамп из устаревшей системы один раз в день, я пытаюсь написать запрос, который обработает эту таблицу с несколькими объединениями ссылочной таблицы и предложением order by.
Это SQL у меня есть:
select d.acct_no,
d.associate_id,
d.first_name,
d.last_name,
d.acct_bal,
plr.long_name p_lvl,
tlr.long_name t_lvl,
d.category,
d.status,
tm.site_name,
d.addr1 + ' ' + isnull(d.addr2,'') address,
d.city,
d.state,
d.country,
d.post_code,
CASE WHEN d.home_phone_ok = 1 THEN d.home_phone END home_phone,
CASE WHEN d.work_phone_ok = 1 THEN d.work_phone END work_phone,
CASE WHEN d.alt_phone_ok = 1 THEN d.alt_phone END alt_phone,
CASE WHEN d.email_ok = 1 THEN d.email END email,
d.last_credit last_paid,
d.service,
d.quantity,
d.amount,
ar.area_desc area
from item_dump d
left outer join territory_map tm on tm.short_postcode = left(post_code,3) and country in ('United States','Canada')
left outer join p_level_ref plr on plr.p_level_id = d.p_lvl_id
left outer join t_level_ref tlr on tlr.t_level_id = d.t_lvl_id
left outer join (select distinct master_item_id, site_item_id from invoice_detail) as map on map.item_id = d.item_no
left outer join item_ref i on i.item_id = map.master_item_id
left outer join area_ref ar on ar.area_id = i.area_id
where (d.cat_id > 80 or d.cat_id < 70)
and d.standing < 4
and d.status not like 'DECEASED'
and d.paid = 1
order by d.associate_id
Большинство этих столбцов прямо из таблицы системного дампа item_dump
. Все объединения являются только ссылочными таблицами с несколькими строками. Сама устаревшая таблица содержит около 17000 записей, но с операторами where запрос достигает 3000.
У меня есть некластеризованный индекс в столбце associate_id
.
Когда я запускаю этот запрос без предложения order by associate_id
, это занимает около 2 секунд. С предложением order by
это занимает целую минуту!
Я попытался добавить столбцы предложения where
в индекс вместе с associate_id
, но это никак не изменило производительность.
Конец плана выполнения без order by
выглядит следующим образом:
Используя order by
, параллелизм включается в порядок по аргументу и выглядит так:
Я думал, может быть, странная обработка параллелизма SQL Server 2000 , но добавление подсказки (maxdop 1)
заставило запрос занять 3 минуты вместо этого!
Для меня не имеет смысла помещать сортировку в код приложения, потому что этот запрос кэшируется в течение примерно 6 часов, прежде чем он снова запускается, и мне придется сортировать его в коде приложения много раз в минуту.
Я, должно быть, упускаю что-то очень простое, но после напряженного запроса в течение часа, т. Е. 10 раз, я не вижу, что это такое.