Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 секунды:
Код

DECLARE    @ParentGUID uniqueidentifier = 'C2DEB16A-0330-4F05-821F-1D09C93331E6'
DECLARE    @StartStr nvarchar(120) = N'лен%'
  SELECT
    .........................

Замеры времени выполнения проводились на одинаковых значениях переменных для 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
и запрос:

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)