Предисловие:
В сегодняшней статье
мы открываем дискуссию по
вопросам оптимизации базы Oracle.
Тема оптимизации всегда была
актуальна для пользователей и
администраторов Oracle и конечно
даже в нескольких выпусках мы не
сможем охватить весь спектр
задач и проблем оптимизации.
В этом выпуске мы постараемся
сконцентрироваться на новшествах
оптимизации в версии 10G.
Каковы же главные причины
ведущие к плохой работе
оптимизатора Oracle ?
На сегодняшний день
разработчики Базы Oracle
отмечают 3 главных фактора:
1. Плохая или недостаточная
статистика на объекты базы.
2. Отсутствие нужных структур
для оптимального execution plan
, как то наличие нужных индексов
и materialized views.
Для решения этой проблемы с
версии 10G вводятся 2 новых
автоматизированных советчика ,
как SQL Tuning Advisor and SQL
Access Advisor. (Поле подробно
данные возможности будут описаны
в следующем выпуске)
3. Оптимизатор Oracle выбирает
плохой или мене подходящий
execution plan.
С этой проблемой сталкиваются
многие пользователи с момента
выбора работы с Cost Based
Optimizer (CBO) .
По каким то необъяснимым
соображениям Oracle выбирает
совершенно неприемлемый
execution plan и требуется
немало здоровья и сил заставить
Oracle выбрать подходящий план
путём включения различных
подсказок (Hints) в код .
Конечно подключение подсказок
является проблематичным , так
как оно влечет за собой
изменения в коде аппликации.
С версии 10G предлагается
решать этот вопрос путём
использования SQL Profiling.
Данный метод очень напоминает
подход решения Outlines
известный с версии 9i. ( Более
подробно о работе с SQL
Profiling читайте в наших
следующих выпусках).
В сегодняшней рассылке
хотелось бы заострить внимание
на первом факторе плохой работы
оптимизатора или "
статистическая недостаточность".
Действительно работа с Cost
Based Optimizer (CBO)
подразумевает наличие нужных
статистик. Недостаток в
статистике по теории приводит к
неправильной работе
оптимизатора.
Ранее Oracle предоставлял
довольно большую свободу
действий в сборе статистик
полагая , что пользователи
уделят достаточно внимания
данному вопросу.
С новой версии 10G инженеры
Oracle пришли к выводу , что в
таких сложных вопросах, как
правильная работа оптимизатора
полагаться на пользователя не
надо и решили собирать
статистики автоматически нас не
уведомляя.
Для этой цели каждую ночь
запускается процедура
DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC.
Этот job собирает отсутствующие
статистики либо так называемые
stale (по определению объект
попадает в категорию stale если
со времени последнего сбора
статистики было произведено
изменений на 10% или более от
общего количества строк в
таблице).
Этот job по правде говоря просто
дублирует известный с предыдущей
версии
DBMS_STATS.GATHER_DATABASE_STATS
при использовании опции GATHER
AUTO.
Этот метод автоматичесгого сбора
приводится в действие с момента
создания базы без уведомления
администратора.
Проверить этот факт можно путем
простого запроса:
SELECT * FROM
DBA_SCHEDULER_JOBS WHERE
JOB_NAME = 'GATHER_STATS_JOB';
Конечно вопрос правильный ли
этот подход остаётся открытым,
хотя Oracle уже и поставили нас
перед фактом.
С одной стороны конечно
оптимизатору требуются
правильные статистики на объекты
, но с другой стороны как при
данном подходе сохранить
стабильность выполнения SQL или
стабильность execution plan.
Нет ничего более плохого , как
нестабильная система с
непредсказуемым временем SQL
запросов.
Особенно этот подход может
привести к плохим результатам в
системах больших хранилищ данных
DWH.
В любом случае Oracle оставил
нам некую степень свободы
предоставив возможность отменить
этот job путем запуска
процедуры :
BEGIN
DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');
END;
В итоге главное не
забывайте , что с новой версии
10G Oracle решает за вас вопрос
о сборе статистик и пока
оставляет за вами право
отказаться от этого решения.
Если у вас есть интересный
материал , вопросы, замечания
или опыт которым вы хотели
поделиться , тогда высылайте на
адрес автора рассылки (eldar52@mail.ru)
В
Интернете:
Интересный документ
описывающий методы performance
на системе Sun Solaris.
Очень полезен для
администраторов при оптимизации.
Дежурный TIP :
В версии 10G опция autotrace
включает в себя и пакет
DBMS_XPLAN, что приводит к более
подробному выводу информации при
autotrace.
Пример ( По материалам Oracle
Magazine)
SQL> set autotrace traceonly
explain
SQL> select *
2 from emp, dept
3 where emp.deptno =
dept.deptno
4 and emp.job = 'CLERK';
Execution Plan
--------------------------------------------------------------------------------------
Plan hash value: 877088642
------------------------------------------------------------------------------------------------------------
| Id | Operation
| Name | Rows | Bytes
| Cost (%CPU) |
Time |
------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
| | 4 | 468
| 7 (15) |
00:00:01 |
|* 1 | HASH
JOIN
| | 4 | 468
| 7 (15) |
00:00:01 |
|* 2 | TABLE ACCESS FULL
| EMP | 4 | 348
| 3 (0) |
00:00:01 |
| 3 | TABLE ACCESS FULL
| DEPT | 4 | 120
| 3 (0) |
00:00:01 |
------------------------------------------------------------------------------------------------------------
Predicate Information
(identified by operation id):
-----------------------------------------------------------------------------------------
1 -
access("EMP"."DEPTNO"="DEPT"."DEPTNO")
2 -
filter("EMP"."JOB"='CLERK')
Note
--------
- dynamic sampling used for
this statement |