Come si ottiene il piano esplicativo?


10

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.


1
"se c'è qualche script sql che può essere usato come utility per questo" che tipo di utility stai cercando?
Derek Downey,

2
Molti strumenti di sviluppo SQL hanno GUI molto facili da usare per ottenere piani di esecuzione. Oracle SQL Developer ne ha uno. Hai accesso a tali strumenti o vuoi farlo in modo specifico dagli script?
FrustratedWithFormsDesigner

Ho Oracle SQL Developer ma vorrei conoscere gli script.
user419534

2
Se hai seguito un corso con Jonathan Lewis , saprai che esistono 8 modi diversi per ottenere un piano di esecuzione da Oracle. Per favore vota questo commento se vuoi che io aggiunga una risposta che elenca tutti i diversi metodi.
Colin 't Hart,

Risposte:


9

È 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

5

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.


1

Questa è una domanda molto comune, quindi ho deciso di trasformare questa risposta in un articolo .

Il piano di esecuzione SQL stimato

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à.

SPIEGARE PIANO PER

Quando si utilizza Oracle, se si antepone il EXPLAIN PLAN FORcomando 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.

Sviluppatore Oracle SQL

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:

inserisci qui la descrizione dell'immagine

Il piano di esecuzione SQL effettivo

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.

Suggerimento per la query GATHER_PLAN_STATISTICS

Per indicare a Oracle di memorizzare il piano di esecuzione effettivo per una determinata query SQL, è possibile utilizzare il GATHER_PLAN_STATISTICSsuggerimento 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'))

Abilita STATISTICA a livello di connessione DB

Se si desidera ottenere i piani di esecuzione per tutte le query generate in una determinata sessione, è possibile impostare la STATISTICS_LEVELconfigurazione della sessione su TUTTI:

ALTER SESSION SET STATISTICS_LEVEL='ALL'

Ciò avrà lo stesso effetto dell'impostazione del GATHER_PLAN_STATISTICSsuggerimento per ogni query di esecuzione. Quindi, proprio come con il GATHER_PLAN_STATISTICSsuggerimento per la query, è possibile utilizzare DBMS_XPLAN.DISPLAY_CURSORper visualizzare il piano di esecuzione effettivo.

È necessario ripristinare l' STATISTICS_LEVELimpostazione 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'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.