Qualcuno può spiegare qualcosa sul piano esplicativo e come si ottiene il piano esplicativo per una query. Inoltre, se c'è qualche script sql che può essere usato come utility per questo, sarebbe fantastico.
Qualcuno può spiegare qualcosa sul piano esplicativo e come si ottiene il piano esplicativo per una query. Inoltre, se c'è qualche script sql che può essere usato come utility per questo, sarebbe fantastico.
Risposte:
È possibile utilizzare il pacchetto DBMS_XPLAN :
SQL> explain plan for select * from dual;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 2 |
| 1 | TABLE ACCESS FULL | DUAL | 1 | 2 | 2 |
--------------------------------------------------------------------
Note: cpu costing is off
L'istruzione EXPLAIN PLAN visualizza i piani di esecuzione scelti dall'ottimizzatore per le istruzioni SELECT, UPDATE, INSERT e DELETE. Un piano di esecuzione dell'istruzione è la sequenza di operazioni che il database esegue per eseguire l'istruzione.
EXPLAIN PLAN FOR ...
Sostituisci il ... con la tua istruzione SQL. Dopo aver eseguito questo, eseguire il seguente per visualizzare il piano:
SELECT * FROM table(dbms_xplan.display);
Per ulteriori informazioni, consultare le sezioni Panoramica o Utilizzo della Guida all'ottimizzazione delle prestazioni di Oracle 11g.
Questa è una domanda molto comune, quindi ho deciso di trasformare questa risposta in un articolo .
Il piano di esecuzione stimato viene generato dall'ottimizzatore senza eseguire la query SQL. È possibile generare il piano di esecuzione stimato da qualsiasi client SQL utilizzando EXPLAIN PLAN FOR oppure utilizzare Oracle SQL Developer per questa attività.
Quando si utilizza Oracle, se si antepone il EXPLAIN PLAN FOR
comando a una determinata query SQL, il database memorizzerà il piano di esecuzione stimato nell'associato PLAN_TABLE
:
EXPLAIN PLAN FOR
SELECT p.id
FROM post p
WHERE EXISTS (
SELECT 1
FROM post_comment pc
WHERE
pc.post_id = p.id AND
pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY
Per visualizzare il piano di esecuzione stimato, è necessario utilizzare DBMS_XPLAN.DISPLAY
, come illustrato nell'esempio seguente:
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))
L'opzione di formattazione ALL + OUTLINE ti consente di ottenere maggiori dettagli sul piano di esecuzione stimato rispetto all'uso dell'opzione di formattazione predefinita.
Se è stato installato SQL Developer, è possibile ottenere facilmente il piano di esecuzione stimato per qualsiasi query SQL senza dover anteporre il comando EXPLAIN PLAN FOR:
Il piano di esecuzione SQL effettivo viene generato dall'ottimizzatore durante l'esecuzione della query SQL. Pertanto, a differenza del piano di esecuzione stimato, è necessario eseguire la query SQL per ottenere il piano di esecuzione effettivo.
Il piano effettivo non dovrebbe differire in modo significativo da quello stimato, a condizione che le statistiche delle tabelle siano state correttamente raccolte dal database relazionale sottostante.
Per indicare a Oracle di memorizzare il piano di esecuzione effettivo per una determinata query SQL, è possibile utilizzare il GATHER_PLAN_STATISTICS
suggerimento per la query:
SELECT /*+ GATHER_PLAN_STATISTICS */
p.id
FROM post p
WHERE EXISTS (
SELECT 1
FROM post_comment pc
WHERE
pc.post_id = p.id AND
pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY
Per visualizzare il piano di esecuzione effettivo, è possibile utilizzare DBMS_XPLAN.DISPLAY_CURSOR
:
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))
Se si desidera ottenere i piani di esecuzione per tutte le query generate in una determinata sessione, è possibile impostare la STATISTICS_LEVEL
configurazione della sessione su TUTTI:
ALTER SESSION SET STATISTICS_LEVEL='ALL'
Ciò avrà lo stesso effetto dell'impostazione del GATHER_PLAN_STATISTICS
suggerimento per ogni query di esecuzione. Quindi, proprio come con il GATHER_PLAN_STATISTICS
suggerimento per la query, è possibile utilizzare DBMS_XPLAN.DISPLAY_CURSOR
per visualizzare il piano di esecuzione effettivo.
È necessario ripristinare l'
STATISTICS_LEVEL
impostazione sulla modalità predefinita una volta terminata la raccolta dei piani di esecuzione che erano interessati. Questo è molto importante, soprattutto se si utilizza il pool di connessioni e le connessioni al database vengono riutilizzate.ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'