Oracle
 sql >> Database >  >> RDS >> Oracle

Come descrivere il problema delle prestazioni nel database relazionale?

Per Database Oracle fornire queste informazioni:

Descrivi i sintomi del problema

Descrivi il comportamento che causa il problema. Il comportamento della query è stabile o il problema si verifica solo a volte, con parametri specifici o semplicemente casuali. Puoi riprodurre questo comportamento in un IDE (ad es. SQL Developer)?

Descrivi l'ambiente

Definisci la versione esatta di Oracle

 select * from v$version

Descrivi come ti connetti al database:driver, ORM, linguaggio di programmazione. Fornisci nomi e/o numeri di versione.

Descrivi la query

Pubblica il testo della query. Prova a semplificare:mostra un esempio riproducibile minimo .

Esempio:la tua query problematica unisce 10 tabelle. Controlla se vedi gli stessi sintomi in una query con 9 o 8 join. Scendi fino a quando non vedi i problemi e mostra solo la query ridotta.

Sì, è costoso, ma aumenta notevolmente le possibilità di ricevere supporto! Più piccola è la query, maggiore è l'attrazione dei sostenitori.

Descrivi il piano di esecuzione

Per ottenere il piano di esecuzione esegui questa istruzione (sostituisci il testo della query)

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

Il piano di esecuzione è memorizzato nel PLAN_TABLE , per vederlo eseguire questa query

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

Mostra il risultato completo (non solo la tabella con il piano di esecuzione). Estremamente importante può essere la sezione dei predicati e le note seguenti.

Esempio per 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]

Non tagliare e incollare il risultato grafico del tuo piano di spiegazione IDE.

Questo piano di esecuzione è quello reale che viene eseguito?

Purtroppo non sempre. Ci sono diverse ragioni per le spiegazioni il piano di esecuzione può differire da quello reale.

Se hai dei dubbi (soprattutto quando vedi un buon piano, ma la query va male) puoi estrarre il piano dalla cache del DB fornendo un SQL_ID .

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

L'ID_SQL per una query attualmente in esecuzione (o in esecuzione da poco ed è ancora memorizzata nella cache) può essere trovato con la corrispondenza del testo e/o l'utente del database:

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 hai una licenza AWR, puoi ottenere il piano di esecuzione da lì, anche per le query in esecuzione nella cronologia.

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

L'SQL_ID può essere trovato usando

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

Descrivi i dati

Mostra il DDL delle tabelle e degli indici su quelle tabelle.

Indica se le statistiche dell'ottimizzatore sono state raccolte di recente e mostrano il dbms_stats utilizzato raccogliere la dichiarazione.

Per le tabelle critiche, fornire informazioni sulla dimensione del segmento, il numero di riga, il partizionamento,...

Per le colonne utilizzate nell'accesso o nei join, fornire informazioni sul numero di valori distinti. I valori sono distribuiti in modo uniforme o inclinati (ad es. un piccolo numero di valori che si verifica molto spesso e un numero elevato di valori rari). Definisci gli istogrammi?

Nient'altro?

Ovviamente queste sono solo le nozioni di base e potrebbero essere ancora necessarie altre informazioni, come le statistiche di sistema o i parametri dell'ottimizzatore. Ma ancora una volta cerca di fornire le informazioni minime che (cosa tu pensi) possono identificare il problema. Pubblica informazioni aggiuntive su richiesta.

In bocca al lupo!