sql >> Base de Datos >  >> RDS >> Oracle

¿Hay alguna manera de obligar a Oracle a cambiar el plan de una consulta sin usar sugerencias?

Hay al menos 11 formas de controlar un plan sin modificar la consulta. Se enumeran a continuación aproximadamente en orden de utilidad:

  1. Línea base del plan SQL - Reemplazar un plan con otro plan.
  2. 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.
  3. 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.
  4. 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.
  5. 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';
  6. Control del sistema - Similar al anterior pero se aplica a todo el sistema.
  7. 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.
  8. DBMS_ADVANCED_REWRITE - Cambiar una consulta a otra consulta.
  9. 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.
  10. 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".
  11. 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.