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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.11.2009, 11:29   #1  
Vitali_i is offline
Vitali_i
Участник
 
13 / 10 (1) +
Регистрация: 15.07.2004
Адрес: Москва
Помогите с Query
Всем доброго дня.
Подскажите, как реализовать в DAX следующий sql запрос, желательно через Query.
Запрос нужен для суммирования пересчитанных данных.
select a.tovar, sum(a.kolichestvo * b.percent)
from table1 a, table2 b
where a.field_a = b.field_b
group by a.tovar
Или убрать (крайне нежелательно) из запроса функцию sum и просуммировать после выполнения, используя цикл ?
while (QueryRun.next())
Старый 19.11.2009, 11:36   #2  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Никак.
Используйте while select.
Он быстрее чем QueryRun.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 19.11.2009, 11:40   #3  
Vitali_i is offline
Vitali_i
Участник
 
13 / 10 (1) +
Регистрация: 15.07.2004
Адрес: Москва
Спасибо, за оперативный ответ.

Жаль, что нет такого функционала.
Старый 19.11.2009, 11:58   #4  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
НЗ.
Можно через ODBC, ADO, но представлете что будет если в аксе начать заменять while select на доступ к базе миную аксу. Бардак будет.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 19.11.2009, 14:24   #5  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от miklenew Посмотреть сообщение
Используйте while select.
Он быстрее чем QueryRun.
А можно поподробнее?
Старый 20.11.2009, 07:53   #6  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от _scorp_ Посмотреть сообщение
А можно поподробнее?
Можно
X++:
    xRefNames xRefNames;
    int       start;
    int       end;
;
    start = timenow();
    while select xRefNames
    {

    }
    end = timenow();
    info("while " + time2str(end-start,1,1));
и
X++:
    xRefNames xRefNames;
    int       start;
    int       end;
    QueryRun  queryRun;
    query     query;
;
    start = timenow();
    query = new Query();
    query.addDataSource(tablenum(xRefNames));

    queryRun = new QueryRun(query);

    while (queryRun.next())
    {
        xRefNames = queryRun.get(TableNum(xRefNames));
    }
    end = timenow();
    info("queryRun " + time2str(end-start,1,1));
У меня получилось 28 и 46 секунд соответственно.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
За это сообщение автора поблагодарили: _scorp_ (3).
Старый 20.11.2009, 09:36   #7  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от miklenew Посмотреть сообщение
У меня получилось 28 и 46 секунд соответственно.
Тестировал в AX 2009. Запускал job 2 раза. У меня получился примерно тот же порядок - while select быстрее queryRun на 50%...
X++:
static void JobQR(Args _args)
{
    LedgerTrans ledgerTrans;
    AccountNum  accountNum;
    int         start;
    int         end;
    
    void queryWhileSelect()
    {
        while select ledgerTrans
        {
            accountNum = ledgerTrans.AccountNum;
        }
    }
    
    void queryQueryRun()
    {
        Query       q;
        QueryRun    qr;
        LedgerTrans ledgerTransLocal;
        ;
        q = new Query();
        q.addDataSource(tablenum(LedgerTrans));
        qr = new QueryRun(q);
        while (qr.next())
        {
            ledgerTransLocal = qr.get(tablenum(LedgerTrans));
            accountNum = ledgerTransLocal.AccountNum;
        }
    }
    ;
    
    start = timenow();
    queryWhileSelect();
    end = timenow();
    info("while " + time2str(end-start,1,1));
    
    start = timenow();
    queryQueryRun();
    end = timenow();
    info("queryRun " + time2str(end-start,1,1));
}

Последний раз редактировалось _scorp_; 20.11.2009 в 09:38.
Старый 20.11.2009, 09:40   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
A сравнивали с
X++:
while select * from Table {}
или
X++:
while select Table {}
?

Ага увидел. Попробуйте со звёздочкой для, чистоты эксперимента.
Старый 20.11.2009, 08:52   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
У меня
X++:
while select * from Table {}
выполняется долше чем
X++:
while select Table {}
Причём время выпонения становится сопоставимо с временем работы QueryRun.

