Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como ver a instrução real do Oracle SQL que está sendo executada


No lado do dicionário de dados, existem muitas ferramentas que você pode usar, como o Schema Spy

Para verificar quais consultas estão sendo executadas, observe as exibições sys.v_$sql e sys.v_$sqltext. Você também precisará de acesso a sys.all_users

Uma coisa a notar que as consultas que usam parâmetros aparecerão uma vez com entradas como
and TABLETYPE=’:b16’

enquanto outros que não aparecerão várias vezes, como:
and TABLETYPE=’MT’

Um exemplo dessas tabelas em ação é o SQL a seguir para localizar os 20 principais porcos de leitura de disco. Você pode alterar isso removendo o WHERE rownum <=20 e talvez adicionar o módulo ORDER BY . Muitas vezes você descobre que o módulo lhe dará uma pista sobre qual software está executando a consulta (por exemplo:"TOAD 9.0.1.8", "JDBC Thin Client", "[email protected] (TNS V1-V3)" etc)
SELECT 
 module, 
 sql_text, 
 username, 
 disk_reads_per_exec, 
 buffer_gets, 
 disk_reads, 
 parse_calls, 
 sorts, 
 executions, 
 rows_processed, 
 hit_ratio, 
 first_load_time, 
 sharable_mem, 
 persistent_mem, 
 runtime_mem, 
 cpu_time, 
 elapsed_time, 
 address, 
 hash_value 
FROM 
  (SELECT
   module, 
   sql_text , 
   u.username , 
   round((s.disk_reads/decode(s.executions,0,1, s.executions)),2)  disk_reads_per_exec, 
   s.disk_reads , 
   s.buffer_gets , 
   s.parse_calls , 
   s.sorts , 
   s.executions , 
   s.rows_processed , 
   100 - round(100 *  s.disk_reads/greatest(s.buffer_gets,1),2) hit_ratio, 
   s.first_load_time , 
   sharable_mem , 
   persistent_mem , 
   runtime_mem, 
   cpu_time, 
   elapsed_time, 
   address, 
   hash_value 
  FROM
   sys.v_$sql s, 
   sys.all_users u 
  WHERE
   s.parsing_user_id=u.user_id 
   and UPPER(u.username) not in ('SYS','SYSTEM') 
  ORDER BY
   4 desc) 
WHERE
 rownum <= 20;

Observe que se a consulta for longa .. você terá que consultar v_$sqltext. Isso armazena toda a consulta. Você terá que procurar o ADDRESS e HASH_VALUE e pegar todas as peças. Por exemplo:
SELECT
 *
FROM
 sys.v_$sqltext
WHERE
 address = 'C0000000372B3C28'
 and hash_value = '1272580459'
ORDER BY 
 address, hash_value, command_type, piece
;