17.09.2013, 11:28 | #21 |
Участник
|
Лучше использовать 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 |
Moderator
|
Мне казалось, что RecordInsertList - асинхронный. То есть - в момент отправки заполненного буфера на сервер, он использует какую-то асинхронную форму вызова Native Client, в результате чего приложение не ждет завершения записи пакета. Если у тебя перебор 100000 записей в одной таблице с их трансформацией и перекладкой у другую, то в случае RecordInsertList у тебя система будет ждать только в самом конце (в момент RIL.insertDatabase()) и недолго (поскольку в буффере, допустим, 1500-2000 записей), а в остальных случаях - заполнение очередного буфера будет идти в параллель с записью старого. В случае же использования RecordSortedList, у тебя в конце будет идти ожидание вставки 100000 записей, что в итоге может привести к проигрышу в общем времени исполнения.
DISCLAIMER: Хотя я, вроде бы, где-то слышал про асинхронный режим, я до конца в этом не уверен; Если будете писать подобные операции - попробуйте и RecordInsertList и RecordSortedList и расскажите заинтересованным лицам... |
|
17.09.2013, 12:00 | #23 |
Administrator
|
Поддержу fed - сам часто пользуюсь RecordInsertList - у меня тоже сложилось ощущение асинхронности. Но конечно - если кто-то происследует техническую составляющую - будет здорово.
__________________
Возможно сделать все. Вопрос времени |
|
17.09.2013, 12:15 | #24 |
Участник
|
Цитата:
Сообщение от russ
Лучше использовать RecordSortedList. RecordInsertList зависит от размера буфера maximum buffer size серверной конфигурации. Перед тем как кол-во записей RecordInsertList превысит максимум, происходит передача записей из RecordInsertList в одном пакете в БД. RecordSortedList не зависит от буфера и передает все записи в одном пакете в момент вызова insertDatabase.
Производительность повышается за счет уменьшения числа обращений АОС к БД: в случае с RecordInsertList будет передано несколько пакетов в зависимости от размера буфера, в случае с RecordSortedList - один пакет. На уровне БД число вызовов insert может оставаться таким же. |
|
|
За это сообщение автора поблагодарили: sukhanchik (6). |
17.09.2013, 13:00 | #25 |
Участник
|
Сомневаюсь что выполнение идет асинхронно.
Если это так то как быть в случае возникновения исключения на вставке ? Код уже ушел дальше, может даже и транзакция закоммитилась и тут как по волшебству из ниоткуда исключение прилетает о конфликте уникального ключа или еще какая ошибка ? Это же был бы архитектурный косяк. |
|
17.09.2013, 13:06 | #26 |
Administrator
|
Цитата:
Сообщение от Logger
Сомневаюсь что выполнение идет асинхронно.
Если это так то как быть в случае возникновения исключения на вставке ? Код уже ушел дальше, может даже и транзакция закоммитилась и тут как по волшебству из ниоткуда исключение прилетает о конфликте уникального ключа или еще какая ошибка ? Это же был бы архитектурный косяк.
__________________
Возможно сделать все. Вопрос времени |
|
17.09.2013, 14:00 | #27 |
Участник
|
Цитата:
Не вижу принципиальной разницы вставки insert() один раз или массово. Даже если бы такое было сделано, должен был бы быть метод позволяющий понять итог этой асинхронной операции. Ну то есть грубо говоря, сессию то гасить (выходить из Аксапты) можно или нет. |
|
17.09.2013, 15:27 | #28 |
Участник
|
Использование RecordInsertList предполагает вызов метода insertDatabase() в самом конце для сброса оставшихся в буфере записей, более того, без вызова этого метода никто не гарантирует, что какие-либо записи вообще будут вставлены. Таким образом, этот метод может служить в т.ч. для ожидания завершения предыдущих асинхронных вставок, если предположить, что указанный класс на самом деле выполняет их асинхронно. Что же касается массовых вставок и параллельной обработки, то интересно обратиться к Inside Dynamics AX 2012:
Цитата:
Если среда времени выполнения Microsoft Dynamics AX обнаруживает, что достаточное для формирования пакета количество записей было добавлено в объект RecordInsertList, то записи упаковываются, передаются на сервер базы данных и вставляются в индивидуальном порядке в требуемую таблицу. Данная проверка выполняется при вызове метода add. Когда из прикладной логики вызывается метод insertDatabase, то с использованием того же механизма вставляются оставшиеся записи.
Использование данных классов вместо сценария с использованием оператора while select дает следующее преимущество: выполняется меньшее количество обращений AOS к базе данных, поскольку одновременно отправляются несколько записей. Однако число операторов INSERT на уровне базы данных остается таким же. |
|
17.09.2013, 17:47 | #29 |
NavAx
|
Если мне не изменяет мой склероз, то в трешке замечал что RecordInsertList вставлял записи до insertDatabase() (видимо при заполнении буфера), возможно и в новых DAX так же.
|
|
18.09.2013, 09:29 | #30 |
NavAx
|
Цитата:
PS. RecordSortedList работает правильно, записи вставляет по insertDatabase(). Последний раз редактировалось raz; 18.09.2013 в 09:32. |
|
18.09.2013, 10:31 | #31 |
Участник
|
В приведенном отрывке из Inside Dynamics AX именно об этом и говорится: RecordInsertList может вставлять данные при вызове метода add(), а вызов insertDatabase() лишь сбрасывает в БД записи, оставшиеся в буфере после очередной "пакетной" вставки Поэтому, кроме прочего, работа с RecordInsertList всегда должна быть в транзакции, иначе если в транзакцию вынести только вызов insertDatabase(), то при откате такой транзакции часть созданных записей все равно останется в БД.
|
|
|
За это сообщение автора поблагодарили: raz (5). |
Теги |
recordinsertlist, recordsortedlist |
|
|