19.11.2009, 11:29 | #1 |
Участник
|
Помогите с Query
Всем доброго дня.
Подскажите, как реализовать в DAX следующий sql запрос, желательно через Query. Запрос нужен для суммирования пересчитанных данных. select a.tovar, sum(a.kolichestvo * b.percent)Или убрать (крайне нежелательно) из запроса функцию sum и просуммировать после выполнения, используя цикл ? while (QueryRun.next()) |
|
19.11.2009, 11:36 | #2 |
Участник
|
Никак.
Используйте while select. Он быстрее чем QueryRun.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
19.11.2009, 11:40 | #3 |
Участник
|
Спасибо, за оперативный ответ.
Жаль, что нет такого функционала. |
|
19.11.2009, 11:58 | #4 |
Участник
|
НЗ.
Можно через ODBC, ADO, но представлете что будет если в аксе начать заменять while select на доступ к базе миную аксу. Бардак будет.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
19.11.2009, 14:24 | #5 |
Участник
|
|
|
20.11.2009, 07:53 | #6 |
Участник
|
Можно
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));
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
|
За это сообщение автора поблагодарили: _scorp_ (3). |
20.11.2009, 08:52 | #7 |
Участник
|
У меня
X++: while select * from Table {} X++: while select Table {} Возможно на результаты иследования скорости повлиял оптимизатор. ИМХО while select при прочих равных не должен быть быстрее QueryRun. P.S.: Кстати показательный пример в пользу активного использования SelectionField:: Database Последний раз редактировалось S.Kuskov; 20.11.2009 в 08:55. |
|
20.11.2009, 09:08 | #8 |
Участник
|
Если сможете получить такой результат напишите.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
20.11.2009, 09:28 | #9 |
Участник
|
В Axapta 3.0 получились примерно схожие результаты. Правда пробовал на другой таблице, но, думаю, это погоды не делает. "QueryRun" - 43 сек, а "while select" - 42 сек.
|
|
20.11.2009, 09:36 | #10 |
Участник
|
Тестировал в 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 |
Участник
|
A сравнивали с
X++: while select * from Table {} X++: while select Table {} Ага увидел. Попробуйте со звёздочкой для, чистоты эксперимента. |
|
20.11.2009, 09:54 | #12 |
Участник
|
Мои результаты
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 |
|
20.11.2009, 10:05 | #13 |
Участник
|
|
|
20.11.2009, 10:11 | #14 |
Участник
|
Пардон.
AX4.0SP2 Kernel version: 4.0.2163.0 Application version: 4.0.2501.347 |
|
20.11.2009, 10:17 | #15 |
Боец
|
А не сравнивали запросы, уходящие на SQL в обоих случаях (while, queryRun)? Было бы любопытно на них взглянуть
|
|
20.11.2009, 10:33 | #16 |
Участник
|
Цитата:
Цитата:
Сообщение (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 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 |
Участник
|
У меня разницы нет. Хотя звёздочку в таких случаях никогда не пишу.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
20.11.2009, 10:55 | #18 |
Участник
|
Сдаётся мне, что пробовать нужно на одних и тех же таблицах. Попробовал на LedgerTrans - разница появилась существенная.
|
|
20.11.2009, 11:49 | #19 |
Участник
|
Посмотрел запросы, отправляемые на сервер...
При QueryRun присутствует сортировка: X++: ORDER BY A.DATAAREAID,A.ACCOUNTNUM,A.TRANSDATE,A.VOUCHER,A.AMOUNTMST Что-то не соображу пока, с чем это связано... |
|
20.11.2009, 13:01 | #20 |
Участник
|
Ага. Это поля индекса. Причём даже если индекс не PrimaryIndex и не ClusterIndex в Query всё равно добаляется сортировка по нему. Явный .sortClear() тоже не убирает order by из запроса.
Может есть какя-нибудь настройка AOS, которую можно выключить? Конечно очень странное решение - по умолчанию навязывать сортировку во всех Query. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Dynamics AX Geek: Using query() | 0 | |||
palleagermark: Sample union query from AX 2009 | 0 | |||
Dynamics AX Geek: Using query() | 0 | |||
Помогите новичку в создании Query | 2 | |||
Помогите с query | 23 |
|