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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.09.2013, 11:28   #21  
russ is offline
russ
Участник
Сотрудники Microsoft Dynamics
 
51 / 33 (2) +++
Регистрация: 02.04.2002
Адрес: Moscow
Лучше использовать RecordSortedList. RecordInsertList зависит от размера буфера maximum buffer size серверной конфигурации. Перед тем как кол-во записей RecordInsertList превысит максимум, происходит передача записей из RecordInsertList в одном пакете в БД. RecordSortedList не зависит от буфера и передает все записи в одном пакете в момент вызова insertDatabase.
Производительность повышается за счет уменьшения числа обращений АОС к БД: в случае с RecordInsertList будет передано несколько пакетов в зависимости от размера буфера, в случае с RecordSortedList - один пакет. На уровне БД число вызовов insert может оставаться таким же.
Есть также несколько нюансов. Если перекрыт метод insert или таблица содержит memo или container поля, или настроены протоколирование и оповещения, то даже если использованы RecordSortedList и RecordInsertList передача записей БД будет происходит как обычно, по одному. Но есть возможность отключения выполнения insert, протоколирования и оповещений: skipDataMethods, skipDatabaseLog, skipEvents
За это сообщение автора поблагодарили: sukhanchik (6), Logger (3), Pokersky09 (1).
Старый 17.09.2013, 11:45   #22  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,909 / 5730 (197) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Мне казалось, что RecordInsertList - асинхронный. То есть - в момент отправки заполненного буфера на сервер, он использует какую-то асинхронную форму вызова Native Client, в результате чего приложение не ждет завершения записи пакета. Если у тебя перебор 100000 записей в одной таблице с их трансформацией и перекладкой у другую, то в случае RecordInsertList у тебя система будет ждать только в самом конце (в момент RIL.insertDatabase()) и недолго (поскольку в буффере, допустим, 1500-2000 записей), а в остальных случаях - заполнение очередного буфера будет идти в параллель с записью старого. В случае же использования RecordSortedList, у тебя в конце будет идти ожидание вставки 100000 записей, что в итоге может привести к проигрышу в общем времени исполнения.

DISCLAIMER: Хотя я, вроде бы, где-то слышал про асинхронный режим, я до конца в этом не уверен; Если будете писать подобные операции - попробуйте и RecordInsertList и RecordSortedList и расскажите заинтересованным лицам...
Старый 17.09.2013, 12:00   #23  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Поддержу fed - сам часто пользуюсь RecordInsertList - у меня тоже сложилось ощущение асинхронности. Но конечно - если кто-то происследует техническую составляющую - будет здорово.
__________________
Возможно сделать все. Вопрос времени
Старый 17.09.2013, 12:15   #24  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1633 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Цитата:
Сообщение от russ Посмотреть сообщение
Лучше использовать RecordSortedList. RecordInsertList зависит от размера буфера maximum buffer size серверной конфигурации. Перед тем как кол-во записей RecordInsertList превысит максимум, происходит передача записей из RecordInsertList в одном пакете в БД. RecordSortedList не зависит от буфера и передает все записи в одном пакете в момент вызова insertDatabase.
Производительность повышается за счет уменьшения числа обращений АОС к БД: в случае с RecordInsertList будет передано несколько пакетов в зависимости от размера буфера, в случае с RecordSortedList - один пакет. На уровне БД число вызовов insert может оставаться таким же.
по моему все же и то и то использует вместо прямого INSERT INTO команду sp_executestatement с заранее подготовленным курсором который состоит из того же INSERT INTO. выигрыш по скорости происходит из-за того, что серверу БД не надо парсить строку SQL. никакой другой магии тут нет
За это сообщение автора поблагодарили: sukhanchik (6).
Старый 17.09.2013, 13:00   #25  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Сомневаюсь что выполнение идет асинхронно.
Если это так то как быть в случае возникновения исключения на вставке ?
Код уже ушел дальше, может даже и транзакция закоммитилась и тут как по волшебству из ниоткуда исключение прилетает о конфликте уникального ключа или еще какая ошибка ?

Это же был бы архитектурный косяк.
Старый 17.09.2013, 13:06   #26  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
Сомневаюсь что выполнение идет асинхронно.
Если это так то как быть в случае возникновения исключения на вставке ?
Код уже ушел дальше, может даже и транзакция закоммитилась и тут как по волшебству из ниоткуда исключение прилетает о конфликте уникального ключа или еще какая ошибка ?

