Отключение sp_prepexec у SQL-источника данных

Обсуждение Stimulsoft Reports.NET
Alexes
Сообщения: 10
Зарегистрирован: 15 окт 2009, 14:21

Отключение sp_prepexec у SQL-источника данных

Сообщение Alexes »

Не нашёл возможности отключения выполнения sp_prepexec.
Для детальных бэндов в отчётах Master-Detail сначала вызывается sp_prepexec для соответствующей хранимой процедуры, а потом ещё и sp_execute (так как выставлено "Обновлять на каждой записи" для того, чтобы передать параметр, возвращаемый как поле датасета процедурой, заполняющей Master-бэнд). В результате, время обработки данных фактически удваивается.
Хотелось бы получить опцию отключения sp_prepexec для источников данных, тем более что при использовании хранимых процедур подготовка плана исполнения запроса и не нужна. Также подготовка не нужна, если запрос для детальных данных будет вызван только 1 раз.
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

Отключение sp_prepexec у SQL-источника данных

Сообщение Edward »

Здравствуйте,

Проблема ясна.

Пришлите, пожалуйста mrt файл Вашего отчета на support[at]stimulsoft.com

Для генератора отчетов нет разницы между обычным запросом и хранимой процедурой, видимо придется этот момент пересмотреть. Вы не могли бы посоветовать источник, где подробно описаны эти нюансы c prepare/unprepare для разных версий SQL Server?

Спасибо.
Alexes
Сообщения: 10
Зарегистрирован: 15 окт 2009, 14:21

Отключение sp_prepexec у SQL-источника данных

Сообщение Alexes »

Файл отчёта отправил со ссылкой на данную тему.

Относительно различия в логике подготовки между хранимой процедурой и запросом. В .NET Framework метод SqlCommand.Prepare вызывает sp_prepare (не sp_prepexec) только для sql-запросов, у которых есть параметры. Соответственно, для всех хранимок, а также sql-запросов без параметров этого не происходит.

Источник посоветовать не могу, исходил из опыта работы с MS SQL.
Могу только указать следующее:
1. Подготовка, на мой взгляд, нужна только для однократной генерации плана выполнения запроса и последующего его многократного использования. Наиболее это актуально для относительно сложных запросов, для которых генерация плана может занимать существенное время, сравнимое с временем непосредственного исполнения запроса.
2. Для хранимых процедур подготовка не нужна, поскольку план генерируется при самом первом (после её создания или модификации) вызове этой хранимой процедуры.
3. Для обычных sql-запросов подготовка полезна, если они вызываются более одного раза.
4. Для длинных запросах это может быть полезно по причине уменьшения количества данных (за счёт замены длинного текста запроса на sp_execute), передаваемых по сети.

Относительно способа подготовки в случае, если подготовка используется.
Основная проблема, из-за которой я создал это сообщение, - это то, что удваивается время выполнения запроса.
Как я понимаю, в отличие от sp_prepare, sp_prepexec не только строит план запроса, но и выполняет его (вероятно, причиной использования sp_prepexec было желание избежать лишнего обращения к sql-серверу по сети, выполнив одновременно и подготовку, и сам запрос).
Для источников данных для Detail-бэндов, которые перерисовываются на каждой строке Master, не нужно вызывать sp_prepexec, пока не понадобятся данные Detail для первой строки Master.
Таким образом, я вижу 3 варианта избавления от проблемы (в порядке ухудшения).
1. Вызывать sp_prepexec только при первом обращении к источнику данных (а не сразу при запуске отчёта) в независимости, Master или Detail, при втором и последующих вызовах использовать sp_execute. Недостатков с точки зрения производительности не вижу.
2. Вызывать sp_prepare только непосредственно перед первым обращением к источнику данных (а не сразу при запуске отчёта), при первом и последующих вызовах использовать sp_execute. Недостатки - лишнее (по сравнению с sp_prepexec) обращение к серверу.
3. При запуске отчёта вызывать sp_prepare для всех источников данных, в дальнейшем (первый и последующий вызовы) пользоваться sp_execute для получения данных. Недостатки - лишнее (по сравнению с sp_prepexec) обращение к серверу, потенциальная невостребованность результатов sp_prepare в случае, если Detail-бэнды не будут отображены ни одного раза.

Итого:
1. Сделать опцию, отвечающую за подготовку запроса. При выборе хранимой процедуры в качестве источника данных изначально выставлять эту опцию в False, для обычных запросов изначально выставлять опцию в true.
2. Если вышеупомянутая опция установлена в true, то вызывать sp_prepexec только при первом обращении к источнику данных (а не сразу при запуске отчёта).
delagen
Сообщения: 2
Зарегистрирован: 09 ноя 2010, 10:39
Откуда: Russia

Отключение sp_prepexec у SQL-источника данных

Сообщение delagen »

Тоже хотелось бы узнать как эту ненужную хрень отключить потому что запрос вручную через Query в ManagementStudio выполняется чуть более секунды, а с этим долбаным sp_prepexec не выполняется и за 30 секунд... так то как все таки отключить эту фигню?
А то приходится запросы переписывать, что приводит к лишней трате времени... доли секунды в моих запросах не так критичны, а оптимизация запроса отнимает время... хотя секунду проще подождать...
А тут вылетает таймаут ожидания и фиг тебе называется... вот и думай...
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Отключение sp_prepexec у SQL-источника данных

Сообщение Aleksey »

Здравствуйте,

Мы делали некоторые улучшения в данном направлении. Для хранимой процедуры попробуйте установить свойство источника данных "Stored Procedure" в окне редактирования источника.
Проверьте на последнем пререлизном билде и сообщите нам о результатах.

Спасибо.
delagen
Сообщения: 2
Зарегистрирован: 09 ноя 2010, 10:39
Откуда: Russia

Отключение sp_prepexec у SQL-источника данных

Сообщение delagen »

Хранимые процедуры не интересно... у меня нет желания под каждый отчет создавать хранимую процедуру...
У меня обычный запрос... вот для него это возможно?
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Отключение sp_prepexec у SQL-источника данных

Сообщение Aleksey »

Здравствуйте,

Пожалуйста, пришлите ваш отчет с данными на support@stimulsoft.com для анализа.

Спасибо.
Сергей Воликов
Сообщения: 131
Зарегистрирован: 19 июн 2009, 04:46
Откуда: Киев

Re: Отключение sp_prepexec у SQL-источника данных

Сообщение Сергей Воликов »

Как решился вопрос с отключением sp_prepexec? Есть методы ее отключения?
Aleksey
Сообщения: 2906
Зарегистрирован: 22 апр 2010, 06:57

Re: Отключение sp_prepexec у SQL-источника данных

Сообщение Aleksey »

Здравствуйте,

Мы делали некоторые улучшения в данном направлении.
Пожалуйста, проверьте последний предрелизный билд.

Спасибо.
Сергей Воликов
Сообщения: 131
Зарегистрирован: 19 июн 2009, 04:46
Откуда: Киев

Re: Отключение sp_prepexec у SQL-источника данных

Сообщение Сергей Воликов »

Проверил билд 2013.1.1503.0
Изменений не обнаружил.
Ответить