Общее количество выполненных запросов Oracle с указанием количества и времени выполнения (для программы Java)

#java #performance #oracle #plsql

#java #Производительность #Oracle #plsql

Вопрос:

Я хочу знать общее количество запросов, выполненных с учетом их количества и времени выполнения для моей программы Java (у меня нет исходного кода).

Я планирую написать PL / SQL, который объединяет gv$session и gv$sql , записывая выходные данные в одну из таблиц. После завершения выполнения программы я запрошу таблицу, чтобы получить более подробную информацию.

Но я хотел бы знать, есть ли у Oracle какая-либо утилита по умолчанию для получения аналогичного отчета? Я просматривал отчеты AWR для Oracle, но не получил простой документации по ним.

Комментарии:

1. Tkprof это мой инстинктивный ответ, но я оставлю это для тех, кто знает лучше.

Ответ №1:

Я бы выбрал

 DBMS_SESSION.SESSION_TRACE_ENABLE (waits => true);
  

На сервере базы данных вы получите сгенерированный файл (в каталоге, указанном user_dump_dest в параметре v $), который будет содержать трассировку.

Запустите эту трассировку с помощью tkprof утилиты (database utility на сервере DB), и она выдаст вам все SQLL-файлы, сколько раз они выполнялись, как долго они выполнялись, и разбивку того, на что было потрачено это время.

Недостатком v $ sql (или gv $ sql для RAC) является то, что (1) некоторые запросы могут устаревать, особенно при длительном выполнении процесса и (2) потенциальное «вмешательство» со стороны других сеансов, если у вас нет эксклюзивного доступа к БД.

Если вы не хотите возиться с файлами, из v $ session вы также можете перейти к v $ sessstat и v $ session_event, которые могут предложить некоторые полезные лакомые кусочки.

 select event, sum(round(time_waited/(100*60),2)) time_mins, wait_class
from v$session_event
where sid in (221)
group by event, wait_class
order by 2 desc;

select sid, name, value from v$sesstat s 
  join v$statname n on n.statistic# = s.statistic#
where s.sid in (221)
and name in ('consistent gets','sorts (rows)','execute count',
        'parse count (total)','user calls','user commits','user rollbacks'
order by value desc;
  

Комментарии:

1. спасибо, Гэри, я попробую выполнить трассировку в своей среде. Кстати, у меня есть еще один связанный с этим вопрос, как вы знаете, я пытаюсь использовать gv $ session, gv $ sql и gv $ process для получения активных запросов на сервере, используя эти три таблицы, есть ли какой-либо способ однозначно идентифицировать каждый выполняемый запрос? В качестве примера, если конкретный запрос SELECT выполняется последовательно 4 раза в одном сеансе, могу ли я различать каждое выполнение отдельно? Я пытался использовать поля SID, PID, SERIAL # и т.д., Но, похоже, конкретный запрос использует один и тот же SID, PID и т.д. Во всех исполнениях

2. Одна из возможных проблем заключается в том, что это зависит от сеанса. Если этот java pgm использует пул подключений или общий сервер env, не уверен, как отслеживать отдельных пользователей или получать сводные отчеты. Я уверен, что есть умный способ обойти это, но подумал, что я расскажу об этом. Возможно, с использованием dbms_monitor… Мне нужно было бы подробнее изучить этот вопрос.