Показать сообщение отдельно
Старый 18.12.2017, 14:59   #1  
PMS is offline
PMS
Участник
 
54 / 29 (1) +++
Регистрация: 25.02.2005
Адрес: Санкт-Петербург
Параметр Scroll Option при создании курсора sp_cursorprepexec
Добрый день!

Ax 4.0, база данных SQL Server 2008 R2.

При создании курсора в БД SQL аксапта пользуется процедурой sp_cursorprepexec, создавая запрос примерно такого вида:

X++:
declare @p1 int
set @p1=-1
declare @p2 int
set @p2=0
declare @p5 int
set @p5=4098
declare @p6 int
set @p6=8193
declare @p7 int
set @p7=0
exec sp_cursorprepexec @p1 output,
                       @p2 output,
                       N'@P1 nvarchar(8)',
                       N'SELECT ... FROM LEDGERTRANS A,LEDGERJOURNALTRANS B WHERE ((A.DATAAREAID=@P1) ...',
                       @p5 output,
                       @p6 output,
                       @p7 output,
                       N'dat'
select @p1, @p2, @p5, @p6, @p7
в параметре @p5 в процедуру передаются параметры прокрутки для создаваемого курсора (scroll options).

Вопрос в том, возможно ли как-то влиять на этот параметр настройками или аксапта сама решает какие значения туда подставлять?

Проблема возникла в небольшом отчете. В боевом приложении отчет стал страшно тупить. Однако в тестовом приложении отрабатывает моментально. Код обоих отчетов в приложениях одинаков. База и приложение синхронизировались относительно недавно (где-то месяц назад).

Расследование с помощью профайлера показало, что на боевом приложении в этот параметр передается значение:
@p5 = 4098, т.е. сумму флагов DYNAMIC | PARAMETERIZED_STMT.

В тестовом приложении в этот параметр передается значение:
@p5 = 20496, т.е. сумму флагов FAST_FORWARD | PARAMETERIZED_STMT | AUTO_CLOSE.

Разный набор флагов кардинально меняет план исполнения запроса, что приводит к замедлению исполнения.