Der er mindst 11 måder at styre en plan på uden at ændre forespørgslen. De er angivet nedenfor nogenlunde i rækkefølgen efter brug:
- SQL Plan Baseline - Erstat en plan med en anden plan.
- SQL-profiler - Tilføj "korrigerende" hints til planerne. En profil kan f.eks. sige "denne deltagelse returnerer 100 gange flere rækker end forventet", hvilket indirekte ændrer planen.
- Gemmet disposition - Ligner ideen til SQL Plan Baseline, men med færre funktioner. Denne mulighed er enklere at bruge, men mindre kraftfuld og understøttes ikke længere.
- DBMS_STATS.SET_X_STATS - Manuel ændring af tabel-, kolonne- og indeksstatistikker kan ændre planer betydeligt ved at få objekter til at se mere eller mindre dyre ud.
- Sessionskontrol - For eksempel
alter session set optimizer_features_enable='11.2.0.3';
. Der er ikke altid nyttige parametre. Men en af OPTIMIZER_* parametrene kan hjælpe, eller du kan muligvis ændre planen med et udokumenteret tip eller deaktivere en funktion som denne:alter session set "_fix_control"='XYZ:OFF';
- Systemkontrol - Ligner ovenfor, men gælder for hele systemet.
- DBMS_SPD - Et SQL-plandirektiv ligner en profil, idet det giver nogle korrigerende oplysninger til optimizeren. Men dette fungerer på et lavere niveau på tværs af alle planer og er nyt for 12c.
- DBMS_ADVANCED_REWRITE - Skift en forespørgsel til en anden forespørgsel.
- Virtuel privat database - Skift en forespørgsel til en anden forespørgsel ved at tilføje prædikater. Det er ikke beregnet til ydeevne, men du kan sikkert misbruge det til at ændre indeksadgangsstier.
- SQL Translation Framework - Skift en forespørgsel til en anden forespørgsel, før den overhovedet bliver parset. Dette kan gøre det muligt at køre helt "forkert" SQL.
- SQL-patch (dbms_sqldiag internal.i_create_patch) - Skift en forespørgsel til en anden forespørgsel. Svarer til DBMS_ADVANCED_REWRITE, men det er udokumenteret og måske en smule mere kraftfuldt.