Настройка запросов

advertisement
Настройка запроса по образцу:
четыре способа корректировки
плана запроса без изменения
кода
Деев Илья, «Иннова-Системс»
Возможные источники проблем
• Обновление кода приложения
• Изменение данных и статистики
• Смена версии и изменение поведения
оптимизатора
• Изменение параметров оптимизатора
Борьба с неприятными сюрпризами
 Тестирование помогает избежать больших
проблем
 Планы редко меняются в худшую сторону массово
 Проблемы появляются неожиданно
 Когда нет времени ждать, нужна срочная
настройка
Что хотелось бы получить
 Быстрое применение настроенного плана к
проблемному запросу
 Возможность контроля за применением нового
плана
 Возможность быстрой отмены или замены
примененного плана.
Настройка запроса по образцу
1.
2.
3.
4.
Находим проблемы с планом запроса
Изменяем план запроса хинтами
Проверяем результат через выполнение нового
варианта запроса
Применяем набор хинтов настроенного запроса к
проблемному запросу
“SQL hint injection”
Настроенная
версия SQL
Проблемная
версия SQL
 Неприемлемый план
 Регулирующие хинты
• Неприемлемый план
 Настроенный план
 Все хинты настроенного
запроса на выходе CBO
 Все хинты настроенного
запроса на вход CBO
 Настроенный план
Немного о хинтах
 Хинты как результат работы оптимизатора
select * from
table(dbms_xplan.display_cursor(<sql_id>,<child_num
ber>,'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;
Метод 1: SQL Plan Baseline
 Oracle 11 Enterprise Edition
 Идея - работа с планом запроса-образца:
dbms_spm.load_plan_from_cursor_cache
 Права, параметр, скрипты с примерами создания
и удаления: 1.sql_plan_baseline.sql
 Контроль: V$SQL.SQL_PLAN_BASELINE
 Преимущество – стандартный функционал,
простота использования
Метод 2: SQL Patch
 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
Метод 3: SQL Profile
 Oracle 10, 11, Diagnostic & Tuning Pack
 Идея – использовать список нужных хинтов при
импорте профиля:
DBMS_SQLTUNE.IMPORT_SQL_PROFILE
 Скрипты: 3.sql_profile.sql
 Контроль – V$SQL.SQL_PROFILE
 Особенность: по сути - мягкий хак
Метод 4: Outlines
 Oracle 9,10,11, все редакции 
 Идея – заменить список хинтов в private outline
проблемного запроса хинтами настроенного
запроса и создать на его основе public outline.
 Скрипты: 4.1.outlines.sql, 4.2.outlines.sql
 Контроль - ALL_OUTLINES
 Особенность – метод устарел, но … он самый
мощный!
Отмена действия хинтов в тексте запроса
Хинт IGNORE_OPTIM_EMBEDDED_HINTS
Приоритеты при совместном использовании
SQL
SQL
plan
Profile
baseline
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
Download