Как посмотреть очередь oracle
Oracle Data Integration, Cloud, Spatial and Analytics (GoldenGate, ODI, Cloud, Spatial, Exadata)
В последнее время довольно часто встречаюсь с задачей, когда данные, захватываемые GoldenGate, нужно доставлять в нестандартные приемники.
Под стандартными я понимаю:
- базы данных Oracle, MSSQL, DB2, MySQL, Sybase, TimesTen и др.
- плоские файлы.
В случае нестандартного источника GoldenGate не знает, как правильно записать информацию в целевую систему и приходится либо использовать возможности целевой системы для загрузки данных, либо использовать Java API для написания собственные процедур. Но есть третий путь – использовать адаптер GoldenGate for JMS. О последнем вариант мы и поговорим.
Применение
Где это может быть использовано? Вот довольно типовые задачи:
Все эти задачи объединяются общими характеристиками:
- Real-Time (или близкий к Real-Time) режим работы
- изначальная нерегламентированность задач (база данных и приложение разрабатывались до появления этих требований)
- нежелание грузить базу данных (она обычно и так работает на пределе железа).
В пределе это классическая задача, где источником является база данных, а целевая система – Complex Event Processing.
Способов решения существует несколько:
- Запустить приложение, которое в цикле будет постоянно опрашивать таблицу и отсылать уведомления (ресурсоемко и немасштабируемо).
- Использовать возможности DBMS_CHANGE_NOTIFICATION (обработку уведомлений нужно будет писать на PL/SQL или C, существует только в СУБД Oracle)
- Использовать GoldenGate со специальным адаптером JMS (быстро, масштабируемо, нулевая дополнительная нагрузка на источник, гибко). Схема решения следующая:
Инсталляция необходимых компонент
- Агент GoldenGate, который будет перелопачивать журналы СУБД в формат, понятный GoldenGate (в Trail-файлы). Этот компонент специфичен для каждой СУБД+ОС. (раздел Oracle GoldenGate on Oracle Media Pack или Oracle GoldenGate for Non Oracle Media Pack)
- Агент GoldenGate, который будет заниматься преобразованием данных, захваченных в п.1 и помещением их в JMS-очередь (Oracle GoldenGate Application Adapters for JMS and Flat File Media Pack).
- Провайдер очереди JMS. В нашем случае это будет Weblogic, но могут быть и другие – ActiveMQ, Websphere и т.д.
Я буду для простоты рассматривать вариант, когда у меня источник СУБД Oracle.
Подготовка среды Oracle для GoldenGate
0. Стандартным образом инсталлируем GoldenGate для Oracle
Здесь не буду приводить подробности. При необходимости можно заглянуть вот сюда.
1. Конфигурируем процесс Manager на источнике
2. Создаем табличку для тестов на источнике
3. Добавляем Supplemental Logging
4. Настраиваем захват и передачу изменений на целевой сервер
Подготовка целевой системы
1. Инсталляция Oracle GoldenGate for Java
- ggs_JavaAdapter_xxxxxxxxxxx.tar
- ggs_xxxxx_Generic_xxxxxxxxx.zip
В Windows первый файл уже распакова
В результате структура содержимого каталога будет такой:
2. Инсталлируем Weblogic
Инсталлируем Java, а затем запускаем инсталляцию скачанного Weblogic:
java -jar wls1036_generic.jar
Далее на каталог с Weblogic будем называть <WLSinst>, по умолчанию этот каталог называется wlserver_10.3/ и располагается на уровень ниже Fusion Middleware Home <FMWhome>.
Для того, чтобы работать с Weblogic сформируем набор клиентских библиотек:
a. cd <WLSinst>/server/lib
b. java -jar wljarbuilder.jar
3. Создаем и запускаем Weblogic Domain
- <WLSinst>/common/bin/config.sh
- <FMWhome>/user_projects/domains/<DomainName>/startWeblogic.sh
4. Создаем JMS Connection Factory и Queue
Настройка GoldenGate для JMS
В качестве шаблона будем использовать следующий текст (в поставке GoldenGate for Java есть этот файл в каталоге sample-dirprm.
Все параметры должны писаться в одну строку. Особое внимание нужно обратить на параметр javawriter.bootoptions -Djava.class.path – каталоги и файлы должны разделяться в Windows с помощью точки с запятой и с помощью двоеточия в Linux.
Синтаксис при настройке параметров JMS-обработчиков следующий :
gg.handlerlist=<somename_1>,<somename_2>,…,<somename_n>
а затем :
gg.handler.<somename_1>.<property_a>=<value_w>
gg.handler.<somename_1>.<property_b>=<value_x>
gg.handler.<somename_2>.<property_a>=<value_y>
gg.handler.<somename_2>.<property_b>=<value_z>
Имена обработчиков (в примере это myjms1) никак не связаны c именами, используемыми в WebLogic Server. Имена свойств чувствительны к регистру.
Такой подход к настройке параметров позволяет определить несколько обработчиков в одном файле свойств. Обработчики, не перечисленные в параметре gg.handlerlist, игнорируются.
2. Настройка переменной PATH для доступа к JVM
Следующие настройку нужно будет сделать до запуска процесса MGR, поскольку процесс Extract наследует переменные среды от MGR.
На системе, где мы инсталлируем GoldenGate for Java, нужно будет настроить переменные PATH (Windows) или LD_LIBRARY_PATH (UNIX), чтобы GoldenGate мог найти JVM. Можно также в переменную PATH включить путь к запусковому файлу java, но это не обязательно, поскольку GoldenGate использует динамическую библиотеку jvm.dll (libjvm.so).
Для Windows я использовал следующие команды:
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_02
set PATH=%JAVA_HOME%\bin;%PATH%
set PATH=%JAVA_HOME%\jre\bin\server;%PATH%
Обратите внимание: на Windows в качестве разделителя используется точка с запятой (;), а на Unix – двоеточие(:).
3. Генерируем файл определений на приемнике (DEF)
4. Настраиваем менеджер для GoldenGate for Java
Повторяем все, что делали в разделе “Конфигурируем процесс Manager на источнике”.
5. Настройка процесса Extract для доставки данных в очередь
Мы создаем Extract ejms (имя может быть любое).
EXTRACT ejms
setEnv ( GGS_USEREXIT_CONF = "dirprm/javaue.properties" )
GetEnv (JAVA_HOME)
GetEnv (PATH)
GetEnv (LD_LIBRARY_PATH)
GetEnv (LIBPATH)
GetEnv (CLASSPATH)
CUserExit ggjava_ue.dll CUSEREXIT PASSTHRU INCLUDEUPDATEBEFORES
sourceDefs .\dirdef\emp.defs
getUpdateBefores
TABLE ggtest.employees;
Ключевые параметры здесь
6. Создаем и запуска Extact для JMS очереди
GGSCI> ADD extract ejms, extTrailSource dirdat/tb
GGSCI> START ejms
GGSCI> INFO ejms
Проверка работы
1. Генерируем нагрузку на источник
ALTER SESSION SET CURRENT_SCHEMA=GGTEST;
declare
n number;
Заключение
GoldenGate – это инструмент для интеграции данных. Он позволяет реплицировать базы данных, осуществлять безостановочную миграцию, создавать хранилища, работающие в реальном времени.
Использование модуля GoldenGate for Java позволяет пойти гораздо дальше. Я показал, как использовать GoldenGate для доставки изменений в очередь JMS, а это открывает весь мир SOA. С моей точки зрения – наиболее интересным применением может стать подача данных в Oracle Complex Event Processing, который, в свою очередь, открывает мир событийно-управляемых приложений.
declare
enqueue_options dbms_aq . enqueue_options_t ;
message_properties dbms_aq . message_properties_t ;
dequeue_options dbms_aq . dequeue_options_t ;
message_handle raw ( 16 );
mes aq$_srvntfn_message ;
begin
for a in ( select msgid from SYS . AQ_SRVNTFN_TABLE_1 where enq_time < sysdate - 3 ) loop
dequeue_options . wait := dbms_aq . no_wait ;
dequeue_options . msgid := a . msgid ;
dbms_aq . dequeue ( queue_name => 'AQ_SRVNTFN_TABLE_Q_1' ,
dequeue_options => dequeue_options ,
message_properties => message_properties ,
payload => mes ,
msgid => message_handle );
dbms_output . put_line ( 'removed: ' || message_handle );
commit ;
end loop ;
end ;
declare
enqueue_options dbms_aq . enqueue_options_t ;
message_properties dbms_aq . message_properties_t ;
dequeue_options dbms_aq . dequeue_options_t ;
message_handle raw ( 16 );
mes aq$_srvntfn_message ;
begin
for a in ( select msgid from SYS . AQ_SRVNTFN_TABLE_1 where enq_time < sysdate - 3 ) loop
dequeue_options . msgid := a . msgid ;
dbms_aq . dequeue ( queue_name => 'AQ_SRVNTFN_TABLE_Q_1' ,
dequeue_options => dequeue_options ,
message_properties => message_properties ,
payload => mes ,
msgid => message_handle );
dbms_output . put_line ( 'removed: ' || message_handle );
commit ;
end loop ;
end ;
declare
v_purge_options dbms_aqadm . aq$_purge_options_t ;
begin
v_purge_options . block := true ;
dbms_aqadm . purge_queue_table ( 'sys.aq_srvntfn_table_1' , null , v_purge_options );
end ;
/
begin
for a in ( select job_name from dba_scheduler_running_jobs where lower ( job_name ) like 'aq$_plsql_ntfn%' ) loop
begin
DBMS_SCHEDULER . STOP_JOB ( job_name => a . job_name , force => true );
DBMS_SCHEDULER . DROP_JOB ( job_name => a . job_name , force => true );
end ;
end loop ;
end ;
/
В Doc ID 1277984.1 настаивают, что все это работает, как ожидается. Мягко говоря, 20 работающих джобов с этим не согласны.
Зачем вообще нужна эта статистика или любые другие показатели? В ходе разработки часто возникает вопрос, а что же быстрее работает? Эффективно ли расходуются ресурсы базы? Если написать код по другому станет ли лучше?
В данной статье не будет рассказано как анализировать показатели, а будет рассказано как их получить.
Описание компонентов
v$mystat
Представление выводит статистику по последней выполненной транзакции в рамках текущей сессии. Состоит из следующих полей:
v$statname
Справочник с описанием значений статистики, нужен для связи с предыдущим представлением. Состоит из следующих полей:
v$timer
Это простое представление, которое возвращает время в сотых долях секунды, мы будет фиксировать время до и после теста, и затем отнимать одно значение от другого. Состоит из двух полей:
Поле | Тип | Описание |
---|---|---|
hsecs | number | количество времени в сотых долях секунды |
con_id | number | идентификатор контейнера (для мультиарендной контейнерной базы данных CDB) |
dbms_utility.get_cpu_time
Функция, которая возвращает время работы процессора (CPU) в сотых долях секунды.
select dbms_utility.get_cpu_time from dual; --результат 815Права
Для выполнения представления у пользователя (в моем случае PROD) должен быть доступ на все таблицы, подключаемся к БД с помощью пользователя SYS с ролью SYSDBA и выполняем скрипты ниже:
grant select on v_$statname to prod; grant select on v_$mystat to prod; grant select on v_$timer to prod; grant execute on dbms_utility to prod;Измерение общего и CPU времени на запрос
Логика простая - мы будем записывать значения времени в переменные до выполнения запроса и после, затем вычитать время завершения от времени начала и получать итоговый результат. Вывод результата будет осуществляться с помощью dbms_output.put_line , чтобы данные выводилилсь в SQL Developer перед выполнением скриптов выполним команду включающую вывод, а затем будет логика.
--включаем вывод данных в output set serveroutput on; declare v_t1 number; --время начала v_t2 number; --время завершения v_cpu1 number; --время ЦПУ до v_cpu2 number; --время ЦПУ после v_t_res number; --общее время выполнения v_cpu_res number; --общее время выполнения CPU begin --фиксируем начало --помещаяем общее время и время ЦПУ в переменные select t.hsecs ,dbms_utility.get_cpu_time into v_t1 ,v_cpu1 from v$timer t; --запустим 1000 раз цикл, который обновит дату у первых попавшихся строк for rec in 1..1000 loop update prod.operation set op_date = trunc(sysdate) where rownum = 1 and op_date != trunc(sysdate); end loop; --фиксируем завершение --снова помещаяем общее время и время ЦПУ в переменные select t.hsecs ,dbms_utility.get_cpu_time into v_t2 ,v_cpu2 from v$timer t; --считаем общее время выполнения в сотых долях секунды v_t_res := v_t2 - v_t1; --считаем общее время ЦПУ в сотых долях секунды v_cpu_res := v_cpu2 - v_cpu1; --выводим результат на экран dbms_output.put_line('Общее время выполнения в секундах: '||to_char(v_t_res/100,'0.00')); dbms_output.put_line('Общее время ЦПУ в секундах: '||to_char(v_cpu_res/100,'0.00')); --откатим изменения rollback; end;Результат:
Статистика
Получение статистики по одному запросу
-
Запускаем нужный скрипт, например, изменим ранее сгенерированные данные:
Создание представления для быстрого доступа к данным
Для быстрого доступа к данным, соединим все ранее представленные скрипты по выводу данных по статистки, времени ЦПУ, общему времени и "упакуем" полученный запрос в представление. Вот как это будет выглядеть:
После создания VIEW, чтобы получить информацию достаточно выполнить простой запрос:
Создание процедуры фиксации статистики
До и после выполнения наших скриптов, нам нужно записывать данные "до" запуска и "после", будем записать результаты с помощью процедуры ниже:
Пояснение отдельных частей кода:
Строка | Описание |
---|---|
p_script_num in char | первый входной параметр, предназначен для определения номера тестируемого скрипта |
p_run_type in stats_tbl.run_type%type | второй входной параметр, принимает на вход два значения "before" или "after", тут если мы фиксируем статистику до перед выполнением скрипта указываем "before", если после то соответственно "after" |
inf_type varchar2(15 char), | для указания типа информации т.е. мы умеем собирать статистику, измерять время ЦПУ и общее время, т.е. 3 разных типа информации, в будущем типы будут добавляться |
pragma autonomous_transaction; | процедура будет транзакцией, внутри основной транзакции, например, в рамках теста мы сделали update строк и в конце нужно будет отменить изменения, но данные по статистике должны сохраниться |
select row_number() over(partition by name, run_type order by s.id desc) rn | это для удаления дублей от запусков, например запустим два раза процедуру с параметром "after", будут дублироваться данные, эта функция группирует такие строки и проставляет номера, 1-самая актуальная, 2 - старее. |
or run_type = 'final'||p_script_num | это условие, чтобы не дублировались финальные данные |
on commit preserve rows; | Временные таблицы хранят данные в течение транзакции или в течение сессии, тут указывается, что хранить нужно в течение сессии |
Запустим программу (если будут ошибки, пишите в комментариях), пока результат мы не увидим, но статистику уже запишем:
--тест скрипта №1 begin --фиксируем начало работы fix_inf_prc(1,'before'); --скрипт №1 for rec in 1..100 loop update operation set op_date = trunc(sysdate) where rownum = 1 and op_date != trunc(sysdate); end loop; --фиксируем завершение работы fix_inf_prc(1,'after'); rollback; end; --тест скрипта №2 begin --фиксируем начало работы fix_inf_prc(2,'before'); --скрипт №2 for rec in 1..1000 --увеличим количесто циклов loop update operation set op_date = trunc(sysdate) where rownum = 1 and op_date != trunc(sysdate); end loop; --фиксируем завершение работы fix_inf_prc(2,'after'); rollback; end;Вывод результатов
Вывод статистики скриптом
Сразу обернем такой селект в VIEW для дальнейшего использования и расширения, также для лучшей читаемости, добавим форматирование для числа, чтобы тысячные доли разделялись запятыми:
Запускаем созданный VIEW, по желанию добавляем фильтры и сортируем:
select * from stats_report_vw where abs(diff) > 1 --фильтр по полю diff and name like '%ime%' --фильтр по полю name order by abs(diff);Результат:
Вывод статистики через dbms_output
Создадим процедуру stats_report_prc и на вход будем подавать два фильтра, плюс я выведу отдельно от таблицы со статисткой показатели времени и буду выводить их в секундах:
create or replace procedure stats_report_prc (p_diff_count in number default 0, p_like_name in varchar2 default null, p_sort_field_num in number default 4) is begin --выводим статистику dbms_output.put_line(rpad('Name', 30) || lpad('Run1', 16) || lpad('Run2', 16) || lpad('Diff', 16)); for rec in (select s.name, to_char(s.script1, '999G999G999G999') script1, to_char(s.script2, '999G999G999G999') script2, to_char(s.diff, '999G999G999G999') diff from stats_report_vw s where s.name not like '%TIME. %' --исключаем ETIME, CTIME and abs(s.diff) > p_diff_count --фильтр по величине отличий and (p_like_name is null or lower(s.name) like lower('%'|| p_like_name ||'%')) --фильтр по имени order by p_sort_field_num) loop dbms_output.put_line(rpad(rec.name, 30) || lpad(rec.script1, 16) || lpad(rec.script2, 16) || lpad(rec.diff, 16)); end loop; --добавим отступ dbms_output.put_line(chr(9)); --выводим данные о времени dbms_output.put_line(rpad('Name', 30) || lpad('Run1 (sec)', 16) || lpad('Run2 (sec)', 16) || lpad('Diff (sec)', 16)); for rec in (select s.name, rtrim(to_char(s.script1/100, 'FM999999999999990.99999'), '.') script1, rtrim(to_char(s.script2/100, 'FM999999999999990.99999'), '.') script2, rtrim(to_char(s.diff/100, 'FM999999999999990.99999'), '.') diff from stats_report_vw s where s.name like '%TIME. %') --выводим только ETIME, CTIME loop dbms_output.put_line(rpad(rec.name, 30) || lpad(rec.script1, 16) || lpad(rec.script2, 16) || lpad(rec.diff, 16)); end loop; end;Запустим отчет и посмотрим что получилось:
set serveroutput on; begin stats_report_prc(1); -- выдодить где разница больше 1 end;Результат:
Привет! Меня зовут Александра, я работаю в команде тестирования производительности. В этой статье расскажу базовые сведения об OEM от Oracle. Статья будет полезна для тех, кто только знакомится с платформой, но и не только для них. Основная цель статьи — помочь провести быстрый анализ производительности БД и поиск отправных точек для более глубокого анализа.
OEM (Oracle Enterprise Manager) — платформа для управления БД. OEM предоставляет графический интерфейс для выполнения большого количества операций с базами данных: резервное копирование, просмотр аварийных журналов, графиков производительности.
Performance Home
На вкладке Performance Home можно увидеть основные графики утилизации БД.
Average Runnable Process
Этот график дает общее понимание использования CPU.
№ | Показатель | Описание |
---|---|---|
1 | Instance Foreground CPU | Отображает утилизацию CPU процессами текущего инстанса, напрямую запущенными клиентом, например выполнение запросов. Список событий ожидания текущего инстанса можно посмотреть в AWR-отчете |
2 | Instance Background CPU | Отображает утилизацию CPU фоновыми процессами текущего инстанса, например LGWR. Список событий фонового процесса текущего инстанса можно посмотреть в AWR-отчете или в официальной документации Oracle |
3 | Non-database Host CPU | Отображает утилизацию CPU процессами, не относящимися к текущему инстансу |
4 | Load Average | Отображает среднюю длину очереди процессов, ожидающих выполнения |
5 | CPU Treads/CPU Cores | Отображает лимит максимально возможного использования CPU |
Average Active Sessions
- Если зафиксирован рост активных сессий, то должна расти пропускная способность (график Throughput).
- Если Active Sessions превышает CPU Cores/CPU Threads, это свидетельствует о проблемах производительности.
- Если зафиксирован рост времени отклика операций, но при этом активные сессии не превышают CPU, это значит, что узкое место не в CPU и нужно более детально смотреть, по каким классам события ожидания фиксируется рост, после чего можно на графике нажать на соответствующий класс и провалиться глубже в детализацию (откроется отчет ASH — Active Session History).
Throughput
Раздел Throughput отображает пропускную способность. Пропускная способность базы данных измеряет объем работы, которую база данных выполняет за единицу времени.
Пики на графике Throughput должны соответствовать пикам на графике Average Active Sessions. Если заметен рост времени ожидания, необходимо убедиться, что увеличивается пропускная способность. Если пропускная способность низкая, а время ожидания растет — необходимо изменить настройки БД.
Latency показывает задержку чтения блоков. Это разница между временем выполнения чтения и временем обработки чтения БД. Показатель должен стремиться к нулю.
Оптимальным считается значение до 10 мс. Этот график — основной показатель производительности в этом блоке. Если зафиксирован рост времени задержки, нужно посмотреть, не растет ли количество I/O операций и их вес, также на рост Latency может влиять утилизация CPU.
Статистику по I/O можно смотреть в разрезе функций, в разрезе типов и в разрезе групп потребителей ресурсов (группы пользователей). Для этого на графике необходимо выбрать соответствующий Breakdown. Графики показывают количество I/O-операций в секунду и их вес в разрезе выбранного значения Breakdown. Для большей детализации можно провалиться глубже в статистику, выбрав соответствующее значение на графике или в легенде, и посмотреть статистику именно по выбранному значению.
I/O Function
График дает представление об уровне утилизации диска приложениями или джобами. То есть на графике можно увидеть, какие процессы больше всего читали и писали за определенный период.
Можно выделить следующие категории:
№ | Категория | Описание |
---|---|---|
1 | Фоновые процессы | Включают в себя ARCH, LGWR, DBWR (полный список фоновых процессов есть в документации) |
2 | Активность | XML DB, Streams AQ, Data Pump, Recovery, RMAN |
3 | Тип I/O | Включает прямую запись и чтение (в том числе чтение из кэша) |
4 | Другое | Включает операции ввода/вывода управляющих файлов |
I/O Type
Выводит статистику по тяжести операций ввода-вывода. Маленькими считаются операции, которые обрабатывают до 128 КБ. К большим операциям ввода-вывода относятся: сканирование таблиц и индексов, прямая загрузка данных, резервное копирование, восстановление и архивирование.
Consumer group
Дает представление об утилизации диска в разрезе групп пользователей: показывает, какая группа пользователей выполняет операции чтения и записи в определенный период. Включает в себя фоновые процессы.
Parallel Executions
Раздел дает представление о показателях, связанных с параллельным выполнением запросов. Параллельный запрос делится на несколько процессов для ускорения выполнения запроса. Параллельное выполнение полезно при выполнении тяжелых запросов. Подробнее можно прочесть в официальной документации Oracle.
Services
Службы на этом графике представляют собой группы приложений. Отображаются только сессии активных служб, находящиеся в ожидании в определенный момент времени. Например, служба SYS$USERS — это установка пользовательского сеанса.
ASH Report
ASH Report (Active Session History) дает более подробную информацию по потреблению ресурсов. Чтобы перейти к графику, в меню Performance нужно выбрать пункт Performance Hub/ASH Report. Также перейти к ASH Report можно при выборе класса события ожидания на графике Average Active Session.
- События ожидания и группы событий ожидания.
- Группы пользователей, пользователи, сервисы, инстансы.
- SQL-запросы.
AWR (Automatic Workload Repository) дает подробную информацию о процессах, происходящих с БД в определенный период. Для построения AWR-отчета нужно выбрать пункт меню Performance/AWR/AWR Report. Также есть возможность сравнивать два временных промежутка. Для этого нужно выбрать пункт меню Performance/AWR/Compare Period Report.
Ниже будут описаны наиболее показательные разделы AWR-отчета, описание остальных разделов можно поискать в официальной документации.
Load Profile
Здесь отображается общая информация по тому, как была загружена БД за выбранный период.
№ | Параметр | Описание |
---|---|---|
1 | DB Time(s) | Сумма времени утилизации процессора и время ожидания (без простоя) |
2 | DB CPU(s) | Нагрузка на процессор |
3 | Background CPU(s) | Загрузка процессора фоновыми задачами |
4 | Redo size | Объем чтения |
5 | Logical reads | Среднее количество логических чтений блоков |
6 | Block changes | Среднее значение измененных блоков |
7 | Physical reads | Физическое чтение в блоках |
8 | Physical writes | Количество записей в блоках |
9 | Read I/O requests | Количество чтений |
10 | Write I/O requests | Количество записей |
11 | Read I/O (MB) | Объем чтения |
12 | Write I/O (MB) | Объем записей |
13 | IM scan rows | Количество строк в In-Memory Compression Units (IMCU), которые были доступны |
14 | Session Logical Read IM | Чтения в In-Memory |
15 | User calls | Пользовательские вызовы |
16 | Parses | Разборы |
17 | Logons | Количество входов |
18 | Excecutes | Количество вызовов |
19 | Rollback | Количество откатов данных |
20 | Transacions | Количество транзакций |
Instance Efficiency Percentages
№ | Показатель | Критерии |
---|---|---|
1 | Buffer nowait | Если показатель меньше 95%, значит, буферы data block buffer используются неправильно. Возможно, нужно увеличить data block buffer size |
2 | Buffer Hit | Если показатель меньше 95%, значит, буферы data block buffer используются неправильно. Возможно, нужно увеличить data block buffer size |
3 | Library cache hit | Если показатель меньше 95% — нужно расширять shared pool (либо причина в bind-переменных) |
4 | Redo NOWAIT | Если показатель меньше 95%, это говорит о проблеме в redo log buffer или redo log |
5 | Parse CPU to Parse Elapsd | Показатель должен быть больше или равен 90%, тогда большинство процессов не ожидает ресурсов, что говорит о правильной работе базы данных |
6 | Non-Parse CPU | Показатель должен приближаться к 100%, это значит, что большинство ресурсов CP используется в различных операциях, кроме parsing, что говорит о правильной работе базы данных. Если Non-Parse CPU низкий, значит, база много времени тратит на разбор запроса вместо реальной работы |
7 | In-memory sort | Значение меньше 100 говорит о том, что сортировка идет через диск, а также есть потенциальные проблемы с PGA_AGGREGATE_TARGET,SORT_AREA_SIZE,HASH_AREA_SIZE и bitmap setting |
8 | Soft Parse | Чем он выше, тем меньше у нас Hard Parse |
9 | Latch Hit | Чем он выше, тем меньше мы ждем Latches (если он низкий — у нас проблемы с CPU-Bound и Latches) |
Top 10 Foreground Events by Total Wait Time
В разделе находится топ-10 событий, которые ожидали ресурсов дольше остальных.
При анализе необходимо обратить внимание на класс события ожидания. Если wait class System I/O, User I/O или Other, это нормально для БД. Если класс события ожидания Concurrency, это может свидетельствовать о проблемах.
Классы события ожидания можно посмотреть в разделе Wait Classes by Total Wait Time. В разделе находится статистика по классам события ожидания с сортировкой по времени ожидания.
Описание некоторых событий ожидания:
№ | Событие ожидания | Описание |
---|---|---|
1 | DB CPU | Отображает процессорное время, затраченное на пользовательские операции над БД. Это событие должно находиться на первом месте списка |
2 | db file sequential read | Метрика сигнализирует, что пользовательский процесс не находит нужный блок в buffer cache, загружает его с диска в SGA и ждет физического ввода/вывода |
3 | db file scattered read | Указывает на проблему с фулл-сканами, возможно, нужны индексы |
4 | read by other session | Может говорить о том, что размер блока слишком большой или задержка (latency) слишком большая |
5 | enq TX – row lock contention | Событие возникает при ожидании блокировки строки для дальнейшей ее модификации DML-запросом. Если показатель больше 10%, необходимо разбираться в причинах. Более детальную информацию можно посмотреть в разделе Segments by Row Lock Waits, в котором есть сведения о том, какие таблицы были заблокированы и какими запросами |
6 | DB FILE SEQUENTIAL READ | Если среднее значение параметра больше 100 мс, это может свидетельствовать о том, что диск работает медленно |
7 | LOG FILE SYNC | Значение AVG WAIT более 20 мс может свидетельствовать о проблемах |
8 | DB FILE SCATTERED READ | Если это событие выполняется — возможно, имеет смысл создать дополнительные индексы. Для более подробной информации нужно перейти к разделу Segments By Physical Read, в котором находится информация по таблицам и индексам, в которых происходит физическое чтение |
9 | direct path read temp ИЛИ direct path write temp | Эти события дают информацию по использованию временных файлов |
10 | Buffer Busy Wait | Событие указывает на то, что несколько процессов пытаются обратиться к одному блоку памяти, то есть пока первый процесс работает с конкретным блоком памяти, остальные процессы находятся в статусе ожидания |
Host CPU и Instance CPU
Здесь стоит обратить внимание на %Idle и %Total CPU. Если показатель %Idle низкий, а %Total CPU высокий, это может свидетельствовать о том, что процессор является узким местом.
Foreground Wait Class, Foreground Wait events и Background Wait Events
Показывают классы и события, которые провели в ожидании большего всего. Foreground Wait events дополняет информацию раздела Top 10 Foreground Events By Total Wait Time. Background Wait Events показывает детализацию по событиям ожидания фоновых процессов.
SQL statistics
Раздел содержит несколько таблиц со статистикой по SQL-запросам, отсортированным по определенному критерию.
Подробнее про оптимизацию запросов и примеры типичных проблем в запросах можно почитать в статье Проактивная оптимизация производительности БД Oracle.
№ | Параметр | Описание |
---|---|---|
1 | SQL ordered by Elapsed Time | Топ SQL-запросов по затраченному времени на их выполнение |
2 | SQL ordered by CPU Time | Топ SQL-запросов по процессорному времени |
3 | SQL ordered by User I/O Wait Time | Топ SQL-запросов по времени ожидания ввода/вывода для пользователя |
4 | SQL ordered by Gets | Запросы к БД, упорядоченные по убыванию логических операций ввода/вывода. При анализе стоит учитывать, что для PL/SQL-процедур их количество прочитанных Buffer Gets будет состоять из суммы всех запросов в рамках этой процедуры |
5 | SQL ordered by Reads | Этот раздел схож с предыдущим: в нем указываются все операции ввода/вывода, наиболее активно физически считывающие данные с жесткого диска. Именно на эти запросы и процессы надо обратить внимание, если система не справляется с объемом ввода/вывода |
6 | SQL ordered by Physical Reads (UnOptimized) | В этом разделе выводятся неоптимизированные запросы. В Oracle неоптимизированными считаются все запросы, которые не обслуживаются DSFC или Exadata Cell Smart Flash Cache (ECSFC) |
7 | SQL ordered by Executions | Наиболее часто выполняемые запросы |
8 | SQL ordered by Parse Calls | Отображает количество попыток разбора SQL-запросов до его выполнения |
9 | SQL ordered by Sharable Memory | Запросы, занимающие больший объем памяти общего пула SGA |
10 | SQL ordered by Version Count | Здесь показано количество SQL-операторов экземпляров одного и того же оператора в разделяемом пуле |
11 | Complete List of SQL Text | Показывает полный SQL-запрос, не только его хэш. В этой таблице можно найти неоптимальные запросы (например, запросы по всем столбцам таблицы «select * from. », запросы с большим количеством «like» и т. п.) |
Active Session History (ASH) Report
В данной таблице находятся самые тяжелые SQL запросы, на которые приходится наибольший процент активности и наибольшее время ожидания.
В таблице содержится статистика по запросам, на которые приходится наибольший процент выборочной активности и подробная информация о их плане выполнения. Вы можете использовать эту информацию, чтобы определить, какая часть выполнения SQL операторов значительно повлияла на затраченное время SQL оператора.
Читайте также: