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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.01.2014, 16:12   #1  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 646 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Может быть туда можно курсор временной таблицы передать? Допустим не InMemory, а TempDB, было бы вполне логично.
Да, судя по всему, вы правы. Пример можно посмотреть в классе LedgerBalanceSheetDimPrint, метод generateKnownCombinations().
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.01.2014, 22:46   #2  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
681 / 517 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
Да, судя по всему, вы правы. Пример можно посмотреть в классе LedgerBalanceSheetDimPrint, метод generateKnownCombinations().
Да, Макс, ты прав, речь идёт о методе new -- пропустил ключевое слово, когда писал!

Теперь о самом параметре в контексте самого класса RecordInsertList. Вот данный кусок, где, видимо, данные будут вставлены во временный буфер.

X++:
        recordInsertList = new RecordInsertList(tableNum(LedgerBalanceSheetUsedDimensionsTmp), false, false, false, false, false, _usedTmp);

        queryRun = new QueryRun(query);

        while (queryRun.next())
        {
            _usedTmp.clear();

            for (i = 1; i <= usedDimensions.lastIndex(); i++)
            {
                dimensionAttributeLevelValueAllView = queryRun.get(tableNum(DimensionAttributeLevelValueAllView), i);
                _usedTmp.EntityValue[i] = dimensionAttributeLevelValueAllView.DisplayValue;
                _usedTmp.EntityInstance[i] = dimensionAttributeLevelValueAllView.EntityInstance;
            }

            recordInsertList.add(_usedTmp);
        }

        recordInsertList.insertDatabase();
Теперь вопрос следующий: в чём смысл (профит) использования этого класса с временной таблицей, если в документации сказано:

Код:
The array insert operation automatically falls back to classic record-by-record inserts when non-SQL based tables are used (for example, temporary tables)...
Теперь сравним, как работают эти братские классы при передаче им в качестве параметра временной таблицы (InMemory).

RecordInsertList
X++:
private void runRIL() //RIL, temporary buffer contains two records
{
    uapTestTable        t;
    uapTestTable        t2;
    RecordInsertList    ril;

    t.setTmp();
    ril = new RecordInsertList(t.TableId, true, true, true, false, false, t);

    ttsBegin;

    t.code = "001";
    t.value = 1;
    ril.add(t);
    
    t.code = "002";
    t.value = 10;
    ril.add(t);

    ril.insertDatabase();
    ttsCommit;
    
    info('temporary uapTestTable');
    while select t
    {
        info(strFmt("%1 %2", t.code, t.value));
    }
    info('normal uapTestTable');
    while select t2
    {
        info(strFmt("%1 %2", t2.code, t2.value));
    }
/*    
Info	Message (01:40:51 pm)	temporary uapTestTable
Info	Message (01:40:51 pm)	001 1
Info	Message (01:40:51 pm)	002 10
Info	Message (01:40:51 pm)	normal uapTestTable
*/
}
RecordSortedList
X++:
private void runRSL()
{
    uapTestTable        t;
    uapTestTable        t2;
    RecordSortedList    rsl;

    t.setTmp();
    rsl = new RecordSortedList(t.TableId, t);
    rsl.sortOrder(fieldNum(uapTestTable, Code));

    ttsBegin;

    t.code = "001";
    t.value = 1;
    rsl.ins(t);

    t.code = "002";
    t.value = 10;
    rsl.ins(t);
    
    rsl.insertDatabase();
    ttsCommit;
    
    info('RecordSortedList temporary buffer contains no records, but two inserted in uapTestTable table');
    info('temporary uapTestTable');
    while select t
    {
        info(strFmt("%1 %2", t.code, t.value));
    }
    info('normal uapTestTable');
    while select t2
    {
        info(strFmt("%1 %2", t2.code, t2.value));
    }
    
/*
Info	Message (01:42:07 pm)	RecordSortedList temporary buffer contains no records, but two inserted in uapTestTable table
Info	Message (01:42:07 pm)	temporary uapTestTable
Info	Message (01:42:07 pm)	normal uapTestTable
Info	Message (01:42:07 pm)	001 1
Info	Message (01:42:07 pm)	002 10
*/
   
}
Выходит, что внутри у них что-то по-разному устроено, и под temporary table подразумевается именно InMemory, но не TempDB.

Какие будут соображения?
__________________
Felix nihil admirari
Старый 29.01.2014, 23:28   #3  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 646 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Сообщение от wojzeh Посмотреть сообщение
Выходит... под temporary table подразумевается именно InMemory, но не TempDB.
wojzeh, честно говоря, совсем не понял, почему ты делаешь такой вывод. Пояснишь?

Как мне кажется, нет смысла использовать RecordSortedList/RecordInsertList для временных таблиц InMemory, потому что в некотором смысле это альтернативные механизмы, а не взаимодополняющие.

Цитата:
Сообщение от wojzeh Посмотреть сообщение
Теперь вопрос следующий: в чём смысл (профит) использования этого класса с временной таблицей, если в документации сказано:

Код:
The array insert operation automatically falls back to classic record-by-record inserts when non-SQL based tables are used (for example, temporary tables)...
Ну да, в документации сказано про non-SQL based tables, а временная таблица TempDB - она очень даже SQL based Соответственно, профит тот же самый, что и при использовании этих классов с обычными таблицами: вставляемые записи собираются в пакеты большего размера и за счёт этого происходит меньше вызовов клиент/сервер.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 29.01.2014, 23:43   #4  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
681 / 517 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
wojzeh, честно говоря, совсем не понял, почему ты делаешь такой вывод. Пояснишь?

Как мне кажется, нет смысла использовать RecordSortedList/RecordInsertList для временных таблиц InMemory, потому что в некотором смысле это альтернативные механизмы, а не взаимодополняющие.

Ну да, в документации сказано про non-SQL based tables, а временная таблица TempDB - она очень даже SQL based Соответственно, профит тот же самый, что и при использовании этих классов с обычными таблицами: вставляемые записи собираются в пакеты большего размера и за счёт этого происходит меньше вызовов клиент/сервер.
ну, так вот я теперь и понял, что временная, но всё же сикель-базированная! именно её имеет смысл передавать в качестве параметра для ускорения.

при этом можно так же лихо подсунуть ей и настоящую "времянку", но только не в случае с RecordSortedList.

в любом случае это пробел в документации, и неплохо было бы его восполнить.

у меня как раз тут задача о быстрой вставке сотен тысяч записей, но именно во временную таблицу для последующих расчётов.
__________________
Felix nihil admirari
Теги
ax2012, recordinsertlist, tempdb

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ax-erp: How to get a Common object from a table id? Blog bot DAX Blogs 0 26.04.2012 00:12
workflowax: How do I select from table Common in AX? Blog bot DAX Blogs 0 16.11.2011 15:11
palleagermark: Not enough rights to use table 'Common' (Common) error i Purchase Totals (PurchTotals) Blog bot DAX Blogs 0 07.06.2011 19:11
axzaptech: RecordSortedList and RecordInsertList Blog bot DAX Blogs 0 28.01.2011 23:14
PatrickChua: Temporary table Blog bot DAX Blogs 0 04.05.2009 14:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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