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

86

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

Стефано м
источник
38
Почему вы приняли неправильный ответ? План объяснения НЕ делает того, что делает профилировщик. Это совершенно не связано.
Жасмин
1
вы нашли лучший инструмент sql server profiler? чем ты сейчас пользуешься?
Шахид Гафур
Я написал книгу о трассировке приложений Oracle. Он доступен в формате PDF на сайте method-r.com .
Кэри Миллсап,
Пожалуйста, ознакомьтесь с профилировщиком oracle в dbForge Studio для Oracle от Devart.
Devart
Ниже приведено множество ответов, но, как ни странно, никто не упомянул ни один из двух профилировщиков Oracle для PL / SQL: DBMS_PROFILER(базовый и ограниченный, но супер-удобный) или DBMS_HPROF(более точный, но требует дополнительной настройки). Однако я не знаю SQL Server, поэтому, возможно, он имеет другую концепцию профилирования, чем любой из пакетов Oracle, и то, что вам нужно, больше похоже на трассировку в Oracle.
Уильям Робертсон

Ответы:

22

Вы можете использовать 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-запросов. Вы также можете искать последние запросы, хранящиеся в кеше.

Borjab
источник
19

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

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

серджиу
источник
2
Вы можете добавить S.SQL_FULLTEXT, если текст запроса превышает 1000 символов, поскольку SQL_TEXT в этот момент обрезается.
Tridus
2
Не следует заказывать до LAST_ACTIVE_TIME, потому что это VARCHAR2 (19). Используйте вместо этого: ORDER BY TO_DATE (S.LAST_LOAD_TIME, 'YYYY-MM-DD / HH24: MI: SS') desc
Игорь Крупицкий
1
ORA-00942: таблица или представление не существует 00942. 00000 - «Таблица или представление не существует» * Причина: * Действие: Ошибка в строке: 11 Столбец: 6 Означает ли это, что у меня нет права администратора?
toha
Это не включает значения параметров. если вы тоже этого хотите, взгляните на: stackoverflow.com/a/14217618/6339469
HamedH
16
alter system set timed_statistics=true

--или же

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 - добавляются значения переменных связывания и события ожидания * /

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

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

--выключи:

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

- файл с необработанной информацией трассировки будет расположен:

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

q3kep
источник
Намного полезнее, чем другие ответы!
Andomar
Слишком сложно. Никто не будет его использовать.
ADM-IT
7

GI Oracle Profiler v1.2

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

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

пио
источник
Привет, вам нужна специальная лицензия от ORACLE для использования этого программного обеспечения? Я знаю, что Oracle позволяет вам взаимодействовать с определенными таблицами / представлениями, и если вы это делаете и у вас нет лицензии на это, они взимают с вас дополнительную плату.
sergiu
2
Привет, вам нужно заплатить за запрос v $ sqlarea? Я могу ввести ссылку, в которой написано что?
pio
отличное спасибо, чувак !!! Вы сэкономите мне много работы
Эрнальдо Гонсалес
Если мой запрос не выполняется, он не отображается профилировщиком.
ADM-IT
5

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

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

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

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

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

JulesLt
источник
3

Catch - это захват всех SQL-запросов между двумя точками времени. Как и SQL Server.

Бывают ситуации, когда полезно фиксировать SQL, который конкретный пользователь выполняет в базе данных. Обычно вы просто включаете трассировку сеанса для этого пользователя, но при таком подходе есть две потенциальные проблемы.

  1. Во-первых, многие веб-приложения поддерживают пул постоянных подключений к базе данных, которые совместно используются несколькими пользователями.
  2. Во-вторых, некоторые приложения подключаются, запускают некоторый SQL и очень быстро отключаются, что затрудняет включение трассировки сеанса вообще (вы, конечно, можете использовать триггер входа в систему для включения трассировки сеанса в этом случае).

Быстрое и грязное решение проблемы - захват всех операторов SQL, выполняемых между двумя точками времени.

Следующая процедура создаст две таблицы, каждая из которых содержит моментальный снимок базы данных в определенной точке. Затем будет произведен запрос к таблицам для создания списка всех выполненных SQL за этот период.

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

  1. Сделайте первый снимок Запустите следующий sql, чтобы создать первый снимок:

    create table sql_exec_before as
    select executions,hash_value
    from v$sqlarea
    /
    
  2. Заставьте пользователя выполнить свою задачу в приложении.

  3. Сделайте второй снимок.

    create table sql_exec_after as
    select executions, hash_value
    from v$sqlarea
    /
    
  4. Проверьте результаты. Теперь, когда вы захватили 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
/
JaMeEL
источник
Спасибо за полные сценарии, демонстрирующие эту технику.
Роман Покровский
2

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

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

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

explain plan for <sql query>

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

Paxdiablo
источник
2

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

user449251
источник
1

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

ссылка

Код Траулер
источник
1

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

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

Никола Радосавлевич
источник