DBAtlas · Atlas de operaciones de bases de datos

Fijar, deshabilitar o eliminar un plan de un SQL plan baseline

OracleRendimiento

Comando

-- Show the plan content:
SELECT *
FROM   TABLE(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(
         sql_handle => '<sql_handle>',
         plan_name  => '<plan_name>',
         format     => 'TYPICAL'));

SET SERVEROUTPUT ON
DECLARE
  n PLS_INTEGER;
BEGIN
  -- FIXED: this plan is preferred, new plans are not evolved automatically
  n := DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
         sql_handle => '<sql_handle>', plan_name => '<plan_name>',
         attribute_name => 'fixed', attribute_value => 'YES');

  -- Take the bad plan out of use (without dropping it):
  n := DBMS_SPM.ALTER_SQL_PLAN_BASELINE(
         sql_handle => '<sql_handle>', plan_name => '<bad_plan_name>',
         attribute_name => 'enabled', attribute_value => 'NO');
END;
/

-- Drop one plan or the SQL's entire baseline:
DECLARE
  n PLS_INTEGER;
BEGIN
  n := DBMS_SPM.DROP_SQL_PLAN_BASELINE(sql_handle => '<sql_handle>', plan_name => '<plan_name>');
  -- without plan_name, all plans of the SQL are dropped:
  -- n := DBMS_SPM.DROP_SQL_PLAN_BASELINE(sql_handle => '<sql_handle>');
  DBMS_OUTPUT.PUT_LINE(n || ' plan(s) dropped');
END;
/

Qué hace

Gestiona los atributos de los planes del baseline: un plan FIXED se prefiere frente a otros planes aceptados y detiene la evolución automática de planes nuevos; ENABLED=NO deshabilita un plan sin borrarlo; DROP lo elimina definitivamente.

Cuándo usarlo

Para fijar firmemente un plan de un SQL crítico, deshabilitar un plan malo aceptado por error, o limpiar baselines que ya no se necesitan.

Precaución

Requiere Enterprise Edition. Los planes FIXED pueden degradarse a medida que crecen los datos e impedir que el optimizador use un plan mejor; revíselos periódicamente. Un SQL cuyos planes son todos ENABLED=NO se optimiza libremente. DROP es irreversible; haga antes un backup en una tabla de staging con DBMS_SPM.PACK_STGTAB_BASELINE.

Abrir en DBAtlas →

Relacionado