Oracle: есть ли инструмент для отслеживания запросов, например Profiler for sql server?

Я работаю с сервером sql, но я должен перейти к приложению с Oracle DB. для отслеживания моих запросов приложений, в Sql Server я использую замечательный инструмент Profiler. есть ли что-то эквивалентное для Oracle?

Ответ 1

Вы можете использовать Oracle Enterprise Manager для мониторинга активных сеансов, выполнения запроса, его плана выполнения, блокировок, некоторых статистических данных и даже индикатора выполнения для более длительных задач.

См.: http://download.oracle.com/docs/cd/B10501_01/em.920/a96674/db_admin.htm#1013955

Перейдите в Экземпляр → сеансы и просмотрите вкладку SQL каждого сеанса.

Есть и другие способы. Администратор предприятия просто ставит с хорошими цветами то, что уже доступно в виде спецпредложений, подобных тем, которые описаны здесь: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage

И, конечно, вы также можете использовать инструмент Explain PLAN FOR, TRACE и множество других способов инструментализации. В менеджере предприятия есть несколько отчетов для самых дорогостоящих SQL-запросов. Вы также можете искать последние запросы, хранящиеся в кеше.

Ответ 2

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' 

- Узнайте, сколько сид и серийный номер сессии вам интересны:

 select sid, serial# from v$session
 where ...your_search_params...

--you может начать трассировку с событием 10046, четвертый параметр устанавливает уровень трассировки (12 - самый большой):

 begin
    sys.dbms_system.set_ev(sid, serial#, 10046, 12, '');
 end;

--turn отключить трассировку с нулевым уровнем установки:

begin
   sys.dbms_system.set_ev(sid, serial#, 10046, 0, '');
end;

/* возможные уровни: 0 - выключено 1 - минимальный уровень. Подобно набору sql_trace = true 4 - значения переменных привязки добавляются в файл трассировки 8 - добавляются ожидания 12 - добавляются значения привязки переменных и события ожидания */

--same, если вы хотите трассировать свою сессию с большим уровнем:

alter session set events '10046 trace name context forever, level 12';

--turn выключен:

alter session set events '10046 trace name context off';

--file с необработанной информацией о трассировке:

 select value from v$parameter p
 where name='user_dump_dest'

--name файла (*. Trc) будет содержать spid:

 select p.spid from v$session s, v$process p
 where s.paddr=p.addr
 and ...your_search_params...

--also вы можете установить имя самостоятельно:

alter session set tracefile_identifier='UniqueString'; 

--finally, используйте 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>

--to посмотреть состояние использования файла трассировки:

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 Оригинал более полный, но в любом случае это лучше, чем другие, опубликованные IMHO

Ответ 3

Я нашел простое решение

Шаг1. подключиться к БД с помощью пользователя-администратора, используя PLSQL или sqldeveloper или любой другой интерфейс запросов

Step2. запустите script ниже; в столбце 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 и его порядок, не используя какой-либо конкретный инструмент.

Ответ 4

Видя, как я только что проголосовал за недавний вопрос как дубликат и указал в этом направлении.,.

Еще пара - в SQL * Plus - SET AUTOTRACE ON - предоставит план объяснения и статистику для каждого выполненного оператора.

TOAD также позволяет профилировать на стороне клиента.

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

Еще один важный для понимания - моментальные снимки Statspack - это хороший способ взглянуть на производительность базы данных в целом. Объясните план и т.д., Хорошо разбираются в отдельных операторах SQL, которые являются узкими местами. Statspack хорошо идентифицирует тот факт, что ваша проблема заключается в том, что простое выражение с хорошим планом выполнения называется 1 миллион раз в минуту.

Ответ 5

GI Oracle Profiler v1.2

Это инструмент для Oracle для захвата запросов, выполненных аналогично SQL Server Profiler. Незаменимый инструмент для обслуживания приложений, использующих этот сервер базы данных.

вы можете скачать его с официального сайта iacosoft.com

Ответ 7

Попробуйте PL/SQL Developer, он имеет удобный пользовательский интерфейс GUI для профилировщика. Это довольно приятно дать пробную попытку. Клянусь этим инструментом при работе с базами данных Oracle.

http://www.allroundautomations.com/plsqldev.html?gclid=CM6pz8e04p0CFQjyDAodNXqPDw

Ответ 8

Catch - это захват всех 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 break on 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
/

Ответ 9

Oracle вместе с другими базами данных анализирует данный запрос для создания плана выполнения. Этот план является наиболее эффективным способом получения данных.

Oracle предоставляет оператор explain plan, который анализирует запрос, но не запускает его, вместо этого заполняет специальную таблицу, которую вы можете запросить (таблица плана).

Синтаксис (простая версия, есть другие параметры, такие как отметка строк в таблице плана со специальным идентификатором или использование другой таблицы планов):

explain plan for <sql query>

Анализ этих данных оставлен для другого вопроса или ваших дальнейших исследований.

Ответ 10

Существует коммерческий инструмент FlexTracer, который может использоваться для отслеживания запросов Oracle SQL

Ответ 11

Это документ Oracle, объясняющий, как отслеживать SQL-запросы, в том числе несколько инструментов (SQL Trace и tkprof)

ссылка

Ответ 12

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

В следующей статье описывается несколько. Есть, вероятно, еще десятки... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm