Получение общего количества записей при получении ограниченного набора - Oracle - PullRequest
0 голосов
/ 12 августа 2009

У меня есть запрос ниже, который выбирает 500 записей в соответствии с определенными критериями. Дело в том, что здесь много строк (миллионов). Я хочу получить общее количество записей, чтобы я мог сказать «отображать 500 из .... строк». Могу ли я сделать это с помощью этого запроса? в настоящее время у меня есть отдельный запрос для этого, но мне было интересно, могу ли я сделать это в том же запросе.

Приветствия

Tam

Запрос:

SELECT * FROM APPL_PERF_STATS 
WHERE (GENERIC_METHOD_NAME != 'NULL' AND CURRENT_APPL_ID != 'NULL' AND EVENT_NAME != 'NULL')  
AND ROWNUM <  500 
AND current_appl_id  LIKE '%OrderingGUI%' 
AND event_name  LIKE '%/ccui%' 
AND generic_method_name  LIKE '%com.telus.customermgt.service.CustomerMgtSvc.getCustomer%' AND appl_perf_interval_typ_id = 1440 
AND cover_period_start_ts >= to_date('06-07-2008 11:53','dd-mm-yyyy HH24:mi') 
AND cover_period_start_ts <= to_date('11-08-2009 11:53','dd-mm-yyyy HH24:mi')  
ORDER BY CURRENT_APPL_ID, EVENT_NAME, GENERIC_METHOD_NAME, CREATE_TS 

Ответы [ 6 ]

5 голосов
/ 12 августа 2009

На практике, когда мне задают такую ​​проблему, я обычно выбираю на одну больше, чем я желаю отображать (скажем, 500, так что потяните 501), и если я достиг этой суммы, то сообщаю пользователю «Более 500 записей были возвращены "который дает пользователю возможность уточнить запрос. Вы можете сначала выполнить подсчет запроса, а затем вернуть первые n строк, но для этого потребуется еще одна поездка на сервер и, в зависимости от сложности запроса и объема данных, это может занять много времени.

Другим методом будет добавление в таблицу статистики подсчетов, которые вы можете суммировать непосредственно перед выполнением этого запроса. Теория состоит в том, что ваша таблица статистики будет содержать гораздо меньше данных, чем ваши основные таблицы, и поэтому может быстро обрабатываться сервером. Если вы пишете процесс (хранимые процедуры работают лучше всего), чтобы обновить их, а затем вернуть результаты.

Я не уверен насчет вашего приложения или ваших пользователей. Но мой, как правило, либо не заботится об общем количестве записей, либо хочет только общее количество записей и не хочет детализации.

4 голосов
/ 12 августа 2009

В Oracle по крайней мере вы можете сделать это, используя аналитические функции:

Например:

  select
      count(*) over (partition by null) total_num_items,
      p.*
  from
      APPL_PERF_STATS p
  where
      ...

Обратите внимание, что (как уже упоминалось в APC) вам нужно встроить упорядоченный запрос в подзапрос, прежде чем использовать ROWNUM для ограничения вывода до n строк.

Хотя это метод получения общего количества строк в возвращенном наборе результатов, в фоновом режиме Oracle будет подсчитывать все строки. Таким образом, если есть «миллионы строк», это приведет к снижению производительности. Если прирост производительности будет чрезмерным, я бы использовал предварительную агрегацию общего числа строк как отдельное пакетное задание. Вы можете найти материализованные представления полезными, если это так.

2 голосов
/ 12 августа 2009
SELECT rn, total_rows, x.OWNER, x.object_name, x.object_type
  FROM (SELECT COUNT (*) OVER (PARTITION BY owner) AS TOTAL_ROWS,
               ROW_NUMBER () OVER (ORDER BY 1) AS rn, uo.*
          FROM all_objects uo
         WHERE owner = 'CSEIS') x
 WHERE rn BETWEEN 6 AND 10

RN  TOTAL_ROWS  OWNER   OBJECT_NAME     OBJECT_TYPE
6   1262        CSEIS   CG$BDS_MODIFICATION_TYPES       TRIGGER
7   1262        CSEIS   CG$AUS_MODIFICATION_TYPES       TRIGGER
8   1262        CSEIS   CG$BDR_MODIFICATION_TYPES       TRIGGER
9   1262        CSEIS   CG$ADS_MODIFICATION_TYPES       TRIGGER
10  1262        CSEIS   CG$BIS_LANGUAGES                TRIGGER
2 голосов
/ 12 августа 2009

Желание отобразить страницу 1 из 100 вызвано чрезмерным воздействием Google. Как и в других областях, то, что делает Google, не имеет отношения к корпоративным ИТ. Google догадывается, но у него есть архитектура, которая делает его предположения достаточно точными.

Если вы используете готовую СУБД, это не относится к вашей настройке. Вы должны сделать это трудным путем, выполнив два запроса - один, чтобы получить счетчик, затем один, чтобы получить строки. Если запрос хорошо проиндексирован, выполнение начального подсчета может быть не слишком дорогим, но это все равно два запроса.

2 голосов
/ 12 августа 2009

ORDER BY и ROWNUM не взаимодействуют так, как вы думаете, они взаимодействуют. ROWNUM применяется первым:

SQL> select ename from emp
  2  where rownum < 5
  3  order by ename
  4  /

ENAME
----------
CLARKE
PADFIELD
ROBERTSON
VAN WIJK

SQL> select * from (
  2     select ename from emp
  3     order by ename
  4  )
  5  where rownum < 5
  6  /

ENAME
----------
BILLINGTON
BOEHMER
CAVE
CLARKE

SQL>
0 голосов
/ 12 августа 2009

На практике я обнаружил, что почти никогда не бывает полезно иметь такие данные - и дорого. Особенно, если в таблицы записываются, ваш общий счет постоянно меняется, и поэтому довольно ненадежное число для отображения пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...