Hay al menos 11 formas de controlar un plan sin modificar la consulta. Se enumeran a continuación aproximadamente en orden de utilidad:
- Línea base del plan SQL - Reemplazar un plan con otro plan.
- Perfiles de SQL - Agregar sugerencias "correctivas" a los planes. Por ejemplo, un perfil podría decir "esta unión devuelve 100 veces más filas de las esperadas", lo que cambia indirectamente el plan.
- Esquema almacenado - Similar en idea a SQL Plan Baseline, pero con menos funciones. Esta opción es más simple de usar pero menos poderosa y ya no es compatible.
- DBMS_STATS.SET_X_STATS - La modificación manual de estadísticas de tablas, columnas e índices puede cambiar significativamente los planes al hacer que los objetos parezcan artificialmente más o menos costosos.
- Control de sesión - Por ejemplo,
alter session set optimizer_features_enable='11.2.0.3';
. No siempre hay parámetros útiles. Pero uno de los parámetros OPTIMIZER_* puede ayudar, o puede cambiar el plan con una sugerencia no documentada o deshabilitar una característica como esta:alter session set "_fix_control"='XYZ:OFF';
- Control del sistema - Similar al anterior pero se aplica a todo el sistema.
- DBMS_SPD - Una directiva de plan SQL es similar a un perfil en el sentido de que proporciona información correctiva al optimizador. Pero esto funciona a un nivel más bajo, en todos los planes, y es nuevo en 12c.
- DBMS_ADVANCED_REWRITE - Cambiar una consulta a otra consulta.
- Base de datos privada virtual - Cambiar una consulta a otra consulta, agregando predicados. No está diseñado para el rendimiento, pero probablemente pueda abusar de él para cambiar las rutas de acceso al índice.
- Marco de traducción de SQL - Cambiar una consulta a otra consulta, incluso antes de que se analice. Esto puede permitir que se ejecute un SQL totalmente "incorrecto".
- Parche SQL (dbms_sqldiag internal.i_create_patch) - Cambiar una consulta por otra consulta. Similar a DBMS_ADVANCED_REWRITE pero no está documentado y quizás sea un poco más poderoso.