Возможно на результаты иследования скорости повлиял оптимизатор. ИМХО while select при прочих равных не должен быть быстрее QueryRun.

P.S.: Кстати показательный пример в пользу активного использования SelectionField:: Database

Последний раз редактировалось S.Kuskov; 20.11.2009 в 08:55.
Старый 20.11.2009, 09:08   #10  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
ИМХО while select при прочих равных не должен быть быстрее QueryRun.
Если сможете получить такой результат напишите.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 20.11.2009, 09:28   #11  
tricky is offline
tricky
Участник
 
140 / 64 (3) ++++
Регистрация: 03.05.2005
Адрес: Гуково
В Axapta 3.0 получились примерно схожие результаты. Правда пробовал на другой таблице, но, думаю, это погоды не делает. "QueryRun" - 43 сек, а "while select" - 42 сек.
Старый 20.11.2009, 09:54   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Мои результаты
X++:
static void JobTestSpeed(Args _args)
{
    int i;
    
    void t1()
    {
        RContractTable RContractTable;
        int       start;
        int       end;
        ;
 
        start = timenow();
        while select * from RContractTable {}
        end = timenow();
        info("while " + time2str(end-start,1,1));
    }
    
    void t2()
    {
        RContractTable RContractTable;
        int       start;
        int       end;
        QueryRun  queryRun;
        query     query;
        ;
        
        start = timenow();
        query = new Query();
        query.addDataSource(tablenum(RContractTable));

        queryRun = new QueryRun(query);

        while (queryRun.next())
        {
            RContractTable = queryRun.get(TableNum(RContractTable));
        }
        end = timenow();
        info("queryRun " + time2str(end-start,1,1));
    }
    ;
    
    info(int642str((select count(RecId) from RContractTable).RecId));
    
    for (i = 1; i <= 5; i++) t1();
    for (i = 1; i <= 5; i++) t2();
    for (i = 1; i <= 5; i++) {t1();t2();}
}
Цитата:
21291
while 00:00:35
while 00:00:32
while 00:00:36
while 00:00:36
while 00:00:33
queryRun 00:00:36
queryRun 00:00:35
queryRun 00:00:38
queryRun 00:00:37
queryRun 00:00:40
while 00:00:36
queryRun 00:00:38
while 00:00:37
queryRun 00:00:35
while 00:00:36
queryRun 00:00:34
while 00:00:32
queryRun 00:00:34
while 00:00:34
queryRun 00:00:34
Тестировал на живой базе. Так-что разброс есть, но в обе стороны и не 50%
Старый 20.11.2009, 10:05   #13  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Мои результаты
Какая версия AX?
Старый 20.11.2009, 10:11   #14  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Пардон.

AX4.0SP2
Kernel version: 4.0.2163.0
Application version: 4.0.2501.347
Старый 20.11.2009, 10:33   #15  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Тестировал на живой базе. Так-что разброс есть, но в обе стороны и не 50%
Вот мои результаты по вашему job. Только таблицу поменял на xRefNames
Цитата:
Сообщение (10:29:13)
312573
while 00:00:13
while 00:00:14
while 00:00:14
while 00:00:13
while 00:00:12
queryRun 00:00:22
queryRun 00:00:21
queryRun 00:00:22
queryRun 00:00:20
queryRun 00:00:21
while 00:00:13
queryRun 00:00:20
while 00:00:13
queryRun 00:00:20
while 00:00:13
queryRun 00:00:20
while 00:00:13
queryRun 00:00:20
while 00:00:13
queryRun 00:00:20
AX4.0
Kernel version: 4.0.2163.0
Application version: 4.0.2163.0
А база у вас чья? Oracle или MS SQL?
Я пробовал на MS SQL 2005.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.

