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

Como descrever o problema de desempenho no banco de dados relacional?


Para banco de dados Oracle forneça esta informação:

Descreva os sintomas do problema

Descreva o comportamento que causa o problema. O comportamento da consulta é estável ou o problema ocorre apenas algumas vezes, com parâmetros específicos ou simples aleatórios. Você pode reproduzir esse comportamento em um IDE (por exemplo, SQL Developer)?

Descreva o ambiente

Defina a versão exata do Oracle
 select * from v$version

Descreva como você se conecta ao banco de dados:driver, ORM, linguagem de programação. Forneça nomes e/ou números de versão.

Descreva a consulta

Poste o texto da consulta. Tente simplificar - mostre um exemplo reproduzível mínimo .

Exemplo - sua consulta problemática une 10 tabelas. Verifique se você vê os mesmos sintomas em uma consulta com 9 ou 8 junções. Desça até ver os problemas e mostre apenas a consulta reduzida.

Sim, isso é caro, mas aumenta muito a chance de você receber suporte! Quanto menor a consulta, maior ela atrai os apoiadores.

Descreva o plano de execução

Para obter o plano de execução, execute esta instrução (substitua o texto da consulta)
 EXPLAIN PLAN  SET STATEMENT_ID = '<some_id>' into   plan_table  FOR
     select * from ....   -- your query here 
 ;

O plano de execução é armazenado em PLAN_TABLE , para vê-lo executar esta consulta
 SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', '<some_id>','ALL')); 

Mostrar o resultado completo (não apenas a tabela com o plano de execução). Extremamente importante pode ser a seção de predicados e as notas abaixo.

Exemplo para select * from dual where dummy = :1;
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1 / [email protected]$1

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("DUMMY"=:1)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "DUMMY"[VARCHAR2,1]

Não recorte e cole o resultado gráfico do seu plano de explicação do IDE.

Este plano de execução é o real que é executado?

Infelizmente nem sempre. Existem várias razões para a explicação plano de execução pode diferir do real.

Se você estiver em dúvida (especialmente quando você vê um bom plano, mas a consulta é ruim), você pode extrair o plano do cache do banco de dados fornecendo um SQL_ID .
 SELECT t.* FROM  table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t; 

O SQL_ID para uma consulta que está em execução no momento (ou estava em execução em breve e ainda está em cache) pode ser encontrado com correspondência de texto e/ou o usuário do banco de dados:
select sql_id, sql_fulltext from v$sql a where 
 lower(sql_text) like lower('%<some identifying part of the query text>%') 
  and parsing_schema_name = '<user running the query>';

Se você tiver licença AWR, poderá obter o plano de execução a partir daí, mesmo para consultas em execução no histórico.
SELECT t.*
FROM  table(DBMS_XPLAN.DISPLAY_AWR('10u2rj016s96k'  )) t;

O SQL_ID pode ser encontrado usando
select sql_id, sql_text 
from dba_hist_sqltext a 
where lower(sql_text) like lower('%<some identifying part of the query text>%')

Descreva os dados

Mostre o DDL das tabelas e índices nessas tabelas.

Mencione se as estatísticas do otimizador foram coletadas recentemente e mostre os dbms_stats usados recolher declaração.

Para as tabelas críticas, forneça informações sobre tamanho do segmento, número de linhas, particionamento,...

Para as colunas usadas em acessos ou junções, forneça informações sobre o número de valores distintos. Os valores são distribuídos uniformemente ou distorcidos (por exemplo, um pequeno número de valores que ocorre com muita frequência e um grande número de valores raros). Você define histogramas?

Algo mais?

Claro que isso é apenas o básico e outras informações ainda podem ser necessárias, como estatísticas do sistema ou parâmetros do otimizador. Mas, mais uma vez, tente fornecer as informações mínimas que (você) podem identificar o problema.

Boa sorte!