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, 08:52   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 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   #8  
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   #9  
tricky is offline
tricky
Участник
 
140 / 64 (3) ++++
Регистрация: 03.05.2005
Адрес: Гуково
В Axapta 3.0 получились примерно схожие результаты. Правда пробовал на другой таблице, но, думаю, это погоды не делает. "QueryRun" - 43 сек, а "while select" - 42 сек.
Старый 20.11.2009, 09:36   #10  
_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   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
A сравнивали с
X++:
while select * from Table {}
или
X++:
while select Table {}
?

Ага увидел. Попробуйте со звёздочкой для, чистоты эксперимента.
Старый 20.11.2009, 09:54   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 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,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Пардон.

AX4.0SP2
Kernel version: 4.0.2163.0
Application version: 4.0.2501.347
Старый 20.11.2009, 10:17   #15  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
А не сравнивали запросы, уходящие на SQL в обоих случаях (while, queryRun)? Было бы любопытно на них взглянуть
Старый 20.11.2009, 10:33   #16  
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:36   #17  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
A сравнивали с
X++:
while select * from Table {}
или
X++:
while select Table {}
?

Ага увидел. Попробуйте со звёздочкой для, чистоты эксперимента.
У меня разницы нет. Хотя звёздочку в таких случаях никогда не пишу.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 20.11.2009, 10:55   #18  
tricky is offline
tricky
Участник
 
140 / 64 (3) ++++
Регистрация: 03.05.2005
Адрес: Гуково
Сдаётся мне, что пробовать нужно на одних и тех же таблицах. Попробовал на LedgerTrans - разница появилась существенная.
Старый 20.11.2009, 11:49   #19  
tricky is offline
tricky
Участник
 
140 / 64 (3) ++++
Регистрация: 03.05.2005
Адрес: Гуково
Посмотрел запросы, отправляемые на сервер...
При QueryRun присутствует сортировка:
X++:
ORDER BY A.DATAAREAID,A.ACCOUNTNUM,A.TRANSDATE,A.VOUCHER,A.AMOUNTMST
При. while select сортировки нет.
Что-то не соображу пока, с чем это связано...
Старый 20.11.2009, 13:01   #20  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Ага. Это поля индекса. Причём даже если индекс не PrimaryIndex и не ClusterIndex в Query всё равно добаляется сортировка по нему. Явный .sortClear() тоже не убирает order by из запроса.

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

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
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, время: 14:28.