|
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, 09:36 | #7 |
Участник
|
Тестировал в 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 |
Участник
|
A сравнивали с
X++: while select * from Table {} X++: while select Table {} Ага увидел. Попробуйте со звёздочкой для, чистоты эксперимента. |
|
20.11.2009, 08:52 | #9 |
Участник
|
У меня
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 | #10 |
Участник
|
Если сможете получить такой результат напишите.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
20.11.2009, 09:28 | #11 |
Участник
|
В Axapta 3.0 получились примерно схожие результаты. Правда пробовал на другой таблице, но, думаю, это погоды не делает. "QueryRun" - 43 сек, а "while select" - 42 сек.
|
|
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:33 | #15 |
Участник
|
Цитата:
Цитата:
Сообщение (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:17 | #16 |
Боец
|
А не сравнивали запросы, уходящие на SQL в обоих случаях (while, queryRun)? Было бы любопытно на них взглянуть
|
|
20.11.2009, 13:01 | #17 |
Участник
|
Ага. Это поля индекса. Причём даже если индекс не PrimaryIndex и не ClusterIndex в Query всё равно добаляется сортировка по нему. Явный .sortClear() тоже не убирает order by из запроса.
Может есть какя-нибудь настройка AOS, которую можно выключить? Конечно очень странное решение - по умолчанию навязывать сортировку во всех Query. |
|
20.11.2009, 20:54 | #18 |
MCITP
|
Цитата:
Сообщение от S.Kuskov
Ага. Это поля индекса. Причём даже если индекс не PrimaryIndex и не ClusterIndex в Query всё равно добаляется сортировка по нему. Явный .sortClear() тоже не убирает order by из запроса.
Может есть какя-нибудь настройка AOS, которую можно выключить? Конечно очень странное решение - по умолчанию навязывать сортировку во всех Query. И убрать это вроде как нельзя никак - по крайней мере так мне сказал представитель майкрософта в приватной беседе на прошлом мастер-классе по 4-ке.
__________________
Zhirenkov Vitaly |
|
21.11.2009, 13:29 | #19 |
Участник
|
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=?) X++: FROM LEDGERTRANS A WHERE (DATAAREAID=?) ORDER BY A.DATAAREAID,A.ACCOUNTNUM,A.TRANSDATE,A.VOUCHER,A.AMOUNTMST
__________________
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 |
MCITP
|
Цитата:
Да и отключать RLS в запросах тоже не всегда представляется возможным... ЗЫ Хотя всё равно я не понял, зачем этот ордер бай нужен, при RLS...
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: player (1). |
|
Похожие темы | ||||
Тема | Ответов | |||
Dynamics AX Geek: Using query() | 0 | |||
palleagermark: Sample union query from AX 2009 | 0 | |||
Dynamics AX Geek: Using query() | 0 | |||
Помогите новичку в создании Query | 2 | |||
Помогите с query | 23 |
|