|
20.01.2004, 13:12 | #1 |
Участник
|
Количество строк в Query
Существет ли какой-либо еще способ подсчитать количество строк в Query (несколько таблиц-источников), кроме тупого сканирования всех записей по while (qr.next)?
Дело в том, что это относительно медленный процесс. У меня получилось примерно 500 строк в секунду. Если другого способа нет, то можно хотя бы ускорить процесс сканирования именно с целью подсчета количества строк? PS: Объект SysQuery смотрел. Там подсчет именно через сканирование по while (qr.next) |
|
25.04.2011, 16:43 | #2 |
Участник
|
Похоже, никто не взял на себя смелость намекнуть ребятам из Microsoft, что метод подсчета количества строк в Query, если количество источников данных больше одного "немного" не правильный .
В Ax2009 они наступили на те же "грабли" в методе SysQuery.countPrim(). На первый взгляд, решение для Ax3.0 приведенное по ссылке выше вполне подходит и для Ax2009. |
|
20.09.2011, 14:47 | #3 |
Участник
|
Немного пофиксил код для запросов с группировкой: не правильно возвращает loops если запрос с группировкой возвращает 1 строку (например query такого содержания: select ItemGroupId from inventTable group by ItemGroupId where ItemGroupId=='const')
X++: private server static container countPrim(container _queryPack) { ... Integer iGrp; ; countQueryRun = new QueryRun(_queryPack); countQuery = countQueryRun.query(); for (k = 1; k <= countQuery.dataSourceCount();k++) { qbds = countQuery.dataSourceNo(k); qbds.update(false); iGrp +=(qbds.orderMode()==orderMode::GroupBy); // SHiSHok.fix //qbds.sortClear(); // Вот этот метод сильно мешал! qbfl = qbds.fields(); qbfl.dynamic(false); qbfl.clearFieldList(); qbfl.addField(FieldNum(Common,recId),SelectionField::COUNT); } countQueryRun = new QueryRun(countQuery); while (countQueryRun.next()) { common = countQueryRun.getNo(1); counter += common.recId; loops++; } // return [counter,((loops > 1)? loops : counter)]; return [counter,(iGrp ? loops : counter)]; // SHiSHok.fix }
__________________
--- SHiSHok |
|
|
За это сообщение автора поблагодарили: mazzy (5), Ace of Database (5), wojzeh (1). |
15.10.2013, 10:18 | #4 |
Участник
|
Цитата:
Сообщение от SHiSHok
Немного пофиксил код для запросов с группировкой: не правильно возвращает loops если запрос с группировкой возвращает 1 строку (например query такого содержания: select ItemGroupId from inventTable group by ItemGroupId where ItemGroupId=='const')
X++: private server static container countPrim(container _queryPack) { ... Integer iGrp; ; countQueryRun = new QueryRun(_queryPack); countQuery = countQueryRun.query(); for (k = 1; k <= countQuery.dataSourceCount();k++) { qbds = countQuery.dataSourceNo(k); qbds.update(false); iGrp +=(qbds.orderMode()==orderMode::GroupBy); // SHiSHok.fix //qbds.sortClear(); // Вот этот метод сильно мешал! qbfl = qbds.fields(); qbfl.dynamic(false); qbfl.clearFieldList(); qbfl.addField(FieldNum(Common,recId),SelectionField::COUNT); } countQueryRun = new QueryRun(countQuery); while (countQueryRun.next()) { common = countQueryRun.getNo(1); counter += common.recId; loops++; } // return [counter,((loops > 1)? loops : counter)]; return [counter,(iGrp ? loops : counter)]; // SHiSHok.fix } |
|
19.06.2014, 01:03 | #5 |
Участник
|
X++: private server static container ountPrim(container _queryPack) { Query countQuery; QueryRun countQueryRun; QueryBuildDataSource qbds; QueryBuildFieldList qbfl; Common common; Integer counter; Integer loops; Integer tmxGroupNumber; Integer tmxDataSourceNumber; ; countQueryRun = new QueryRun(_queryPack); countQuery = countQueryRun.query(); tmxGroupNumber = countQuery.groupByFieldCount(); //<-- this guarantees number of groupings for (tmxDataSourceNumber = 1; tmxDataSourceNumber <= countQuery.dataSourceCount(); tmxDataSourceNumber++) { qbds = countQuery.dataSourceNo(tmxDataSourceNumber); qbds.update(false); //qbds.sortClear(); //tmxGroupNumber +=(qbds.orderMode()==orderMode::GroupBy); qbfl = qbds.fields(); qbfl.dynamic(false); qbfl.clearFieldList(); qbds.addSelectionField(fieldNum(Common,RecId),SelectionField::Count); } countQueryRun = new QueryRun(countQuery); while (countQueryRun.next()) { common = countQueryRun.getNo(1); counter += common.RecId; loops++; } //return [counter,loops]; return [counter,(tmxGroupNumber ? loops : counter)]; }
__________________
Felix nihil admirari Последний раз редактировалось wojzeh; 19.06.2014 в 01:06. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
11.08.2014, 18:27 | #6 |
Участник
|
В Ax2012 R2 существует queryRun::getQueryRowCount(query, maxInt());
Кто-нибудь производительность проверял? |
|