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

C'è un modo per forzare Oracle a modificare il piano di una query senza utilizzare suggerimenti?

Esistono almeno 11 modi per controllare un piano senza modificare la query. Sono elencati di seguito approssimativamente in ordine di utilità:

  1. Linea di base del piano SQL - Sostituisci un piano con un altro.
  2. 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.
  3. 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.
  4. 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.
  5. 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';
  6. Controllo del sistema - Simile al precedente ma si applica all'intero sistema.
  7. 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.
  8. DBMS_ADVANCED_REWRITE - Cambia una query in un'altra query.
  9. 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.
  10. 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".
  11. 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.