![]() |
|
|
![]()
|
|
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Доброго времени суток, уважаемые!
Продолжая бодаться с базами данных, наткнулся на одну странность: Имеем хранимую процедуру: на входе - 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:31 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
UPD:
похоже, дело не в ADO. Какая-то странность с действительными планами выполнения запроса и хранимой процедуры на его основе. Похоже, оптимизатор неправильно оптимизирует: обычный запрос имеет хороший план выполнения: 3 Index Seek, один из них Clastered; на выходе каждого по 10 тысяч строк + 3 Left Join и остального по мелочи. Хранимая процедура выполняется гораздо сложнее: те же 3 Index Seek, но на выходе каждого по 1 млн строк + куча сортировок + конкатенации + интервалы слияния и так далее и тому подобное. При этом в таблице всего чуть больше 1 млн строк, так что можно считать что Index Seek не работает. Как быть? Это сообщение отредактировал(а) kami - 5.8.2012, 19:50 |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Тестовую БД пока создать не получается - стоит только поудалять "лишние" записи из таблицы, как план выполнения хранимой процедуры сразу приходит в норму и становится идентичен обычному запросу.
|
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Уважаемые модераторы, прошу перенести тему в форум "Базы данных -> MS SQL Server", если есть возможность.
Какие-то неправильные пчелы у меня получаются. И они делают совсем неправильный мед. Сократить БД так, чтобы проблема осталась, так и не получилось... А без сокращения ее не выложить - 3,6Гб. Планы выполнения такие: хранимая процедура: Присоединённый файл ( Кол-во скачиваний: 3 )
monster.sqlplan 89,90 Kb |
|||
|
||||
| kami |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
||||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |