AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen Alle Foren als gelesen markieren

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

DISCLAIMER: Хотя я, вроде бы, где-то слышал про асинхронный режим, я до конца в этом не уверен; Если будете писать подобные операции - попробуйте и RecordInsertList и RecordSortedList и расскажите заинтересованным лицам...
Alt 17.09.2013, 12:00   #23  
sukhanchik ist offline
sukhanchik
Administrator
Benutzerbild von sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.343 / 3563 (125) ++++++++++
Registriert seit: 13.06.2004
Ort: Москва
Поддержу fed - сам часто пользуюсь RecordInsertList - у меня тоже сложилось ощущение асинхронности. Но конечно - если кто-то происследует техническую составляющую - будет здорово.
__________________
Возможно сделать все. Вопрос времени
Alt 17.09.2013, 12:15   #24  
trud ist offline
trud
Участник
Лучший по профессии 2017
 
1.039 / 1635 (57) ++++++++
Registriert seit: 07.06.2003
Blog-Einträge: 1
Zitat:
Zitat von russ Beitrag anzeigen
Лучше использовать RecordSortedList. RecordInsertList зависит от размера буфера maximum buffer size серверной конфигурации. Перед тем как кол-во записей RecordInsertList превысит максимум, происходит передача записей из RecordInsertList в одном пакете в БД. RecordSortedList не зависит от буфера и передает все записи в одном пакете в момент вызова insertDatabase.
Производительность повышается за счет уменьшения числа обращений АОС к БД: в случае с RecordInsertList будет передано несколько пакетов в зависимости от размера буфера, в случае с RecordSortedList - один пакет. На уровне БД число вызовов insert может оставаться таким же.
по моему все же и то и то использует вместо прямого INSERT INTO команду sp_executestatement с заранее подготовленным курсором который состоит из того же INSERT INTO. выигрыш по скорости происходит из-за того, что серверу БД не надо парсить строку SQL. никакой другой магии тут нет
This post has been rated by: sukhanchik (6).
Alt 17.09.2013, 13:00   #25  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.004 / 3299 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Сомневаюсь что выполнение идет асинхронно.
Если это так то как быть в случае возникновения исключения на вставке ?
Код уже ушел дальше, может даже и транзакция закоммитилась и тут как по волшебству из ниоткуда исключение прилетает о конфликте уникального ключа или еще какая ошибка ?

Это же был бы архитектурный косяк.
Alt 17.09.2013, 13:06   #26  
sukhanchik ist offline
sukhanchik
Administrator
Benutzerbild von sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.343 / 3563 (125) ++++++++++
Registriert seit: 13.06.2004
Ort: Москва
Zitat:
Zitat von Logger Beitrag anzeigen
Сомневаюсь что выполнение идет асинхронно.
Если это так то как быть в случае возникновения исключения на вставке ?
Код уже ушел дальше, может даже и транзакция закоммитилась и тут как по волшебству из ниоткуда исключение прилетает о конфликте уникального ключа или еще какая ошибка ?

