Oracle: existe uma ferramenta para rastrear consultas, como o Profiler para sql server? [fechadas]

84

eu trabalho com sql server, mas devo migrar para um aplicativo com banco de dados Oracle. para rastrear minhas consultas de aplicativos, no Sql Server eu uso a ferramenta Profiler maravilhosa. existe algo equivalente para Oracle?

Stefano m
fonte
38
Por que você aceitou uma resposta errada? Explique o plano NÃO faz o que o criador de perfil faz. É totalmente independente.
Jasmine
1
você achou a melhor ferramenta como sql server profiler? O que você está usando agora?
Shahid Ghafoor
Escrevi um livro sobre rastreamento de aplicativos Oracle. Ele está disponível em formato PDF em method-r.com .
Cary Millsap
Por favor, verifique o oracle profiler em dbForge Studio for Oracle da Devart.
Devart
Muitas respostas abaixo, mas estranhamente ninguém mencionou nenhum dos dois profilers da Oracle para PL / SQL: DBMS_PROFILER(básico e limitado, mas superconveniente) ou DBMS_HPROF(mais preciso, mas requer mais configuração). No entanto, não conheço o SQL Server, então é possível que ele tenha um conceito diferente de criação de perfil do que qualquer um dos pacotes Oracle e o que você quer é mais parecido com rastreamento no Oracle.
William Robertson

Respostas:

22

Você pode usar o Oracle Enterprise Manager para monitorar as sessões ativas, com a consulta que está sendo executada, seu plano de execução, bloqueios, algumas estatísticas e até uma barra de progresso para as tarefas mais longas.

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

Vá para Instância -> sessões e observe a guia SQL de cada sessão.

Existem outras maneiras. O gerenciador empresarial apenas coloca com cores bonitas o que já está disponível em visualizações especiais como as documentadas aqui: http://www.oracle.com/pls/db92/db92.catalog_views?remark=homepage

E, claro, você também pode usar a ferramenta Explain PLAN FOR, TRACE e muitas outras formas de instrumentalização. Existem alguns relatórios no gerenciador corporativo para as consultas SQL mais caras. Você também pode pesquisar consultas recentes mantidas no cache.

Borjab
fonte
17

Eu encontrei uma solução fácil

Passo 1. conectar ao banco de dados com um usuário administrador usando PLSQL ou sqldeveloper ou qualquer outra interface de consulta

Passo 2. execute o script abaixo; na coluna S.SQL_TEXT, você verá as consultas executadas

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;

O único problema com isso é que não consigo encontrar uma maneira de mostrar os valores dos parâmetros de entrada (para chamadas de função), mas pelo menos podemos ver o que é executado no Oracle e a ordem dele sem usar uma ferramenta específica.

sergiu
fonte
2
Você pode adicionar S.SQL_FULLTEXT se o texto da consulta tiver mais de 1000 caracteres, pois SQL_TEXT é cortado nesse ponto.
Tridus
2
Você não deve fazer o pedido até LAST_ACTIVE_TIME porque é VARCHAR2 (19). Em vez disso, use: ORDER BY TO_DATE (S.LAST_LOAD_TIME, 'AAAA-MM-DD / HH24: MI: SS') desc
Igor Krupitsky
1
ORA-00942: tabela ou visão não existe 00942. 00000 - "tabela ou visão não existe" * Causa: * Ação: Erro na Linha: 11 Coluna: 6 Isso significa que não tenho previlégio de administrador?
toha
Isso não inclui valores de parâmetros. se você quiser ter isso também, dê uma olhada em: stackoverflow.com/a/14217618/6339469
HamedH
16
alter system set timed_statistics=true

--ou

alter session set timed_statistics=true --if want to trace your own session

- deve ser grande o suficiente:

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

- Descubra o número secundário e de série da sessão de seu interesse:

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

- você pode começar o rastreamento com 10046 eventos, o quarto parâmetro define o nível de rastreamento (12 é o maior):

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

--desligue o rastreio com a definição do nível zero:

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

/ * níveis possíveis: 0 - desligado 1 - nível mínimo. Muito parecido com set sql_trace = true 4 - valores de variáveis ​​de ligação são adicionados ao arquivo de rastreamento 8 - esperas são adicionadas 12 - ambos os valores de variáveis ​​de ligação e eventos de espera são adicionados * /

--mesmo se você quiser rastrear sua própria sessão com um nível maior:

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

--desligar:

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

- o arquivo com informações de rastreamento brutas será localizado:

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

--name do arquivo (*. trc) conterá spid:

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

--também você pode definir o nome sozinho:

alter session set tracefile_identifier='UniqueString'; 

--finalmente, use TKPROFpara tornar o arquivo de rastreamento mais legível:

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>

- para ver o estado de uso do arquivo de rastreamento:

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;
/

Apenas traduzido http://www.sql.ru/faq/faq_topic.aspx?fid=389 Original é mais completo, mas de qualquer forma é melhor do que o que outros postaram IMHO

q3kep
fonte
Muito mais útil do que as outras respostas!
Andomar
Muito complicado. Ninguém vai usar.
ADM-IT
7

GI Oracle Profiler v1.2

É uma ferramenta para Oracle para capturar consultas executadas de forma semelhante ao SQL Server Profiler. Ferramenta indispensável para a manutenção das aplicações que utilizam este servidor de banco de dados.

você pode baixá-lo do site oficial iacosoft.com

pio
fonte
Olá, você precisa de uma licença especial da ORACLE para usar este software? Eu sei que o Oracle permite que você interaja com certas tabelas / visualizações, e se você fizer isso e não tiver uma licença para isso, eles cobram uma taxa extra.
sergiu
2
Olá, você tem que pagar para consultar v $ sqlarea? Posso entrar no link que diz o quê?
pio
excelente obrigado cara !!! Você me poupa muito trabalho
Hernaldo Gonzalez
Se minha consulta falhar, ela não será exibida pelo criador de perfil.
ADM-IT
5

Visto que acabei de votar uma questão recente como uma duplicata e apontei nesta direção. . .

Mais alguns - em SQL * Plus - SET AUTOTRACE ON - fornecerão o plano de explicação e estatísticas para cada instrução executada.

O TOAD também permite a criação de perfis do lado do cliente.

A desvantagem de ambos é que eles apenas informam o plano de execução da instrução, mas não como o otimizador chegou a esse plano - para isso, você precisará de rastreio do lado do servidor de nível inferior.

Outro ponto importante para entender são os instantâneos do Statspack - eles são uma boa maneira de observar o desempenho do banco de dados como um todo. Plano de explicação, etc, são bons para localizar instruções SQL individuais que são gargalos. O Statspack é bom em identificar o fato de que seu problema é que uma instrução simples com um bom plano de execução está sendo chamada 1 milhão de vezes por minuto.

JulesLt
fonte
3

A captura é capturar todo o SQL executado entre dois pontos no tempo. Assim como o SQL Server também faz.

Existem situações em que é útil capturar o SQL que um determinado usuário está executando no banco de dados. Normalmente, você simplesmente ativaria o rastreamento de sessão para esse usuário, mas há dois problemas potenciais com essa abordagem.

  1. A primeira é que muitos aplicativos baseados na web mantêm um pool de conexões de banco de dados persistentes que são compartilhadas entre vários usuários.
  2. A segunda é que alguns aplicativos se conectam, executam um pouco de SQL e se desconectam muito rapidamente, tornando complicado ativar o rastreamento de sessão (você pode, é claro, usar um gatilho de logon para ativar o rastreamento de sessão neste caso).

Uma solução rápida e suja para o problema é capturar todas as instruções SQL que são executadas entre dois pontos no tempo.

O procedimento a seguir criará duas tabelas, cada uma contendo um instantâneo do banco de dados em um ponto específico. As tabelas serão então consultadas para produzir uma lista de todos os SQL executados durante aquele período.

Se possível, você deve fazer isso em um sistema de desenvolvimento silencioso - caso contrário, você corre o risco de obter muitos dados de volta.

  1. Faça o primeiro instantâneo Execute o seguinte sql para criar o primeiro instantâneo:

    create table sql_exec_before as
    select executions,hash_value
    from v$sqlarea
    /
    
  2. Faça com que o usuário execute sua tarefa no aplicativo.

  3. Faça o segundo instantâneo.

    create table sql_exec_after as
    select executions, hash_value
    from v$sqlarea
    /
    
  4. Verifique os resultados Agora que você capturou o SQL, é hora de consultar os resultados.

Esta primeira consulta listará todos os hashes de consulta que foram executados:

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;
/

Este irá exibir o hash e o próprio SQL: definir páginas 999 linhas 100 quebra em 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. Arrume Não se esqueça de remover as tabelas de instantâneo assim que terminar:

drop table sql_exec_before
/

drop table sql_exec_after
/
JaMeEL
fonte
Obrigado por scripts completos que demonstram a técnica.
Roman Pokrovskij,
2

O Oracle, junto com outros bancos de dados, analisa uma determinada consulta para criar um plano de execução. Este plano é a maneira mais eficiente de recuperar os dados.

A Oracle fornece o 'explain plan instrução ' que analisa a consulta, mas não a executa; em vez disso, preenche uma tabela especial que você pode consultar (a tabela de plano).

A sintaxe (versão simples, existem outras opções, como marcar as linhas na tabela de plano com um ID especial ou usar uma tabela de plano diferente) é:

explain plan for <sql query>

A análise desses dados é deixada para outra questão, ou para suas pesquisas futuras.

paxdiablo
fonte
2

Existe uma ferramenta comercial FlexTracer que pode ser usada para rastrear consultas Oracle SQL

user449251
fonte
1

Este é um documento da Oracle que explica como rastrear consultas SQL, incluindo algumas ferramentas (SQL Trace e tkprof)

ligação

Traineira de código
fonte
1

Aparentemente, não existe um pequeno utilitário simples e barato que ajude a realizar essa tarefa. No entanto, existe uma maneira de fazer isso de uma maneira complicada e inconveniente.

O artigo a seguir descreve vários. Provavelmente existem dezenas de outros ... http://www.petefinnigan.com/ramblings/how_to_set_trace.htm

Nikola Radosavljević
fonte