Eu gosto de obter as últimas instruções executadas no meu banco de dados, juntamente com os indicadores de desempenho.
Como tal, eu gosto de saber quais instruções SQL foram mais intensivas em CPU / DISK.
Eu gosto de obter as últimas instruções executadas no meu banco de dados, juntamente com os indicadores de desempenho.
Como tal, eu gosto de saber quais instruções SQL foram mais intensivas em CPU / DISK.
Respostas:
Aqui está o SQL para fazer o trabalho. Aberto para julgamento.
Etapa 1: Determine os IDs de instalação e de usuário.
SELECT inst_id,sid FROM gv$session WHERE username='<ENTER-USERNAME>';
Passo 2:
SELECT
s.sid
,s.CLIENT_INFO
,s.MACHINE
,s.PROGRAM
,s.TYPE
,s.logon_time
,s.osuser
,sq.sorts
,sq.DISK_READS
,sq.BUFFER_GETS
,sq.ROWS_PROCESSED
,sq.SQLTYPE
,sq.SQL_TEXT
FROM gv$session s
, gv$sql sq
WHERE s.SQL_HASH_VALUE = sq.HASH_VALUE
AND s.inst_id = :inst_id -- replace with instID from above
AND s.sid = :sid -- replace with ID from above
AND sq.inst_id = s.inst_id
Pode haver vários IDs e IDs de instância retornados. Portanto, cabe aos usuários a escolha de como usar esses dados em uma interface da web etc.
in
operador com tuplas, de modo do exemplo acima... AND (s.inst_id, s.sid) in ( (:id1, :sid1), (:id2, :sid2), ... )
O console do Oracles Enterprise Monitor mostra uma grande quantidade de informações sobre quais consultas SQL estão levando a CPU máxima, gargalos, atividade principal no banco de dados, bloqueando SQLs et al.
Para uma abordagem histórica, você pode usar os relatórios AWR do Oracle para definir áreas pontuais a seu respeito.
Você também pode usar V$SQL
, existem várias colunas interessantes RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXT
etc.
Isso daria as 10 principais instruções por leitura de disco (nota - isso é cumulativo para todas as execuções):
select sql_id,child_number from
(
select sql_id,child_number from v$sql
order by disk_reads desc
)
where rownum<11
Se a instrução ainda estiver em, V$SQL_PLAN
é possível obter um plano de explicação real para a consulta:
select * from table(dbms_xplan.display_cursor('sql_id',child_number));
Também gosto de usar V$SQL_PLAN
, pois contém boas informações. Se statistics_level=ALL
você pode usar V$SQL_PLAN_STATISTICS
.