Я работаю с сервером sql, но мне нужно перейти на приложение с Oracle DB. для отслеживания запросов моего приложения в Sql Server я использую замечательный инструмент Profiler. есть ли что-то эквивалентное для Oracle?
Oracle: есть ли инструмент для отслеживания запросов, например Profiler для сервера sql?
Ответы (11)
Вы можете использовать Oracle Enterprise Manager для мониторинга активных сеансов с выполняемым запросом, планом его выполнения, блокировками, некоторой статистикой и даже индикатором выполнения для более длинных задач.
См.: http://download.oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955
Перейдите в Экземпляр -> сеансы и просмотрите вкладку SQL для каждого сеанса.
Есть и другие способы. Enterprise Manager просто выделяет красивыми цветами то, что уже доступно в специальных представлениях, подобных описанным здесь: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage
И, конечно же, вы также можете использовать инструмент «Объяснение PLAN FOR», TRACE и множество других способов инструментализации. В менеджере предприятия есть несколько отчетов для самых дорогих SQL-запросов. Вы также можете искать последние запросы, хранящиеся в кеше.
Я нашел простое решение
Шаг 1. подключиться к БД с пользователем-администратором, используя PLSQL или sqldeveloper или любой другой интерфейс запросов
Шаг 2. запустите скрипт ниже; в столбце S.SQL_TEXT вы увидите выполненные запросы
SELECT
S.LAST_ACTIVE_TIME,
S.MODULE,
S.SQL_FULLTEXT,
S.SQL_PROFILE,
S.EXECUTIONS,
S.LAST_LOAD_TIME,
S.PARSING_USER_ID,
S.SERVICE
FROM
SYS.V_$SQL S,
SYS.ALL_USERS U
WHERE
S.PARSING_USER_ID=U.USER_ID
AND UPPER(U.USERNAME) IN ('oracle user name here')
ORDER BY TO_DATE(S.LAST_LOAD_TIME, 'YYYY-MM-DD/HH24:MI:SS') desc;
Единственная проблема заключается в том, что я не могу найти способ показать значения входных параметров (для вызовов функций), но, по крайней мере, мы можем видеть, что выполняется в Oracle, и порядок его выполнения без использования специального инструмента.
alter system set timed_statistics=true
--or
alter session set timed_statistics=true --if want to trace your own session
-- должен быть достаточно большим:
select value from v$parameter p
where name='max_dump_file_size'
-- Узнайте sid и серийный номер интересующей вас сессии:
select sid, serial# from v$session
where ...your_search_params...
--вы можете начать трассировку с события 10046, четвертый параметр задает уровень трассировки (12 самый большой):
begin
sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
end;
--отключить трассировку с установкой нулевого уровня:
begin
sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
end;
/*возможные уровни: 0 - выключено 1 - минимальный уровень. Аналогично set sql_trace=true 4 — значения переменных связывания добавляются в файл трассировки 8 — добавляются ожидания 12 — добавляются как значения переменных связывания, так и события ожидания */
--same, если вы хотите отслеживать свою сессию на более высоком уровне:
alter session set events '10046 trace name context forever, level 12';
--выключи:
alter session set events '10046 trace name context off';
--file с необработанной информацией о трассировке будет расположен:
select value from v$parameter p
where name='user_dump_dest'
--имя файла (*.trc) будет содержать spid:
select p.spid from v$session s, v$process p
where s.paddr=p.addr
and ...your_search_params...
--также вы можете установить имя самостоятельно:
alter session set tracefile_identifier='UniqueString';
--наконец, используйте TKPROF
, чтобы сделать файл трассировки более читаемым:
C:\ORACLE\admin\databaseSID\udump>
C:\ORACLE\admin\databaseSID\udump>tkprof my_trace_file.trc output=my_file.prf
TKPROF: Release 9.2.0.1.0 - Production on Wed Sep 22 18:05:00 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
C:\ORACLE\admin\databaseSID\udump>
--для просмотра состояния использования файла трассировки:
set serveroutput on size 30000;
declare
ALevel binary_integer;
begin
SYS.DBMS_SYSTEM.Read_Ev(10046, ALevel);
if ALevel = 0 then
DBMS_OUTPUT.Put_Line('sql_trace is off');
else
DBMS_OUTPUT.Put_Line('sql_trace is on');
end if;
end;
/
Просто вроде переведено http://www.sql.ru/faq/faq_topic.aspx?fid=389 Оригинал полнее, но в любом случае это лучше, чем то, что выложили другие ИМХО
Это инструменты для Oracle для захвата запросов, выполняемых аналогично профилировщику SQL Server. Незаменимый инструмент для обслуживания приложений, использующих этот сервер базы данных.
скачать его можно с официального сайта iacosoft.com
Попробуйте PL/SQL Developer, у него удобный графический интерфейс для профилировщика. Очень приятно попробовать пробную версию. Я клянусь этим инструментом при работе с базами данных Oracle.
http://www.allroundautomations.com/plsqldev.html?gclid=CM6pz8e04p0CFQjyDAodNXqPDw
Поскольку я только что проголосовал за недавний вопрос как за дубликат и указал в этом направлении. . .
Еще пара - в SQL * Plus - SET AUTOTRACE ON - даст план объяснения и статистику для каждого выполненного оператора.
TOAD также позволяет выполнять профилирование на стороне клиента.
Недостатком обоих из них является то, что они сообщают вам только план выполнения оператора, но не то, как оптимизатор пришел к этому плану - для этого вам потребуется трассировка на стороне сервера более низкого уровня.
Еще один важный момент — это моментальные снимки Statspack — это хороший способ взглянуть на производительность базы данных в целом. Объясните план и т. д., хорошо находят отдельные операторы SQL, которые являются узкими местами. Statspack хорошо определяет тот факт, что ваша проблема заключается в том, что простой оператор с хорошим планом выполнения вызывается 1 миллион раз в минуту.
Уловка — это захват всех SQL-запусков между двумя моментами времени. Как и SQL Server.
Бывают ситуации, когда полезно зафиксировать SQL, который конкретный пользователь выполняет в базе данных. Обычно вы просто включаете трассировку сеанса для этого пользователя, но при таком подходе есть две потенциальные проблемы.
- Во-первых, многие веб-приложения поддерживают пул постоянных подключений к базе данных, которые совместно используются несколькими пользователями.
- Во-вторых, некоторые приложения очень быстро подключаются, запускают SQL-запросы и отключаются, что затрудняет включение трассировки сеансов вообще (в этом случае вы, конечно, можете использовать триггер входа в систему, чтобы включить трассировку сеансов).
Быстрое и грязное решение проблемы состоит в том, чтобы захватить все операторы SQL, которые выполняются между двумя моментами времени.
Следующая процедура создаст две таблицы, каждая из которых будет содержать моментальный снимок базы данных в определенной точке. Затем таблицы будут запрошены для получения списка всех SQL, запущенных за этот период.
Если возможно, вы должны делать это в тихой системе разработки, иначе вы рискуете получить обратно слишком много данных.
Сделайте первый снимок. Запустите следующий sql, чтобы создать первый снимок:
create table sql_exec_before as select executions,hash_value from v$sqlarea /
Заставьте пользователя выполнять свою задачу в приложении.
Сделайте второй снимок.
create table sql_exec_after as select executions, hash_value from v$sqlarea /
Проверка результатов Теперь, когда вы записали SQL, пришло время запросить результаты.
Этот первый запрос выведет список всех хэшей запросов, которые были выполнены:
select aft.hash_value
from sql_exec_after aft
left outer join sql_exec_before bef
on aft.hash_value = bef.hash_value
where aft.executions > bef.executions
or bef.executions is null;
/
Этот будет отображать хеш и сам SQL: установите страницы 999 строк 100 разбить на hash_value
select hash_value, sql_text
from v$sqltext
where hash_value in (
select aft.hash_value
from sql_exec_after aft
left outer join sql_exec_before bef
on aft.hash_value = bef.hash_value
where aft.executions > bef.executions
or bef.executions is null;
)
order by
hash_value, piece
/
5. Приведение в порядок Не забудьте удалить таблицы моментальных снимков после того, как закончите:
drop table sql_exec_before
/
drop table sql_exec_after
/
Oracle, наряду с другими базами данных, анализирует заданный запрос для создания плана выполнения. Этот план является наиболее эффективным способом получения данных.
Oracle предоставляет оператор 'explain plan
', который анализирует запрос, но не выполняет его, а вместо этого заполняет специальную таблицу, к которой вы можете запросить (таблицу плана).
Синтаксис (упрощенная версия, есть и другие варианты, такие как пометка строк в таблице плана специальным идентификатором или использование другой таблицы плана):
explain plan for <sql query>
Анализ этих данных оставлен для другого вопроса или вашего дальнейшего исследования.
Существует коммерческий инструмент FlexTracer, который можно использовать для отслеживания запросов Oracle SQL.
Это документ Oracle, объясняющий, как отслеживать SQL-запросы, включая пару инструментов (SQL Trace и tkprof).
Судя по всему, нет маленькой простой дешевой утилиты, которая помогла бы выполнить эту задачу. Однако есть 101 способ сделать это сложным и неудобным способом.
Следующая статья описывает несколько. Наверняка есть еще десятки...
sql server profiler
? что вы используете сейчас? - person Shahid Ghafoor   schedule 18.09.2015DBMS_PROFILER
(базовый и ограниченный, но очень удобный) илиDBMS_HPROF
(точнее, но требует дополнительной настройки). Однако я не знаю SQL Server, поэтому, возможно, у него другая концепция профилирования, чем у любого из пакетов Oracle, и то, что вы хотите, больше похоже на трассировку в Oracle. - person William Robertson   schedule 26.07.2020