14
Настройка запроса по образцу: четыре способа корректировки плана запроса без изменения кода Деев Илья, «Иннова-Системс»

Возможные источники проблем

Embed Size (px)

DESCRIPTION

Настройка запроса по образцу: четыре способа корректировки плана запроса без изменения кода Деев Илья, «Иннова-Системс». Возможные источники проблем. Обновление кода приложения Изменение данных и статистики Смена версии и изменение поведения оптимизатора Изменение параметров оптимизатора. - PowerPoint PPT Presentation

Citation preview

Настройка запроса по образцу: четыре способа

корректировки плана запроса без изменения

кода

Деев Илья, «Иннова-Системс»

• Обновление кода приложения

• Изменение данных и статистики

• Смена версии и изменение поведения оптимизатора

• Изменение параметров оптимизатора

Возможные источники проблем

Тестирование помогает избежать больших проблем

Планы редко меняются в худшую сторону массово

Проблемы появляются неожиданно Когда нет времени ждать, нужна срочная

настройка

Борьба с неприятными сюрпризами

Быстрое применение настроенного плана к проблемному запросу

Возможность контроля за применением нового плана

Возможность быстрой отмены или замены примененного плана.

Что хотелось бы получить

1. Находим проблемы с планом запроса2. Изменяем план запроса хинтами3. Проверяем результат через выполнение

нового варианта запроса4. Применяем набор хинтов настроенного

запроса к проблемному запросу

Настройка запроса по образцу

Настроенная версия SQL

Неприемлемый план

Регулирующие хинты

Настроенный план

Все хинты настроенного запроса на выходе CBO

“SQL hint injection”

Проблемная версия SQL

• Неприемлемый план

Все хинты настроенного запроса на вход CBO

Настроенный план

Хинты как результат работы оптимизатора select * from table(dbms_xplan.display_cursor(<sql_id>,<child_number>,'outline'));

Хинты в тексте запроса – гарантия применения, но при этом отсутствие гибкости

Хинты в механизмах стабилизации планов выполнения: Stored Outlines -> SQL Plan Baselines

Немного о хинтах

Скрипт 0.test_data.sql-- пользовательdrop user test cascade;create user test identified by test;grant connect, resource to test;

-- данные для тестового запросаcreate table test.drop_tbl as select rownum n, 'txt'||rownum txt from dual connect by level <=10000;

create index test.i_drop_tbl_id on test.drop_tbl(n);

-- статистикаbegin dbms_stats.gather_table_stats(ownname => 'test', tabname => 'drop_tbl');

end;

Тестовые данные

Oracle 11 Enterprise Edition Идея - работа с планом запроса-

образца: dbms_spm.load_plan_from_cursor_cache Права, параметр, скрипты с примерами

создания и удаления: 1.sql_plan_baseline.sql

Контроль: V$SQL.SQL_PLAN_BASELINE Преимущество – стандартный

функционал, простота использования

Метод 1: SQL Plan Baseline

Oracle 11 (официально – в EE, SQL Repair Advisor в Enterprise Manager, реально - все редакции)

Идея – использовать SQL patch не в рамках SQL Repair Advisor, а напрямую

Скрипты – 2.sql_patch.sql Контроль – V$SQL.SQL_PATCH Особенность – хинты обрабатываются только в

системном виде, используется внутренний пакет:

sys.dbms_sqldiag_internal.i_create_patch

Метод 2: SQL Patch

Oracle 10, 11, Diagnostic & Tuning Pack Идея – использовать список нужных

хинтов при импорте профиля: DBMS_SQLTUNE.IMPORT_SQL_PROFILE

Скрипты: 3.sql_profile.sql Контроль – V$SQL.SQL_PROFILE Особенность: по сути - мягкий хак

Метод 3: SQL Profile

Oracle 9,10,11, все редакции Идея – заменить список хинтов в private

outline проблемного запроса хинтами настроенного запроса и создать на его основе public outline.

Скрипты: 4.1.outlines.sql, 4.2.outlines.sql Контроль - ALL_OUTLINES Особенность – метод устарел, но … он

самый мощный!

Метод 4: Outlines

Отмена действия хинтов в тексте запроса

Хинт IGNORE_OPTIM_EMBEDDED_HINTS

Приоритеты при совместном использовании

SQL plan baseline

SQL Profile

SQL

patch

Outline select * from table(dbms_xplan.display(null,null,'basic+note')); -- Note

+ + + + - outline "OL_4AAY3KXC7RDDG" used for this statement

+ + + - SQL patch "patch_4aay3kxc7rddg" used for this statement

- SQL plan baseline "SQL_PLAN_3dm7hzprspdufe13b857f" used for this statement

+ + - SQL profile "PROF_4aay3kxc7rddg" used for this statement

- SQL plan baseline "SQL_PLAN_3dm7hzprspdufe13b857f" used for this statement

+ - SQL plan baseline "SQL_PLAN_3dm7hzprspdufe13b857f" used for this statement