Esistono almeno 11 modi per controllare un piano senza modificare la query. Sono elencati di seguito approssimativamente in ordine di utilità:
- Linea di base del piano SQL - Sostituisci un piano con un altro.
- Profili SQL - Aggiungi suggerimenti "correttivi" ai piani. Ad esempio, un profilo potrebbe dire "questo join restituisce 100 volte più righe del previsto", il che modifica indirettamente il piano.
- Schema memorizzato - Simile nell'idea a SQL Plan Baseline, ma con meno funzionalità. Questa opzione è più semplice da usare ma meno potente e non più supportata.
- DBMS_STATS.SET_X_STATS - La modifica manuale delle statistiche di tabelle, colonne e indici può cambiare significativamente i piani facendo sembrare gli oggetti artificialmente più o meno costosi.
- Controllo della sessione - Ad esempio
alter session set optimizer_features_enable='11.2.0.3';
. Non ci sono sempre parametri utili. Ma uno dei parametri OPTIMIZER_* può essere d'aiuto, oppure potresti essere in grado di cambiare il piano con un suggerimento non documentato o disabilitando una funzione come questa:alter session set "_fix_control"='XYZ:OFF';
- Controllo del sistema - Simile al precedente ma si applica all'intero sistema.
- DBMS_SPD - Una direttiva SQL Plan è simile a un profilo in quanto fornisce alcune informazioni correttive all'ottimizzatore. Ma funziona a un livello inferiore, in tutti i piani, ed è una novità per 12c.
- DBMS_ADVANCED_REWRITE - Cambia una query in un'altra query.
- Database Privato Virtuale - Modificare una query in un'altra query, aggiungendo predicati. Non è destinato alle prestazioni, ma probabilmente puoi abusarne per modificare i percorsi di accesso all'indice.
- Quadro di traduzione SQL - Cambia una query in un'altra query, prima ancora che venga analizzata. Ciò può consentire l'esecuzione di SQL totalmente "sbagliato".
- Patch SQL (dbms_sqldiag internal.i_create_patch) - Cambia una query in un'altra query. Simile a DBMS_ADVANCED_REWRITE ma non è documentato e forse un po' più potente.