Это же был бы архитектурный косяк.
Косяком была бы асинхронная вставка на insert(). А сей класс предназначен для массовой вставки данных. А массовость - она на то и массовость, что имеет определенные допущения в угоду скорости вставки
__________________
Возможно сделать все. Вопрос времени
Alt 17.09.2013, 14:00   #27  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.004 / 3299 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Zitat:
Zitat von sukhanchik Beitrag anzeigen
Косяком была бы асинхронная вставка на insert(). А сей класс предназначен для массовой вставки данных. А массовость - она на то и массовость, что имеет определенные допущения в угоду скорости вставки
Не могу с этим согласиться.
Не вижу принципиальной разницы вставки insert() один раз или массово. Даже если бы такое было сделано, должен был бы быть метод позволяющий понять итог этой асинхронной операции. Ну то есть грубо говоря, сессию то гасить (выходить из Аксапты) можно или нет.
Alt 17.09.2013, 15:27   #28  
gl00mie ist offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.684 / 5813 (201) ++++++++++
Registriert seit: 28.11.2005
Ort: Москва
Blog-Einträge: 3
Использование RecordInsertList предполагает вызов метода insertDatabase() в самом конце для сброса оставшихся в буфере записей, более того, без вызова этого метода никто не гарантирует, что какие-либо записи вообще будут вставлены. Таким образом, этот метод может служить в т.ч. для ожидания завершения предыдущих асинхронных вставок, если предположить, что указанный класс на самом деле выполняет их асинхронно. Что же касается массовых вставок и параллельной обработки, то интересно обратиться к Inside Dynamics AX 2012:
Zitat:
Если среда времени выполнения Microsoft Dynamics AX обнаруживает, что достаточное для формирования пакета количество записей было добавлено в объект RecordInsertList, то записи упаковываются, передаются на сервер базы данных и вставляются в индивидуальном порядке в требуемую таблицу. Данная проверка выполняется при вызове метода add. Когда из прикладной логики вызывается метод insertDatabase, то с использованием того же механизма вставляются оставшиеся записи.
Использование данных классов вместо сценария с использованием оператора while select дает следующее преимущество: выполняется меньшее количество обращений AOS к базе данных, поскольку одновременно отправляются несколько записей. Однако число операторов INSERT на уровне базы данных остается таким же.
Т.е. с одной стороны, явно говорится, что никакого волшебства нет, и записи вставляются по одной, но в СУБД они якобы попадают "пакетом" - возможно, генерится один запрос с кучей insert'ов. С другой стороны, говорится о том, что insertDatabase() использует тот же механизм вставки записей, что и метод add(), а это по идее снижает шансы на то, что add() выполняет вставку асинхронно.
Alt 17.09.2013, 17:47   #29  
raz ist offline
raz
NavAx
Benutzerbild von raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1.500 / 1098 (40) ++++++++
Registriert seit: 22.07.2003
Ort: МО
Если мне не изменяет мой склероз, то в трешке замечал что RecordInsertList вставлял записи до insertDatabase() (видимо при заполнении буфера), возможно и в новых DAX так же.
Alt 18.09.2013, 09:29   #30  
raz ist offline
raz
NavAx
Benutzerbild von raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1.500 / 1098 (40) ++++++++
Registriert seit: 22.07.2003
Ort: МО
Zitat:
Zitat von raz Beitrag anzeigen
Если мне не изменяет мой склероз, то в трешке замечал что RecordInsertList вставлял записи до insertDatabase() (видимо при заполнении буфера), возможно и в новых DAX так же.
Проверил в DAX 2009, все тоже самое. Прикладываю скриншот и проект, с помощью которого можно проверить.

PS. RecordSortedList работает правильно, записи вставляет по insertDatabase().
Miniaturansicht angehängter Grafiken
Klicken Sie auf die Grafik für eine größere Ansicht

Name:	testJob.jpg
Hits:	591
Größe:	205,1 KB
ID:	8394  
Angehängte Dateien
Dateityp: xpo PrivateProject_testProject.xpo (16,0 KB, 491x aufgerufen)

Geändert von raz (18.09.2013 um 09:32 Uhr)
Alt 18.09.2013, 10:31   #31  
gl00mie ist offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.684 / 5813 (201) ++++++++++
Registriert seit: 28.11.2005
Ort: Москва
Blog-Einträge: 3
В приведенном отрывке из Inside Dynamics AX именно об этом и говорится: RecordInsertList может вставлять данные при вызове метода add(), а вызов insertDatabase() лишь сбрасывает в БД записи, оставшиеся в буфере после очередной "пакетной" вставки Поэтому, кроме прочего, работа с RecordInsertList всегда должна быть в транзакции, иначе если в транзакцию вынести только вызов insertDatabase(), то при откате такой транзакции часть созданных записей все равно останется в БД.
This post has been rated by: raz (5).
Stichworte
recordinsertlist, recordsortedlist

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Как получить имена полей, которые есть у таблицы? 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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 11:25 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.