Det finns minst 11 sätt att styra en plan utan att ändra frågan. De listas nedan ungefär i användbarhetsordning:
- SQL Plan Baseline - Ersätt en plan med en annan plan.
- SQL-profiler - Lägg till "korrigerande" tips till planerna. En profil kan till exempel säga "denna anslutning returnerar 100 gånger fler rader än förväntat", vilket indirekt ändrar planen.
- Lagrad kontur - Liknar idén till SQL Plan Baseline, men med färre funktioner. Det här alternativet är enklare att använda men mindre kraftfullt och stöds inte längre.
- DBMS_STATS.SET_X_STATS - Manuell modifiering av tabell-, kolumn- och indexstatistik kan avsevärt ändra planer genom att få objekt att på konstgjord väg se mer eller mindre dyra ut.
- Sessionskontroll - Till exempel
alter session set optimizer_features_enable='11.2.0.3';
. Det finns inte alltid användbara parametrar. Men en av parametrarna OPTIMIZER_* kan hjälpa, eller så kanske du kan ändra planen med en odokumenterad ledtråd eller inaktivera en funktion som denna:alter session set "_fix_control"='XYZ:OFF';
- Systemkontroll - Liknar ovan men gäller för hela systemet.
- DBMS_SPD - Ett SQL-plandirektiv liknar en profil genom att det ger viss korrigerande information till optimeraren. Men det här fungerar på en lägre nivå, över alla planer, och är nytt för 12c.
- DBMS_ADVANCED_REWRITE - Ändra en fråga till en annan fråga.
- Virtuell privat databas - Ändra en fråga till en annan fråga genom att lägga till predikat. Den är inte avsedd för prestanda, men du kan förmodligen missbruka den för att ändra indexåtkomstvägar.
- SQL Translation Framework - Ändra en fråga till en annan fråga innan den ens har analyserats. Detta kan göra att helt "fel" SQL körs.
- SQL-patch (dbms_sqldiag internal.i_create_patch) - Ändra en fråga till en annan fråga. Liknar DBMS_ADVANCED_REWRITE men det är odokumenterat och kanske lite kraftfullare.