Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ADOStoredProc - долго, Query - быстро. Почему? MS SQL Express 2008, D2010 
:(
    Опции темы
kami
Дата 5.8.2012, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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 секунды:
Код

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

Замеры времени выполнения проводились на одинаковых значениях переменных для SP и Query.

Вопросы:
1. Почему так? Ведь хранимая процедура по идее должна выполняться быстрее, она же заранее известна серверу.
2. Как исправить?

Это сообщение отредактировал(а) kami - 5.8.2012, 19:31
PM MAIL WWW   Вверх
kami
Дата 5.8.2012, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM MAIL WWW   Вверх
kami
Дата 5.8.2012, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Тестовую БД пока создать не получается - стоит только поудалять "лишние" записи из таблицы, как план выполнения хранимой процедуры сразу приходит в норму и становится идентичен обычному запросу.
PM MAIL WWW   Вверх
kami
Дата 5.8.2012, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Уважаемые модераторы, прошу перенести тему в форум "Базы данных -> MS SQL Server", если есть возможность.

Какие-то неправильные пчелы у меня получаются. И они делают совсем неправильный мед.
Сократить БД так, чтобы проблема осталась, так и не получилось... А без сокращения ее не выложить - 3,6Гб.

Планы выполнения такие:
хранимая процедура:

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  monster.sqlplan 89,90 Kb
PM MAIL WWW   Вверх
kami
Дата 5.8.2012, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



и запрос:

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  norm.sqlplan 41,23 Kb
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0420 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.