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!