DBAtlas · Атлас эксплуатации баз данных

Зафиксировать, отключить или удалить план SQL plan baseline

OracleПроизводительность

Команда

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

Что делает

Управляет атрибутами планов baseline: план FIXED предпочитается другим принятым планам и останавливает автоматическую эволюцию новых планов; ENABLED=NO отключает план без удаления; DROP удаляет его безвозвратно.

Когда использовать

Чтобы жёстко закрепить план для критичного SQL, отключить ошибочно принятый плохой план или очистить ненужные baseline.

Внимание

Требует Enterprise Edition. Планы FIXED могут деградировать по мере роста данных и мешают оптимизатору использовать лучший план; периодически пересматривайте их. SQL, у которого все планы ENABLED=NO, оптимизируется свободно. DROP необратим; сначала сохраните копию в staging-таблицу через DBMS_SPM.PACK_STGTAB_BASELINE.

Открыть в DBAtlas →

Связанные материалы