sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo describir el problema de rendimiento en una base de datos relacional?

Para Base de datos Oracle proporcione esta información:

Describa los síntomas del problema

Describa el comportamiento que causa el problema. ¿El comportamiento de la consulta es estable o el problema ocurre solo algunas veces, con parámetros específicos o aleatorio simple? ¿Puedes reproducir este comportamiento en un IDE (por ejemplo, SQL Developer)?

Describir el entorno

Definir la versión exacta de Oracle

 select * from v$version

Describa cómo se conecta a la base de datos:controlador, ORM, lenguaje de programación. Proporcione nombres y/o números de versión.

Describa la consulta

Publique el texto de la consulta. Intente simplificar:muestre un ejemplo mínimo reproducible .

Ejemplo:su consulta problemática une 10 tablas. Compruebe si ve los mismos síntomas en una consulta con 9 u 8 uniones. Baje hasta que vea los problemas y muestre solo la consulta reducida.

Sí, esto es costoso, ¡pero aumenta enormemente la posibilidad de que reciba apoyo! Cuanto más pequeña es la consulta, más atrae a los seguidores.

Describa el plan de ejecución

Para obtener el plan de ejecución, ejecute esta declaración (sustituya el texto de su consulta)

 EXPLAIN PLAN  SET STATEMENT_ID = '<some_id>' into   plan_table  FOR
     select * from ....   -- your query here 
 ;

El plan de ejecución se almacena en el PLAN_TABLE , para verlo ejecuta esta consulta

 SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', '<some_id>','ALL')); 

Mostrar el resultado completo (no solo la tabla con el plan de ejecución). Extremadamente importante puede ser la sección predicativa y las notas a continuación.

Ejemplo 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]

No corte y pegue el resultado gráfico de su plan de explicación IDE.

¿Este plan de ejecución es el real que se ejecuta?

Desafortunadamente no siempre. Hay varias razones por las que explicó el plan de ejecución puede diferir del real.

Si tiene dudas (especialmente cuando ve un buen plan, pero la consulta funciona mal), puede extraer el plan de la caché de la base de datos proporcionando un SQL_ID .

 SELECT t.* FROM  table(DBMS_XPLAN.DISPLAY_CURSOR('<SQL_ID>',null,'ALL')) t; 

El SQL_ID para una consulta que se está ejecutando actualmente (o se ejecutó en breve y todavía está en caché) se puede encontrar con la coincidencia de texto y/o el usuario de la base de datos:

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

Si tiene una licencia AWR, puede obtener el plan de ejecución desde allí, incluso para consultas que se ejecutan en el historial.

SELECT t.*
FROM  table(DBMS_XPLAN.DISPLAY_AWR('10u2rj016s96k'  )) t;

El SQL_ID se puede encontrar usando

select sql_id, sql_text 
from dba_hist_sqltext a 
where lower(sql_text) like lower('%<some identifying part of the query text>%')

Describa los datos

Muestra el DDL de las tablas y los índices de esas tablas.

Mencione si las estadísticas del optimizador se recopilaron recientemente y muestre los dbms_stats usados recopilar declaración.

Para las tablas críticas, proporcione información sobre el tamaño del segmento, el número de fila, la partición,...

Para las columnas utilizadas en el acceso o las uniones, proporcione información sobre la cantidad de valores distintos. ¿Están los valores distribuidos uniformemente o sesgados (por ejemplo, una pequeña cantidad de valores que ocurren con mucha frecuencia y una gran cantidad de valores raros). ¿Define histogramas?

¿Algo más?

Por supuesto, esto es solo lo básico y es posible que aún se requiera otra información, como estadísticas del sistema o parámetros del optimizador. Pero una vez más, intente proporcionar la información mínima que (usted) puede identificar el problema. Publique información adicional a pedido.

¡Buena suerte!