Последний раз редактировалось miklenew; 20.11.2009 в 10:35.
Старый 20.11.2009, 10:17   #16  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
А не сравнивали запросы, уходящие на SQL в обоих случаях (while, queryRun)? Было бы любопытно на них взглянуть
Старый 20.11.2009, 13:01   #17  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ага. Это поля индекса. Причём даже если индекс не PrimaryIndex и не ClusterIndex в Query всё равно добаляется сортировка по нему. Явный .sortClear() тоже не убирает order by из запроса.

Может есть какя-нибудь настройка AOS, которую можно выключить? Конечно очень странное решение - по умолчанию навязывать сортировку во всех Query.
Старый 20.11.2009, 20:54   #18  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ага. Это поля индекса. Причём даже если индекс не PrimaryIndex и не ClusterIndex в Query всё равно добаляется сортировка по нему. Явный .sortClear() тоже не убирает order by из запроса.

Может есть какя-нибудь настройка AOS, которую можно выключить? Конечно очень странное решение - по умолчанию навязывать сортировку во всех Query.
Не то слово - "странное"... И оно во всех формах присутствует.
И убрать это вроде как нельзя никак - по крайней мере так мне сказал представитель майкрософта в приватной беседе на прошлом мастер-классе по 4-ке.
__________________
Zhirenkov Vitaly
Старый 21.11.2009, 13:29   #19  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
Cool recordLevelSecurity
Цитата:
Сообщение от ZVV Посмотреть сообщение
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ага. Это поля индекса. Причём даже если индекс не PrimaryIndex и не ClusterIndex в Query всё равно добаляется сортировка по нему. Явный .sortClear() тоже не убирает order by из запроса.

Может есть какя-нибудь настройка AOS, которую можно выключить? Конечно очень странное решение - по умолчанию навязывать сортировку во всех Query.
Не то слово - "странное"... И оно во всех формах присутствует.
И убрать это вроде как нельзя никак - по крайней мере так мне сказал представитель майкрософта в приватной беседе на прошлом мастер-классе по 4-ке.

сдается мне, что слукавил 'представитель майкрософта' в этом вопросе, и убрать явную сортировку в общем то возможно.

Сортировка в QueryRun навязывается механизмом Record Level Security (который для этих объектов по умолчанию включен, состояние флага RLS QueryRun первоначально наследуется из Query на основе которого создается), если при инициализации этих объектов явно отключить RLS ( Query.recordLevelSecurity( false ) или QueryRun.recordLevelSecurity( false ) ) то запрос уже не будет содержать ORDER BY по полям индекса:

QueryRun.recordLevelSecurity( false ):
X++:
...
FROM LEDGERTRANS A WHERE (DATAAREAID=?)
QueryRun.recordLevelSecurity( true ):
X++:
FROM LEDGERTRANS A WHERE (DATAAREAID=?) ORDER BY A.DATAAREAID,A.ACCOUNTNUM,A.TRANSDATE,A.VOUCHER,A.AMOUNTMST
P.S. тестировалось на SQL2005
__________________
Dynamics AX 4.0 SP2
За это сообщение автора поблагодарили: mazzy (2), dn (1), raz (1), ZVV (1), Lemming (1), _AnK_ (2), gl00mie (1), S.Kuskov (2).
Старый 21.11.2009, 17:59   #20  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от in.dc Посмотреть сообщение
сдается мне, что слукавил 'представитель майкрософта' в этом вопросе, и убрать явную сортировку в общем то возможно.
Ну мы с ним про формы говорили, а не про Query, так что может и не слукавил таки...

Да и отключать RLS в запросах тоже не всегда представляется возможным...

ЗЫ Хотя всё равно я не понял, зачем этот ордер бай нужен, при RLS...
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: player (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 04.05.2009 14:05
palleagermark: Sample union query from AX 2009 Blog bot DAX Blogs 0 11.07.2008 20:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 28.10.2006 16:40
Помогите новичку в создании Query lev DAX: Программирование 2 19.06.2006 10:29
Помогите с query 6apcyk DAX: Программирование 23 09.09.2005 13:50
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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