Это же был бы архитектурный косяк.
Косяком была бы асинхронная вставка на insert(). А сей класс предназначен для массовой вставки данных. А массовость - она на то и массовость, что имеет определенные допущения в угоду скорости вставки
__________________
Возможно сделать все. Вопрос времени
Старый 17.09.2013, 14:00   #27  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,953 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Косяком была бы асинхронная вставка на insert(). А сей класс предназначен для массовой вставки данных. А массовость - она на то и массовость, что имеет определенные допущения в угоду скорости вставки
Не могу с этим согласиться.
Не вижу принципиальной разницы вставки insert() один раз или массово. Даже если бы такое было сделано, должен был бы быть метод позволяющий понять итог этой асинхронной операции. Ну то есть грубо говоря, сессию то гасить (выходить из Аксапты) можно или нет.
Старый 17.09.2013, 15:27   #28  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Использование RecordInsertList предполагает вызов метода insertDatabase() в самом конце для сброса оставшихся в буфере записей, более того, без вызова этого метода никто не гарантирует, что какие-либо записи вообще будут вставлены. Таким образом, этот метод может служить в т.ч. для ожидания завершения предыдущих асинхронных вставок, если предположить, что указанный класс на самом деле выполняет их асинхронно. Что же касается массовых вставок и параллельной обработки, то интересно обратиться к Inside Dynamics AX 2012:
Цитата:
Если среда времени выполнения Microsoft Dynamics AX обнаруживает, что достаточное для формирования пакета количество записей было добавлено в объект RecordInsertList, то записи упаковываются, передаются на сервер базы данных и вставляются в индивидуальном порядке в требуемую таблицу. Данная проверка выполняется при вызове метода add. Когда из прикладной логики вызывается метод insertDatabase, то с использованием того же механизма вставляются оставшиеся записи.
Использование данных классов вместо сценария с использованием оператора while select дает следующее преимущество: выполняется меньшее количество обращений AOS к базе данных, поскольку одновременно отправляются несколько записей. Однако число операторов INSERT на уровне базы данных остается таким же.
Т.е. с одной стороны, явно говорится, что никакого волшебства нет, и записи вставляются по одной, но в СУБД они якобы попадают "пакетом" - возможно, генерится один запрос с кучей insert'ов. С другой стороны, говорится о том, что insertDatabase() использует тот же механизм вставки записей, что и метод add(), а это по идее снижает шансы на то, что add() выполняет вставку асинхронно.
Старый 17.09.2013, 17:47   #29  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Если мне не изменяет мой склероз, то в трешке замечал что RecordInsertList вставлял записи до insertDatabase() (видимо при заполнении буфера), возможно и в новых DAX так же.
Старый 18.09.2013, 09:29   #30  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от raz Посмотреть сообщение
Если мне не изменяет мой склероз, то в трешке замечал что RecordInsertList вставлял записи до insertDatabase() (видимо при заполнении буфера), возможно и в новых DAX так же.
Проверил в DAX 2009, все тоже самое. Прикладываю скриншот и проект, с помощью которого можно проверить.

PS. RecordSortedList работает правильно, записи вставляет по insertDatabase().
Миниатюры
Нажмите на изображение для увеличения
Название: testJob.jpg
Просмотров: 512
Размер:	205.1 Кб
ID:	8394  
Вложения
Тип файла: xpo PrivateProject_testProject.xpo (16.0 Кб, 448 просмотров)

Последний раз редактировалось raz; 18.09.2013 в 09:32.
Старый 18.09.2013, 10:31   #31  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
В приведенном отрывке из Inside Dynamics AX именно об этом и говорится: RecordInsertList может вставлять данные при вызове метода add(), а вызов insertDatabase() лишь сбрасывает в БД записи, оставшиеся в буфере после очередной "пакетной" вставки Поэтому, кроме прочего, работа с RecordInsertList всегда должна быть в транзакции, иначе если в транзакцию вынести только вызов insertDatabase(), то при откате такой транзакции часть созданных записей все равно останется в БД.
За это сообщение автора поблагодарили: raz (5).
Теги
recordinsertlist, recordsortedlist

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить имена полей, которые есть у таблицы? 3oppo DAX: Программирование 2 22.12.2006 14:30
ALEG: Software-as-a-service есть ли у них будущее в России Blog bot DAX Blogs 0 28.10.2006 16:10
Fullscope - Процессное производство для Axapta есть. mazzy DAX: Функционал 33 28.08.2006 13:22
Есть ли возможность вызывать код с вышележащих слоев ? FishLog DAX: Программирование 5 07.09.2004 17:24
Что есть для Inernet-а ? bucken DAX: Функционал 6 29.10.2003 12:31

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

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

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