Прошу помощи с оптимизацией запроса. Есть ХП, она строит временную таблицу и заполняет ее в несколько проходов, потом из нее делается с десяток выборок. Все работало сносно, но в какой-то момент стали наблюдаться тормоза при определенных параметрах ХП, чуть ли не по две минуты думает. Обычно хватало пары секунд.
Вот план. От ХП откручено все, что идет после проблемного запроса.
Здравствуйте, FilosOFF, Вы писали:
FOF>Здравствуйте, SergASh, Вы писали:
SAS>>Привет всем!
FOF>О сколько раз твердили миру! FOF>Текст ХП, структуру используемых таблиц с индексами, план в текстовом виде....
FOF>Я конечно знаю что там надо сделать.... Запрос подправить.
А может и не править. Возможно кеширование планов так работает. Если код процедуры сильно императивный, то возможно именно в этом причина.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, FilosOFF, Вы писали:
FOF>>Здравствуйте, SergASh, Вы писали:
SAS>>>Привет всем!
FOF>>О сколько раз твердили миру! FOF>>Текст ХП, структуру используемых таблиц с индексами, план в текстовом виде....
FOF>>Я конечно знаю что там надо сделать.... Запрос подправить.
G>А может и не править. Возможно кеширование планов так работает. Если код процедуры сильно императивный, то возможно именно в этом причина.
Не, я только что кофе разлил, вот по пятну вижу, что проблема в третей строчке (+-5)...................
Здравствуйте, DenisCh, Вы писали:
DC>Здравствуйте, FilosOFF, Вы писали:
FOF>>Не, я только что кофе разлил, вот по пятну вижу, что проблема в третей строчке (+-5)...................
DC>Коллега, Вы ошиблись... Ошибка в 7 и 10й строках...
Ваше право коллега, только что посмотрел, это был дешевый нескафе. А он дает большую погрешность, о чем, к стыду своему, я забыл.
Здравствуйте, SergASh, Вы писали:
SAS>Разве план в текстовом виде не урезанный по сравнению с XML?
План в текстовом виде ЧИТАЕМ, в отличии от того что Вы выложили.
SAS>В плане текст запроса и так есть, разве что только не отформатированный. ъ
Совсем не удобно читать и выдирать от туда запросы.
SAS>Не хочется показывать гуглу все потроха, а то мы вроде как NDA подписывали . Если я выложу бэкап этой базы, вам будет достаточно?
Да и не надо ниче показывать, достаточно один запрос, который тормозит и пару слов о том, какие индексы существуют.
Здравствуйте, FilosOFF, Вы писали:
FOF>Здравствуйте, SergASh, Вы писали:
SAS>>Разве план в текстовом виде не урезанный по сравнению с XML? FOF>План в текстовом виде ЧИТАЕМ, в отличии от того что Вы выложили.
Хм, мне казалось нынче модно откывать план в Management Studio и смотреть на диаграмму.
FOF>Да и не надо ниче показывать, достаточно один запрос, который тормозит и пару слов о том, какие индексы существуют.
Вот скрипт, который поднимает базу. Вот запрос, из которого выдрано все кроме необходимого. Тормозит последний insert. Удалось выяснить, что виноваты CROSS APPLY'и, но как избавиться от них непонятно.
Здравствуйте, FilosOFF, Вы писали:
FOF>Здравствуйте, SergASh, Вы писали:
SAS>>Разве план в текстовом виде не урезанный по сравнению с XML? FOF>План в текстовом виде ЧИТАЕМ, в отличии от того что Вы выложили.
Здравствуйте, SergASh, Вы писали:
SAS>Здравствуйте, FilosOFF, Вы писали:
FOF>>Здравствуйте, SergASh, Вы писали:
SAS>>>Разве план в текстовом виде не урезанный по сравнению с XML? FOF>>План в текстовом виде ЧИТАЕМ, в отличии от того что Вы выложили. SAS>Хм, мне казалось нынче модно откывать план в Management Studio и смотреть на диаграмму.
Нет, это не модно, это ублюжество с огромным количеством прокруток в котором хрен что увидишь.
FOF>>Да и не надо ниче показывать, достаточно один запрос, который тормозит и пару слов о том, какие индексы существуют. SAS>Вот скрипт, который поднимает базу. Вот запрос, из которого выдрано все кроме необходимого. Тормозит последний insert. Удалось выяснить, что виноваты CROSS APPLY'и, но как избавиться от них непонятно.
Чето файло не открываецо.
Здравствуйте, SergASh, Вы писали:
SAS>Здравствуйте, FilosOFF, Вы писали:
FOF>>Сделайте просто: FOF>>
FOF>>SET SHOWPLAN_TEXT ON
FOF>>EXEC [Ваша проца]
FOF>>
FOF>>И киньте сюда текст запроса и то что выдаст план.
SAS>Сделал
Отлично!
Ваш план довольно не плох. :D :D
Теперь надо спускаться на уровень данных и обратить пристальное внимание на следующие штуки:
1. Индексы, есть некоторое кол-во сканирования индекса. Возможно имеет смысл добавить нужные индексы, либо принудительно указать использование нужных.
2. Смотреть на типы соединений (лупы, мерджи и т.п.) зависит от содержания таблиц.
3. Конструкции вроде
JOIN Tab1 t1
JOIN Tab2 t2 ON t2.tid = t1.id ON t1.a = 5
Действительно ли нужен именно такой порядок соединения, а если да, то действительно ли оптимизатор соединяет в нужном порядке.
попытаться поставить
OPTION(FORCE ORDER)
4. Конструкции вроде
WHERE a.id IN (Select id from b)
заменить на джойны.
5. Конструкции
JOIN Tab1 t ON t.id = a.aid
JOIN Tab2 t2 ON t2.id = b.bid AND t.v = 5