Страница 1 из 3
Отключение sp_prepexec у SQL-источника данных
Добавлено: 15 окт 2009, 14:33
Alexes
Не нашёл возможности отключения выполнения sp_prepexec.
Для детальных бэндов в отчётах Master-Detail сначала вызывается sp_prepexec для соответствующей хранимой процедуры, а потом ещё и sp_execute (так как выставлено "Обновлять на каждой записи" для того, чтобы передать параметр, возвращаемый как поле датасета процедурой, заполняющей Master-бэнд). В результате, время обработки данных фактически удваивается.
Хотелось бы получить опцию отключения sp_prepexec для источников данных, тем более что при использовании хранимых процедур подготовка плана исполнения запроса и не нужна. Также подготовка не нужна, если запрос для детальных данных будет вызван только 1 раз.
Отключение sp_prepexec у SQL-источника данных
Добавлено: 16 окт 2009, 22:39
Edward
Здравствуйте,
Проблема ясна.
Пришлите, пожалуйста mrt файл Вашего отчета на support[at]stimulsoft.com
Для генератора отчетов нет разницы между обычным запросом и хранимой процедурой, видимо придется этот момент пересмотреть. Вы не могли бы посоветовать источник, где подробно описаны эти нюансы c prepare/unprepare для разных версий SQL Server?
Спасибо.
Отключение sp_prepexec у SQL-источника данных
Добавлено: 19 окт 2009, 12:23
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 только при первом обращении к источнику данных (а не сразу при запуске отчёта).
Отключение sp_prepexec у SQL-источника данных
Добавлено: 09 ноя 2010, 10:42
delagen
Тоже хотелось бы узнать как эту ненужную хрень отключить потому что запрос вручную через Query в ManagementStudio выполняется чуть более секунды, а с этим долбаным sp_prepexec не выполняется и за 30 секунд... так то как все таки отключить эту фигню?
А то приходится запросы переписывать, что приводит к лишней трате времени... доли секунды в моих запросах не так критичны, а оптимизация запроса отнимает время... хотя секунду проще подождать...
А тут вылетает таймаут ожидания и фиг тебе называется... вот и думай...
Отключение sp_prepexec у SQL-источника данных
Добавлено: 10 ноя 2010, 03:38
Aleksey
Здравствуйте,
Мы делали некоторые улучшения в данном направлении. Для хранимой процедуры попробуйте установить свойство источника данных "Stored Procedure" в окне редактирования источника.
Проверьте на последнем пререлизном билде и сообщите нам о результатах.
Спасибо.
Отключение sp_prepexec у SQL-источника данных
Добавлено: 10 ноя 2010, 03:52
delagen
Хранимые процедуры не интересно... у меня нет желания под каждый отчет создавать хранимую процедуру...
У меня обычный запрос... вот для него это возможно?
Отключение sp_prepexec у SQL-источника данных
Добавлено: 10 ноя 2010, 05:55
Aleksey
Здравствуйте,
Пожалуйста, пришлите ваш отчет с данными на
support@stimulsoft.com для анализа.
Спасибо.
Re: Отключение sp_prepexec у SQL-источника данных
Добавлено: 09 янв 2013, 15:57
Сергей Воликов
Как решился вопрос с отключением sp_prepexec? Есть методы ее отключения?
Re: Отключение sp_prepexec у SQL-источника данных
Добавлено: 10 янв 2013, 10:48
Aleksey
Здравствуйте,
Мы делали некоторые улучшения в данном направлении.
Пожалуйста, проверьте последний предрелизный билд.
Спасибо.
Re: Отключение sp_prepexec у SQL-источника данных
Добавлено: 11 янв 2013, 16:58
Сергей Воликов
Проверил билд 2013.1.1503.0
Изменений не обнаружил.