Министерство Образования РФ Удмуртский Государственный Университет Физический факультет Реферат по теме: «Оптимизатор запросов в Oracle 10g» Выполнил: Саитов А.М., группа 38-41 Проверил: Вотницев А.А. Ижевск 2006 Со времени своего появления в Oracle7 стоимостной оптимизатор (CBO) становился все более важным и значимым с каждой новой версией Oracle, в то время как его аналог - оптимизатор, основанный на правилах (RBO), становился все менее таковым. Различие между этими двумя оптимизаторами относительно ясно: CBO выбирает наилучший путь для запросов, основываясь на сведениях о ваших данных, с использованием таких возможностей баз данных Oracle, как двоичные (bitmap)-индексы, индексы, основанные на функции, хэш (hash)-соединения, индексные таблицы и секционирование, тогда как RBO просто следует установленным правилам (эвристика). В версии Oracle Database 10g устаревание RBO признано официально, а CBO снова существенно улучшен. Начнем с того, что теперь CBO имеет специальный режим настройки, который используется многими другими средствами Oracle Database 10g, включая SQL Tuning Advisor и SQL Access Advisor. Одним из результатов, сгенерированным режимом настройки SQL, является SQL-профиль – дополнительная статистика, относящаяся к заданному оператору, которую можно сохранить в словаре данных и использовать во время выполнения (во время обычных операций CBO) для улучшения производительности SQL. SQL-профили особенно полезны для пакетных приложений (или для любого приложения, к исходному коду которого нет доступа). SQL-профили используют выборку для сбора дополнительной информации; технику частичного выполнения для контроля и настройки стоимостных оценок; и информацию об истории выполнения SQLпредложения для изменения при необходимости значений параметров. За дополнительной информацией обратитесь к Приложению 1 и к соответствующим статьям по использованию SQL Tuning Advisor и SQL Access Advisor, приводимых на сервере http://www.oracle.com. Кроме того, Oracle внес ряд фундаментальных изменений в нормальное поведение CBO, включая изменения в стоимостной модели и механизме преобразований. Давайте посмотрим на эти изменения в контексте обработки SQL-предложения. Oracle Database 10g CBO построен на новой структуре преобразований. SQL-запросы, переданные в ядро базы данных Oracle, сперва проходят через анализатор, который проверяет синтаксис и анализирует семантику. Результатом этого просмотра является набор групп запросов, которые направляются в оптимизатор, объединяющий три основных функциональных подсистемы, а именно: механизм преобразования запросов, блок оценки и генератор планов. Механизм преобразования запросов использует эвристику, т.е. основанные на правилах алгоритмы для групп запросов. Ряд общих преобразований включает select-join, group-by, distinct-view merging и перезапись материализованных представлений (см. Приложение 2). Однако, что более важно, изменилась сама стоимостная модель. В Oracle9i Database CBO использовал стоимостную модель I/O, которая все оценивала главным образом на основе чтений единичных блоков, почти совершенно игнорируя стоимость CPU (или используя константы для оценки стоимости CPU). В Oracle Database 10g, стоимостная модель теперь включает системную статистику, которая реально отслеживает CPU и I/O системы по отношению к рабочей нагрузке Oracle. Oracle Database 10g CBO использует новую стоимостную модель В Oracle Database 10g стоимостной моделью по умолчанию является CPU плюс I/O, где единицей стоимости служит время: CBO оценивает время выполнения запроса путем подсчета числа операций I/O, типа операций I/O, и числа циклов CPU, которые будет выполнять база данных в процессе выполнения запроса. Эти оценки зависят от наличия системной статистики, которую CBO использует для преобразования числа циклов CPU и числа операций I/O к времени выполнения. (Заметьте, что некоторые операции, такие как bitmap-слияние, сортировка, или hash-соединения, могут не требовать операций I/O, но все такие операции содержат компонент CPU). Oracle Database 10g накапливает два типа системной статистики: статистика, собранная без рабочей нагрузки (noworkload), и статистика, собранная с учетом рабочей нагрузки. Статистика без рабочей нагрузки отражает производительность системы I/O – среднее время поиска I/O и скорость передачи - и быстродействие CPU. При сборе статистики без рабочей нагрузки CBO производит пробные считывания различных объемов из файлов базы данных; он замеряет каждое считывание и затем использует статистические методы для вычисления среднего времени поиска и скорости передачи. Это занимает от нескольких секунд до нескольких минут. CBO вычисляет быстродействие CPU в миллионах циклов в секунду. Статистика с рабочей нагрузкой позволяет CBO быть в курсе загрузки. Системная статистика, собранная в условиях рабочей нагрузки, позволяет понять, ограничена ли система по I/O или CPU; соответственно, CBO использует эти данные для корректировки стоимостей планов. Для сбора статистики с рабочей нагрузкой надо выполнить следующие команды в начале и в конце работы: dbms_stats.gather_system_stats(gathering_mode=>'start') ... dbms_stats.gather_system_stats(gathering_mode=>'stop') Значения, полученные при запросе из sys.aux_stats$, выглядят следующим образом: SQL> select sname, pname, pval1 from sys.aux_stats$; SNAME ------------SYSSTATS_INFO SYSSTATS_INFO SYSSTATS_INFO SYSSTATS_INFO SYSSTATS_MAIN PNAME PVAL1 --------- ------STATUS DSTART DSTOP FLAGS 1 CPUSPEEDNW 502.005 SYSSTATS_MAIN SYSSTATS_MAIN SYSSTATS_MAIN SYSSTATS_MAIN SYSSTATS_MAIN SYSSTATS_MAIN SYSSTATS_MAIN SYSSTATS_MAIN IOSEEKTIM IOTFRSPEED SREADTIM MREADTIM CPUSPEED MBRC MAXTHR SLAVETHR 10 4096 7.618 14.348 507 6 32768 13 rows selected. CPUSPEEDNW, IOSEEKTIM и IOTFRSPEED являются параметрами статистики без рабочей нагрузки; SREADTIM, MREADTIM, CPUSPEED, MBRC, MAXTHR и SLAVETHR отражают статистику с учетом рабочей нагрузки. Если доступны оба типа статистики, оптимизатор использует статистику с рабочей нагрузкой. SREADTIM – время чтения одного блока (мс) - это среднее время, за которое Oracle считывает один блок. MREADTIM – время чтения группы блоков (мс) - это среднее время, затраченное на последовательное чтение. MBRC – счетчик чтения группы блоков – это среднее количество блоков, считанных во время последовательных чтений группы блоков. В процессе оптимизации CBO использует параметр MBRC вместо параметра db_multiblock_read_count запроса, чтобы вычислить стоимость для таблицы и для быстрого полного сканирования индекса. MAXTHR – максимальная пропускная способность системы I/O собирается только когда база данных выполняет параллельные запросы. SLAVETHR - максимальная пропускная способность подчиненных I/O собирается только когда база данных выполняет параллельные запросы. Большое преобразований количество добавляет блоков запроса сложностей и взаимозависимость стратегии стоимостного преобразования. В Oracle Database 10g механизм преобразования стал более эластичной основой, которая может поддерживать при необходимости новые алгоритмы, чтобы гарантировать, что Oracle всегда может быстро выбрать оптимальное преобразование. Кроме того, базовые преобразования Oracle Database 10g поддерживают некоторое новое пространство состояний алгоритма поиска, которое гарантирует, что оптимизатор ищет самый лучший план быстро, даже когда преобразования достаточно сложны. Средство оценки измеряет мощность (количество строк), селективность (количество строк из набора строк, отфильтрованного предикатом) и стоимость, определяемую как ресурс (дисковый I/O, использование CPU и объем памяти) различных операций (сканирование таблицы или объединение таблиц, например), которые выдают данные. Точность этих оценок зависит от статистики – теперь статистики по объекту и, в Oracle Database 10g, системной статистики. Специфика SQL-профилей любого запроса также используется на этом этапе для эффективной оценки стоимости. Генератор планов рекомбинирует запрос различными способами, создавая альтернативные планы, используя разные методы соединения и порядок соединения. Чем больше соединяемых таблиц в исходном запросе, тем больше порождается альтернативных планов, и тем большее время CBO тратит на нахождение "лучшего" плана. Напротив, если существует несколько соединений в отдельном запросе, или соединения расположены в наилучшем для выполнения порядке, то CBO быстро найдет оптимальный план. В конечном счете, CBO выбирает наилучший план – с наименьшей оцененной стоимостью по отношению к другим планам. Но, строго говоря, то, как CBO измеряет стоимость вычисления любого SQL-оператора – стоимостная модель – подвержено влиянию многих факторов, включающих несколько параметров инициализации (см. Приложение 3), начиная с optimizer_mode. Параметр optimizer_mode устанавливает общую задачу производительности для CBO в терминах пропускной способности (минимальное время возврата всех строк) по отношению к времени отклика (минимальное время возврата первой строки). (См. Приложение 3). Другим преимуществом стоимостной модели Oracle Database 10g является то, что она разрешает CBO использовать другие методы для создания наиболее быстрого плана - например, путем переупорядочивания предикатов в запросе. Т.к. CBO знает стоимости, ассоциированные с заданным запросом с точки зрения CPU, и т.к. основным компонентом в стоимости предиката является CPU, CBO может рассчитать стоимости альтернативных порядков предикатов и расставить эти предикаты в наиболее эффективном порядке. Например, допустим, что в следующем select-предложении, b < 0 возвращает 1 строку, а a > 0 возвращает все строки таблицы t: select * from t where a > 0 and b < 0; Если предикаты расположены в порядке a > 0 и b < 0, то база данных будет оценивать b < 0 для каждой строки. Однако, если изменить порядок на b < 0 и a > 0, то предикат a > 0 будет оценен единожды. При определении наилучшего порядка алгоритмы упорядочивания предикатов учитывают стоимости различных комбинаций порядка предикатов и селективности. Эта возможность обеспечивает значительное улучшение, особенно для неселективных и затратных предикатов. Заключение Стоимостной оптимизатор является стратегической подсистемой Oracle Database. Учитывая, что CBO совершенствуется с каждой новой версией Oracle Database, желательно учесть побочные эффекты, которые изменения в CBO могут привнести в приложения на базе данных Oracle. При переносе существующей системы на Oracle Database 10g необходимо создать резервную копию всей статистики, которую система использует для повседневных операций, и протестировать эту статистику на приложениях в отладочной среде, построенной на новой версии базы данных, перед сдачей в промышленную эксплуатацию. Приложение 1. Режим настройки CBO для SQL в Oracle Database 10g В Oracle Database 10g CBO-оптимизатор имеет два режима - нормальный режим и режим настройки, который вызывается из SQL Tuning Advisor (и многими другими Oracle Database 10g советчиками (advisor), такими как SQL Access Advisor). SQL Tuning Advisor - это новое мощное средство в Oracle Database 10g для администраторов. В частности, в предыдущих версиях Oracle если план, созданный оптимизатором, не устраивал разработчика, то можно было задать подсказку, чтобы повлиять на решение оптимизатора, но выполнение в лучшем случае занимало слишком много времени. И даже если найдется время для анализа необходимого для вычисления наилучшего плана выполнения, то невозможно испытать SQL, сгенерированный пакетными приложениями (или любым другим приложением), к исходному коду которого нет доступа. SQL Tuning Advisor активизирует режим настройки CBO для осуществления более полного анализа (и более длительного, чем в нормальном режиме, который действует в пределах строгих временных ограничений) проблематичных запросов, и вырабатывает рекомендации о том, как достичь самого быстрого доступа к данным. Одним из возможных результатов этого процесса является генерация SQL-профиля – объекта, который может быть сохранен в словаре данных (если рекомендация принята), и который CBO использует (во время выполнения операций, в нормальном режиме) для пополнения статистики, используемой при генерации планов. Режимы стоимостного оптимизатора Нормальный режим Режим настройки (Automatic Tuning Optimizer) Действует внутри строгих Выполняет дополнительный анализ плана выполнения, временных ограничений (< 1 созданного нормальным режимом, чтобы определить, секунды) может ли план нормального режима быть улучшен Создает план выполнения Вырабатывает рекомендации (действия, обоснования, ожидаемые выгоды), отличные от плана выполнения по существу Использует SQL-профиль Если потребуется, создает SQL-профиль (как часть для SQL-операторов (если рекомендации, которую можно принять, в таком случае таковые доступны) SQL-профиль сохраняется в словаре данных для использования CBO в нормальном режиме) Как таковая, эта новая возможность Oracle Database 10g приносит огромную пользу администраторам - вместо ожидания патча от поставщика приложения, можно запустить SQL Tuning Advisor, принять им рекомендуемый профиль, чтобы CBO использовал этот профиль во время выполнения. SQL Tuning Advisor также во многих случаях устраняет необходимость указания подсказок, поскольку он не только создаст профили, но и даст актуальные рекомендации, как улучшить код определенных SQLзапросов. Пользуйтесь преимуществами этого нового средства всегда, когда это возможно. Режим настройки более общий по отношению к нормальному режиму CBO. В нормальном режиме CBO действует внутри строгих временных ограничений, чтобы предоставить альтернативные планы и соответствующие им стоимости. Приложение 2. Общие преобразования Oracle производит множественные преобразования запросов, изменяя и переписывая запросы в эквивалентные, но более оптимальные формы. Некоторые из этих преобразований являются эвристическими, или основанными на правилах, т.е. они базируются на структурных свойствах запроса, например, на числе таблиц, типах соединений и фильтров, наличии группирующих выражений, - а не на селективности, мощности, распределенности, порядке соединения или относительных стоимостях различных операций базы данных. Другие преобразования, такие как перезапись материализованных представлений, звездное преобразование, или OR-расширение, являются стоимостными преобразованиями, в которых запрос копируется, преобразовывается и многократно оценивается (и рекурсивно, каждый раз используя новый набор преобразований) и так до окончания процесса, когда одно или более преобразование выбирается для применения к начальному запросу, если оно приводит к оптимальной стоимости. Вот сводка наиболее общих преобразований: Эвристические преобразования. - Select-join - Select-join-project view слияние (merging) - Group-by и distinct-view слияние - Subquery unnesting. (Разбор вложенных подзапросов) - Filter predicate push-down in a view (Фильтрация предикатов сверху вниз в представлении) - Predicate move-around (Перемещение предикатов) - Common subexpression elimination (Общее исключение подвыражений) - Join predicate push down (Соединение предикатов сверху вниз) - Outer to inner join conversion (Преобразование внешнего соединения к внутреннему) - Subsumed subquery removal through window function (Удаление сгруппированного подзапроса через функцию вырезания), Стоимостные преобразования. - OR expansion (OR-расширение) преобразует запрос с OR-ами оператора WHERE в UNION ALL нескольких запросов без OR-ов, который весьма эффективен, когда операции OR используют ссылочные ограничения на различные таблицы - Перезапись материализованных представлений - Звездное преобразование - Преобразование набора операторов intersect в join и minus в anti-join Приложение 3. Параметры инициализации, влияющие на CBO Параметр optimizer_mode ставит общую задачу производительности для CBO в терминах пропускной способности по отношению к времени отклика. В Oracle Database 10g значение по умолчанию (all_rows) заставляет CBO выбирать лучшую общую производительность - оптимизатор будет выбирать тот план, который выдает все строки по запросу за наименее возможное время. С другой стороны, параметр first_rows заставит оптимизатор обеспечить наименьшее время отклика путем выбора плана, который наиболее быстро выдает начальное подмножество строк, а остаток строк по запросу за больший период времени, чем с параметром all_rows. Параметр "first_rows_n" (появившийся в Oracle9i Database) позволяет сбалансировать возможные несоответствия в этом континууме (пропускной способности по отношению к времени отклика) более целенаправленно, позволяя задать число строк равным 1, 10, 100, или 1000. В Oracle Database 10g, если запрос содержит предикат rownum, CBO автоматически переключается в режим first_rows_n, извлекая значение n из предиката rownum. Другим важным параметром инициализации оптимизатора является optimizer_dynamic_sampling. Статистика по объектам базы данных (размер таблиц, индексы, количество строк в таблицах, количество различных значений в столбцах, процент количества данных таблицы, меньшее максимального, и т.д.) играет ключевую роль в оценке стоимостей (см. Приложение 3), и если CBO не может найти актуальной статистики для работы в течение фазы оценки стоимости обработки оператора, он может, если этот параметр установлен, в это время динамически подобрать статистические данные. Уровнем по умолчанию в Oracle Database 10g является 2, это означает, что CBO будет использовать динамическую выборку по непроанализированным таблицам для сбора из них необходимой статистики в ходе оптимизации запроса. Параметр можно установить в другое значение (3, 4, 5, и так до 10), чтобы получить возможность динамической выборки по проанализированным таблицам. Динамический отбор уровня 3 делает возможным вычисление селективности сложных предикатов, селективность которых имела бы "оценку", а уровня 4 делает возможным комбинированное вычисление селективности всех предикатов по одной таблице, собирая, таким образом, корреляции любых данных в их оценке селективности. Уровень 5 и выше повышает размер образца, таким образом, повышая точность результата динамической выборки. Если отключить динамическую выборку (установкой этого параметра в 0), и оптимизатор не имеет доступной статистики во время фазы оценки, то он будет использовать значения по умолчанию для оценки строк и других объектов, которые ему требуется получить. db_multiblock_read_count – Оптимизатор использует mbrc (одно из значений системной db_multiblock_read_count вычисления стоимости статистики) во сканирования время вместо компиляции таблицы и параметра запроса быстрого для полного сканирования индекса. В Oracle Database 10g, значение по умолчанию этого параметра равняется 8 (что эквивалентно размеру I/O, кратному 8 * размерстандартного-блока). Однако размер I/O по умолчанию, требующийся для выполнения запроса, определяется автоматически на уровне I/O, и устанавливается соответственно для конфигурации системы, полагаясь на объем системной статистики для точного значения объема многоблочного чтения. Параметры оптимизатора из v$sys_optimizer_env для различных версий. Параметры, относящиеся к оптимизатору, могут быть установлены на уровне сессии или изменены для одиночного SQL-выражения с помощью подсказок оптимизатора. optimizer_features_enable cursor_sharing db_file_multiblock_read_count optimizer_dynamic_sampling optimizer_index_caching optimizer_index_cost_adj optimizer_mode parallel_ddl_mode parallel_dml_mode parallel_execution_enabled parallel_query_mode parallel_threads_per_cpu pga_aggregate_ targe query_rewrite_enabled query_rewrite_integrity Skip_unusable_indexes sort_area_retained_size sort_area_size star_transformation_enabled statistics_level workarea_size_policy 10.1.0 exact 8 2 0 100 all_rows enabled disabled TRUE enabled 2 24576 KB TRUE enforced TRUE 0 65536 FALSE typical auto 9.2.0 exact 8 1 0 100 choose enabled disabled TRUE enabled 2 24576 KB FALSE enforced FALSE 0 65536 FALSE all auto 9.0.1 exact 16 na 0 100 choose enabled disabled TRUE enabled 2 24576 KB FALSE enforced FALSE 0 65536 FALSE all auto 8.1.7 exact 16 na 0 100 choose enabled disabled TRUE enabled 2 24576 KB FALSE enforced FALSE 0 65536 FALSE all auto Источники: 1. Официальный сервер Oracle, http://www.oracle.com 2. Журнал Oracle Magazine, http://www.oracle.com/technology/oramag/oracle/05-jan/o15tech_tuning.html 3. Журнал Oracle Magazine, http://www.oracle.com/technology/oramag/webcolumns/2003/techarticles/burleson_cbo_pt1.htm l