Оптимизация SQL Server «ORDER BY» - значительное снижение производительности - PullRequest
2 голосов
/ 26 февраля 2012

Использование 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 выглядит следующим образом:

enter image description here

Используя order by, параллелизм включается в порядок по аргументу и выглядит так:

enter image description here

Я думал, может быть, странная обработка параллелизма SQL Server 2000 , но добавление подсказки (maxdop 1) заставило запрос занять 3 минуты вместо этого!

Для меня не имеет смысла помещать сортировку в код приложения, потому что этот запрос кэшируется в течение примерно 6 часов, прежде чем он снова запускается, и мне придется сортировать его в коде приложения много раз в минуту.

Я, должно быть, упускаю что-то очень простое, но после напряженного запроса в течение часа, т. Е. 10 раз, я не вижу, что это такое.

1 Ответ

3 голосов
/ 26 февраля 2012

Что происходит, когда вы удаляете все внешние соединения и, конечно же, выбираете там.1006 * и т.д..это будет действительно быстрее, так как оставленный внешний соединяет их в предложении from

...