| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > ADOStoredProc - долго, Query - быстро. Почему? |
| Автор: kami 5.8.2012, 19:30 | ||
| Доброго времени суток, уважаемые! Продолжая бодаться с базами данных, наткнулся на одну странность: Имеем хранимую процедуру: на входе - 2 параметра: uniqueidentifier и nvarchar на выходе - результат Select-а (несколько вложенных SELECT, с объединением таблиц через RIGHT JOIN). Проблема: 1. Выполнение хранимой процедуры с помощью TADOStoredProc занимает 1,4-1,7 секунды. При этом входные параметры прописаны в DesignTime. 2. Тот же запрос без изменений, скопированный в TADOQuery (+добавление вначале DECLARE используемых переменных) выполняется 0,17 - 0,22 секунды:
Замеры времени выполнения проводились на одинаковых значениях переменных для SP и Query. Вопросы: 1. Почему так? Ведь хранимая процедура по идее должна выполняться быстрее, она же заранее известна серверу. 2. Как исправить? |
| Автор: kami 5.8.2012, 19:49 |
| UPD: похоже, дело не в ADO. Какая-то странность с действительными планами выполнения запроса и хранимой процедуры на его основе. Похоже, оптимизатор неправильно оптимизирует: обычный запрос имеет хороший план выполнения: 3 Index Seek, один из них Clastered; на выходе каждого по 10 тысяч строк + 3 Left Join и остального по мелочи. Хранимая процедура выполняется гораздо сложнее: те же 3 Index Seek, но на выходе каждого по 1 млн строк + куча сортировок + конкатенации + интервалы слияния и так далее и тому подобное. При этом в таблице всего чуть больше 1 млн строк, так что можно считать что Index Seek не работает. Как быть? |
| Автор: kami 5.8.2012, 20:11 |
| Тестовую БД пока создать не получается - стоит только поудалять "лишние" записи из таблицы, как план выполнения хранимой процедуры сразу приходит в норму и становится идентичен обычному запросу. |
| Автор: kami 5.8.2012, 23:46 |
| Уважаемые модераторы, прошу перенести тему в форум "Базы данных -> MS SQL Server", если есть возможность. Какие-то неправильные пчелы у меня получаются. И они делают совсем неправильный мед. Сократить БД так, чтобы проблема осталась, так и не получилось... А без сокращения ее не выложить - 3,6Гб. Планы выполнения такие: хранимая процедура: |
| Автор: kami 5.8.2012, 23:47 |
| и запрос: |