AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.08.2009, 12:29   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Maximum buffer size
AX 4.0 SP2

Не выполняется SELECT.

X++:
static void JobMainresponsibleWhithOpenSales(Args _args)
{
    ContactPerson ContactPerson;
    CustTable CustTable;
    SalesTable SalesTable;
    
    while select Mainresponsible from ContactPerson
    group by Mainresponsible
    exists join CustTable
    where
        CustTable.ContactPersonId == ContactPerson.ContactPersonId
    exists join SalesTable
    where
        SalesTable.CustAccount == CustTable.AccountNum &&
        SalesTable.SalesStatus == SalesStatus::Backorder
    {
        info(ContactPerson.Mainresponsible);
    }
}
Выдаёт ошибку:
Суммарный внутренний размер записей в вашем объединенном операторе SELECT равен 28054 байтам, но система Microsoft Dynamics по умолчанию настроена так, что он не должен превосходить 24576 байтов.


В чём криминал? Откуда превышение? Запрос возвращает только ответственных Mainresponsible. По факту их двое, т.е. две строки в результате (проверял в query analyzer)

P.S.: Собирал Query в AOT таже история
Старый 24.08.2009, 12:35   #2  
AX2009
Гость
 
n/a
В настройке AOS вот тут поставь 28 или больше:
Миниатюры
Нажмите на изображение для увеличения
Название: maxbuffer.PNG
Просмотров: 443
Размер:	22.5 Кб
ID:	5025  
Старый 24.08.2009, 12:42   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Это всё понятно. Хочется понять из-за чего происходит превышение именно в этом конкретном запросе?
Старый 24.08.2009, 12:43   #4  
AX2009
Гость
 
n/a
Слишкий длинный запрос получается - куча таблиц со всеми полями наджойнена
Старый 24.08.2009, 12:48   #5  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Но физически же поля выбираются только из одной. Все остальные присоединены exists join.
Что именно ограничивает этот параметр?
Старый 24.08.2009, 12:58   #6  
AX2009
Гость
 
n/a
Ну х3, видимо при проверке аксапта не смотрит, какой там джойн, а тупо суммирует все поля из таблиц, и, естественно, она не проверяет количество реальных записей в таблице. Если получается, что больше, чем размер буфера - она стремается и вываливается в ошибку.
Старый 24.08.2009, 13:37   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Т.е. правильно ли я понимаю, что на самом деле этот код не подходит под определение тяжёлых запросов, способных положить систему? И на самом деле это просто ложное срабатывание не совсем корректной проверки?

Смущает меня то, что весь стандартный функцианал, ведь как-то умещается в рамки стандартного буфера (встречаются запросики на первый взгляд помощнее этого). Что же такого страшного в джойне этих 3-х таблиц? Возможно размеры самих записей? Сейчас посмотрел: в каждой таблице порядка 100 полей. Выходит роковое стечение обстоятельств?
Старый 24.08.2009, 13:48   #8  
AX2009
Гость
 
n/a
Видимо так.
Я глубоко в этот вопрос не вникал, т.к. симптомы и решение всегда были очевидны.

Но если ты все-таки найдешь истину - напиши потом здесь, думаю всем будет интересно.
Старый 24.08.2009, 14:21   #9  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от S.Kuskov
...
правильно ли я понимаю, что на самом деле этот код не подходит под определение тяжёлых запросов, способных положить систему?
...
А при чем тут вообще тяжелый запрос? Буфер имеет отношение к коммуникации АОСа и клиента Аксапты.

Что-то у меня нигде не воспроизводится. Может вы каких полей в таблицы понадобавляли. А если писать что-то вроде

exists join TableId from CustTable

тоже ругается?
__________________
С уважением,
glibs®
Старый 24.08.2009, 14:47   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от glibs Посмотреть сообщение
Буфер имеет отношение к коммуникации АОСа и клиента Аксапты.
Тогда тем более не понятно, чем результирующая выборка (ведь только она и будет передаваться между AOC и клиентом) неугадила?

Цитата:
Сообщение от glibs Посмотреть сообщение
Что-то у меня нигде не воспроизводится. Может вы каких полей в таблицы понадобавляли.
Нет, все поля стандартные.

У меня значение буфера не указано (по умолчанию)
количество строк в таблицах ~
ContactPerson = 30,
CustTable = 3000
SalesTable = 30000
В результате превышение буфера на 4 кб

Цитата:
Сообщение от glibs Посмотреть сообщение
А если писать что-то вроде exists join TableId from CustTable тоже ругается?
Да, так тоже пробовал. Не помогает
Старый 24.08.2009, 14:57   #11  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Цитата:
Сообщение от S.Kuskov
...
Тогда тем более не понятно, чем результирующая выборка (ведь только она и будет передаваться между AOC и клиентом) неугадила?
...
Тут дело не в выборке, насколько я знаю, а в том, что при обмене данных между АОСом и клиентом производится таким образом, что данные для источников данных для форм передаются не все сразу, а пакетами. Размер такого пакета не будет превышать максимальную величину буфера в настройке. В зависимости от запроса в пакет может попасть много, несколько или одна запись. А если результирующая запись не влазит в буфер, то должна быть ошибка как у вас. Это нужно для того, чтобы увеличить скорость отклика системы на действия пользователя на каналах с невысокой пропускной способностью.

AX2009 вам пишет, что Аксапта ошибается при расчете длины результирующей записи. Похоже на то, хотя я лично не могу быть уверен. Попробуйте поискать про буфер. Кажется, уже было достаточно.
__________________
С уважением,
glibs®
Старый 24.08.2009, 15:15   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ага. Значит это величина одной записи не влезает в буфер. Тогда действительно если посчитать все поля(Параметр Maximum buffer size в настройках AOS) всех трёх таблиц , то получается что

X++:
    info(int2str(SysDictTable::newTableId(tableNum(ContactPerson)).recordSize()));
    info(int2str(SysDictTable::newTableId(tableNum(CustTable)).recordSize()));
    info(int2str(SysDictTable::newTableId(tableNum(SalesTable)).recordSize()));

9396
3813
8669


Такая сумма в полне сравнима с размером буфера.

Ну что ж, ситуация немного прояснилась. Остаётся только ждать и надеятся на её изменение в будущих версиях.
За это сообщение автора поблагодарили: alex55 (1).
Старый 24.08.2009, 17:18   #13  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Добавлю, что этот параметр следует увеличивать крайне аккуратно, так как память указанного размере выделяется на AOS каждый раз при открытии нового соединения с БД (например, при работе с номерными сериями). Пару раз наблюдал, что чрезмерно завышенное значение данного параметра приводило к перерасходу памяти на AOS, а в предельном случае и к ее утечкам.
Теги
ax4.0, buffer, buffer size, exists, join, maximum buffer size

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Параметр Maximum buffer size в настройках AOS Bishop DAX: Администрирование 4 15.03.2016 16:49
Падает АОС - ax32Serv buffer overrun... Jony DAX: Администрирование 19 09.04.2009 16:18
Dynamics AX: QueryRun and Query Objects - Binding operation failed to allocate buffer space Blog bot DAX Blogs 0 03.04.2009 08:05
JOPX: Changing the default maximum size of SharePoint WSP files Blog bot DAX Blogs 0 05.04.2008 19:12
Fred Shen: Cache size for recId allocation Blog bot DAX Blogs 0 28.10.2006 16:40

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:18.