DBAtlas · Atlas de operações de banco de dados

Fixar, desabilitar ou remover um plano de SQL plan baseline

OracleDesempenho

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;
/

O que faz

Gerencia os atributos dos planos do baseline: um plano FIXED tem preferência sobre os demais planos aceitos e interrompe a evolução automática de novos planos; ENABLED=NO desabilita um plano sem apagá-lo; DROP o remove definitivamente.

Quando usar

Para fixar firmemente um plano de um SQL crítico, desabilitar um plano ruim aceito por engano ou limpar baselines que não são mais necessários.

Atenção

Exige Enterprise Edition. Planos FIXED podem se degradar com o crescimento dos dados e impedir o otimizador de usar um plano melhor; revise-os periodicamente. Um SQL cujos planos estão todos ENABLED=NO é otimizado livremente. DROP é irreversível; faça antes backup em uma staging table com DBMS_SPM.PACK_STGTAB_BASELINE.

Abrir no DBAtlas →

Relacionados