Самонастраивающаяся база данных: управляемые приложения и настройка SQL. Часть 1Источник: CITFORUM Бенуа Дагервилл, Муджес А.Минхас, Халед Ягуб, Монахем Зайт, Монахем Зиауддин, Корпорация Oracle
ВведениеЗа прошедшее десятилетие выявились две четкие тенденции:
Поэтому проблема производительности систем баз данных стала очевидной и, тем самым, весьма критичной для использования приложений в бизнесе. Одна из важных частей настройки работы систем баз данных Oracle - это настройка SQL-предложений. Настройка SQL включает в себя три основных этапа:
Эти три этапа повторяются до тех пор, пока система не достигнет удовлетворительного уровня, или до тех пор, пока не останется предложений для настройки. Эксперты - АБД или разработчики приложений, которые имеют глубокие знания в области приложений и систем баз данных, обычно производят именно такую настройку. Корректирующие действия могут включать один или несколько следующих шагов:
Процесс ручной настройки SQL ставит перед разработчиком несколько задач. Во-первых, он требует высококвалифицированной экспертной оценки в нескольких сложных областях: оптимизация запросов, разработка доступа, SQL-проектирование (design). Во-вторых, это трудоемкий процесс, потому как каждое предложение уникально и требует индивидуального решения, и, кроме того, число предложений может быть очень велико, например, больше тысячи. В-третьих, требуются глубокие знания структуры схемы (то есть, определение представлений, индексов, размеров таблиц, и т.д.) и модели используемых данных приложений. Наконец, SQL настройка является непрерывным процессом, потому что объем SQL-работы все время изменяется, например, когда используется модуль нового приложения. Далее, изменения в структуре доступа к данным (например, когда создается или удаляется индекс или материализованное представление), очень вероятно внесут изменения в планы выполнения, вынуждая разработчика приложений начать все заново. Рисунок 1 иллюстрирует ручной процесс настройки SQL.
Рисунок 1. Ручная настройка SQL Для помощи администратору базы данных (АБД) и прикладному разработчику, столкнувшихся с этой проблемой, несколько компаний, выпускающих программное обеспечение, разработали инструменты диагностики и мониторинга, которые пытаются найти узкие места работы системы базы данных и предложить действия для их устранения. Некоторые из этих инструментов делают, в большинстве случаев, очень хорошую работу. Но, как правило, это инструменты не интегрированы с системным компонентом, на который они нацелены. Например, оптимизатор запросов - это компонент системы, ответственный за планы выполнения SQL-предложений. На самом же деле, оптимизатор запросов - это "черный ящик" (black box) для этих инструментов, и поэтому они должны интерпретировать информацию вне базы данных, чтобы осуществить настройку. Как следствие, результаты их настройки менее надежны и ограничены в области действия. Кроме того, недостаток интеграции приводит к тому, что внешние инструменты всегда отстают от последних обновлений и улучшений оптимизатора запросов. В Oracle 10g большее внимание уделяется созданию самоуправляемых систем баз данных. Для осуществления автоматической настройки и мониторинга также как и в системе, работающей по требованию (on-demand), была введена опция, названная AWR (Automatic Workload Repository - автоматический репоиторий нагрузки). AWR каждые 30 минут (по умолчанию) просматривает данные производительности системы и постоянно (по умолчанию в течение 7 дней) хранит их, как историю системной рабочей нагрузки. Например, среди других функции AWR идентифицирует главные SQL-предложения, которые интенсивно расходуют ресурсы: использование процессора, чтение буферов, физические операции с дисками, вызовы синтаксического анализа (parse calls), использование разделяемой памяти и т.д. в каждом интервале времени. Другая управляющая опция ADDM (Automatic Database Diagnostics Monitor - автоматический монитор диагностики) была введена для автоматизации задачи непрерывного контроля действий системы, идентификации высокого уровня потребления системных ресурсов, и узкие места работы. В плане SQL-настройки ADDM определяет наиболнее нагруженные (high load) SQL-предложения. Была добавлена еще одна опции управления, которая автоматизирует сбор статистических данных в текущем интервале. Опция Automatic Statistic Collection доступна по умолчанию для недавно созданных баз данных Oracle 10g. В Oracle 10g процесс SQL-настройки был автоматизирован путем ввода новой управляющей опции Automatic SQL Tuning. Она одинаково хорошо предназначена для работы с приложениями, как с OLTP, так и Data Warehouse. Automatic SQL Tuning базируется на недавно добавленной автоматической возможности настройки оптимизатора запросов, называемой Automatic Tuning Optimizer. Automatic SQL Tuning доступна посредством советчика (advisor), названного SQL Tuning Advisor. SQL Tuning Advisor берет одно или несколько SQL-предложений и продуцирует хорошо настроенные планы, основываясь на рекомендациях по настройке. SQL-предложения могли быть идентифицированы при помощи ADDM, AWR или вручную. Ручной процесс может содержать, например, тестирование набора SQL-предложений, которые должны быть еще использованы, для измерения индивидуальной производительности и идентификации тех предложений, которые имеют недостаточную производительность. Для обеспечения этого в Oracle 10g мы ввели новый объект настройки, названный SQL Tuning Set (STS). Рисунок 2 дает высокоуровневое представление о том, как Automatic SQL Tuning работает в Oracle 10g.
Рисунок 2. Автоматическая настройка SQL Остальная часть статьи организована следующим образом. Во-первых, мы объясним, как работает Automatic SQL Tuning, затем детально рассмотрим Automatic Tuning Optimizer. Далее, мы опишем SQL Tuning Set, который позволяет пользователю создавать и настраивать выбранные объемы работ SQL. Затем мы введем понятие первичного интерфейса Automatic SQL Tuning, использую для этого Enterprise Manager и иллюстрируя это примерами. Мы приведем описание пакета DBMS_SQLTUNE, который группирует процедуры SQL-настройки, используемые для SQL Tuning Advisor API, а также для управления SQL Tuning Set и SQL Profiles. В заключение статьи мы подведем итог, выполнив сравнение настроек в Oracle9i и Oracle 10g. Опция Automatic SQL TuningAutomatic SQL Tuning тесно связана с оптимизатором запросов. Это дает несколько преимуществ:
Фактически Automatic SQL Tuning основана на усовершенствованной версии оптимизатора запросов. Обычный оптимизатор запросов был усовершенствован в Oracle 10g для выполнения дополнительного анализа перед процессом построения плана выполнения SQL-предложения. Мы будем называть такое состояние оптимизатора запросов, как Automatic Tuning Optimizer, для того, чтобы отличать это состояние от стандартного. Оптимизатор запросов (в обычном состоянии) имеет строгие ограничения на время и системные ресурсы, которые он может использовать для поиска наилучшего плана выполнения заданного SQL-предложения. Приемлемое время оптимизации обычно меньше секунды и не больше, чем несколько секунд. Из-за этого строгого требования оптимизатор может выполнять лишь ограниченный план поиска, используя эвристику тогда и только тогда, когда это может сократить время на оптимизацию. Следовательно, оптимизатор запросов не может выполнить трудоемкий анализ и этапы проверки перед процессом генерации плана. Напротив, выполнение Automatic Tuning Optimizer обычно занимает намного больше времени, обычно несколько минут для того чтобы выполнить необходимые исследования и этапы проверки, как части процесса настройки. Таким образом, Automatic Tuning Optimizer имеет гораздо более высокую вероятность сгенерировать хорошо отлаженный план. Automatic Tuning Optimizer использует динамический отбор и частичное выполнение (то есть, выполнение фрагментов SQL-предложений), для проверки собственной оценки стоимости, избирательности и кардинального числа (cardinality). Он также использует предысторию выполнения SQL-предложений для определения оптимальных параметров настройки (например, режима оптимизатора). Функциональные возможности Automatic Tuning Optimizer реализуются при помощи советчика SQL Tuning Advisor. SQL Tuning Advisor принимает SQL-предложение и передает его наряду с другими входными параметрами в Automatic Tuning Optimizer. Потом Automatic Tuning Optimizer выполняет четыре типа анализа в процессе генерации плана. Функциональные возможности Automatic Tuning Optimizer доступны через советчика, названного SQL Tuning Advisor. SQL Tuning Advisor принимает SQL-предложение и передает его наряду с другими входными параметрами в Automatic Tuning Optimizer. Потом Automatic Tuning Optimizer выполняет четыре типа анализа в процессе генерации плана.
Каждый тип анализа детально рассмотрен в следующей главе "Automatic Tuning Optimizer". Результаты (outputs), сгенерированные Automatic Tuning Optimizer, передаются пользователю через SQL Tuning Advisor в виде совета (advice). Совет состоит из одной или нескольких рекомендаций, каждая из которых снабжается объяснением и оценкой выгоды при осуществлении. Пользователю предоставляется возможность принятия совета, и, таким образом, настройка соответствующего SQL-предложения завершается. Automatic Tuning Optimizer вместе с SQL Tuning Advisor составляют компонент Automatic SQL Tuning сервера Oracle. Архитектура Automatic SQL Tuning, как показано на рисунке 3, иллюстрирует функциональные отношения между Automatic Tuning Optimizer и SQL Tuning Advisor. Automatic SQL Tuning является частью продвигаемой Oracle стратегии перехода на управляемую по советам модель администрирования баз данных. Модель предполагает, что для критических функций управления базой данных сервер базы данных должен дать полезный совет пользователям о том, как лучше пользоваться ими. Механизм самой базы данных теперь сделан более интеллектуальным, чтобы пользователи Oracle для управления своими базами данных наиболее оптимальным способом больше не полагались на сторонние инструменты и решения.
Рисунок 3. Архитектура опции Automatic SQL Tuning Оптимизатор автоматической настройки - Automatic Tuning OptimizerВажно обратить внимание на то, что Automatic Tuning Optimizer - это оптимизатор запросов, который работает в специальным автоматическом режиме настройки. Поэтому Automatic Tuning Optimizer выполняет те же функции, что и обычный оптимизатор запросов, но с дополнительными возможностями и функциональностью. Эта дополнительная функциональность включает в себя этапы проверки правильности собственных внутренних оценок, а также поддержки внешней информации (например, статистические данные). Сюда же включаются этапы исследования для нахождения новых путей доступа, существенно повышающих производительность, и анализ возможности проведения изменений в SQL-предложениях для эффективной обработки данных. SQL Tuning Advisor переводит оптимизатор в режим автоматической настройки, чтобы получить совет для SQL-предложении. Такой совет может состоять из различных рекомендаций от Automatic Tuning Optimizer, касающихся статистики, плана запросов, путей доступа (например, индексов) и SQL-конструкций. В дополнение к сгенерированным рекомендациям он может собрать определенную информацию для собственного использования SQL-предложением. Это - вспомогательная информация, которая будет использоваться вместе со статистикой базы данных. Automatic Tuning Optimizer использует несколько типов анализа: статистический анализ, SQL-профилирование (profiling), анализ пути доступа и анализ SQL-структуры. Каждый из этих анализов может дать отдельную рекомендацию для SQL-предложения. Статистический АнализОптимизатор запросов в обычном режиме опирается на данные статистики. Важно, чтобы статистика была своевременно собрана и сохранена для оптимизации заданного SQL-предложения. Цель анализа статистики состоит в том, чтобы проверить, не пропущены или не устарели ли эти данные. Automatic Tuning Optimizer протоколирует типы статистических данных, которые фактически используются в процессе генерации плана, который потом проверяется. Например, для предиката равенства он протоколирует статистику различных значений столбца, тогда как для предиката диапазона он регистрирует статистику минимального и максимального значения столбца. Как только запись фактически используемой статистики закончена, Automatic Tuning Optimizer продолжает проверять, имеются ли в наличии статистические данные, ассоциируемые с объектами запроса (то есть, таблица, индекс или материализованное представление). Если статистика доступна, то проверяется ее точность (то есть, свежесть и актуальность). Чтобы проверить точность статистики, он будет брать данные из соответствующего объекта запроса, и использовать выбранный результат для проверки точности. Если найдено, что статистика опущена, он сгенерирует вспомогательную информацию для выбора опущенной статистики. Если статистика доступна, но не является свежей, он сгенерирует вспомогательную информацию в форме факторов настройки несвежей статистики, так что результирующая статистика отразит текущее состояние данных. Заметим, что анализ статистики имеет два вида вывода:
Это хорошая идея для осуществления рекомендаций Analyze и повторного запуска Automatic SQL Advisor. Вспомогательная информация используется в случае, если рекомендации Analyze не были осуществлены. Вспомогательная информация сохраняется в SQL Profile, который описан в следующем разделе. Пофилирование SQL-предложений - SQL ProfilingОсновной этап проверки во время SQL-профилирования - это проверка оптимизатором запросов собственных оценок стоимости, избирательности и кардинального числа (cardinality). Существует множество факторов, которые могут вызывать большие ошибки в оценках и сподвигнуть оптимизатор на генерацию неоптимального (sub-optimal) плана. Вот некоторые из них:
Для генерации хорошего плана оптимизатором запросов важно сделать так, чтобы оценки не содержали больших ошибок. Следовательно, для Automatic Tuning Optimizer очень важно проверить точность собственных оценок и удалить или, в крайнем случае, значительно уменьшить ошибки в них. Другой причиной генерации неоптимального плана служат неправильные параметры настройки оптимизатора. Например, если пользователь собирается выбрать только несколько строк за раз и если размер результата очень велик, то с целью уменьшения времени важно провести оптимизацию: сначала для нескольких строк, а уже потом для всех. Поэтому для такого SQL-предложения важно установить режим оптимизатора first_rows, а не all_rows. В течение SQL Profiling выполняются этапы проверки Automatic Tuning Optimizer для проверки правильности своих собственных оценок. Проверка правильности состоит из анализа выборки данных путем применения к ней соответствующих предикатов. Новая оценка производится по результатам выборки данных. Эта новая оценка будет точнее, потому как размер выборки может быть в случае необходимости откорректирован для гарантированно высокого уровня точности. Новая оценка сравнивается с обычной, и, если различия будут достаточно велики, то продуцируется фактор коррекции, чтобы привести в соответствие обычную статистику с новой. Другой метод правильности проверки оценки состоит в выполнении фрагмента SQL-предложения (то есть, частичное выполнение). Метод частичного выполнения эффективнее, чем метод выборки, когда соответствующие предикаты обеспечивают эффективный доступ. Automatic Tuning Optimizer выбирает соответствующий оценочный метод проверки правильности. Automatic Tuning Optimizer для выставления правильных настроек также использует прошлую статистику выполнения SQL-предложения. Например, если текущая статистика говорит о том, что SQL-предложение в большинстве случаев выполняется частично, тогда настройку переключают в режим first_rows. Это будет выбираемая настройка для настраиваемого SQL-предложения. Automatic Tuning Optimizer формирует SQL Profile, если он сгенерировал вспомогательную информацию в течение анализа статистики (то есть, факторы настройки статистики) или в течение SQL Profiling (то есть, корректирующие факторы, настраивающие установки оптимизатора). Когда SQL Profile сформирован, он генерирует рекомендацию для пользователя по созданию SQL-профиля. Поскольку используемые для оценочной статистик методы выборки данных или частичного выполнения могут быть дорогими или отнимающими много времени процессами, то SQL Profiling не выполняется в режиме Limited (ограничено). Вам следует использовать режим Comprehensive (комплексный), чтобы позволить Automatic Tuning Optimizer сгенерировать SQL Profile. SQL ProfileSQL Profile является коллекцией вспомогательной информации, которая формируется в течение автоматической настройки SQL-предложения. Таким образом, SQL Profile для SQL-предложения является тем же, чем статистика является для таблицы или индекса. Однажды созданный SQL Profile используется оптимизатором запросов (в обычном режиме) вместе с существующей статистикой, для того чтобы сгенерировать хорошо отлаженный план для данного SQL-предложения. Когда создается SQL Profile, он постоянно хранится в словаре данных. Однажды созданный SQL Profile будет использоваться каждый раз оптимизатором запроса, при компиляции (так как оптимальный) соответствующего SQL-предложения для создания хорошо отлаженного плана. Для управления SQL Profile предоставляется полный набор функций. На рисунке 4 показан поток процессов создания и использования SQL Profile. Процесс состоит из двух отдельных стадий: стадия настройки SQL и стадия обычной оптимизации. На стадии настройки SQL АБД выбирает SQL-предложение для автоматической настройки и запускает SQL Tuning Advisor, используя GUI интерфейс Enterprise Manager или использует интерфейс командной строки (см. раздел "DBMS_SQLTUNE Package"). SQL Tuning Advisor вовлекает Automatic Tuning Optimizer, возможно, с SQL Profile в генерирование рекомендаций настройки. Если SQL Profile создан, то АБД может принять его. Когда SQL Profile создан, то он сохраняется в словаре данных. Тогда на следующей стадии, когда конечный пользователь запускает то же самое SQL-предложение, оптимизатор запросов (в обычном режиме) использует SQL Profile для генерации хорошо отлаженного плана. Использование SQL Profile остается полностью прозрачным для конечного пользователя. Очень важно заметить, что создание и использование SQL Profile не требует внесения изменений в исходный текст приложения. Это является ключом к настройке SQL-предложений, используемых пакетными приложениями.
Рисунок 4. Создание и использование SQL Profile Анализ пути доступаAutomatic Tuning Optimizer предоставляет советы и по индексам. Эффективное индексирование - это хорошо известная методика настройки, которая может значительно улучшить выполнение SQL-предложений, исключив полный просмотр данных. Любые индексные рекомендации, сгенерированные Automatic Tuning Optimizer, являются специфичными для заданного настраиваемого SQL-предложения. За счет этого обеспечивается быстрое нахождение проблемы, связанные с конкретным SQL-предложением. Поскольку Automatic Tuning Optimizer не производит анализ, как его рекомендации влияют на рабочую нагрузку SQL-предложения, он рекомендует напускать Access Advisor на SQL-предложение, чтобы представить его нагруженность. Access Advisor накапливает все советы, поставленные по нагруженности каждого SQL-предложения и объединяет их в глобальные рекомендации по полной нагруженности . Анализ SQL- структурыЧасто SQL-предложение может быть слишком ресурсоемким только потому, что оно плохо написано. Это обычно случается, когда существуют различные (но не обязательно семантически эквивалентные) способы написания предложения для достижения того же самого результата. Например, SQL-предложение может давать тот же результат, когда его оператор UNION заменяется на UNION-ALL. Тот же самый результат возможен, если для исключения порождения двойных строк, устранение дублирования делается при помощи избыточного оператора UNION. В этом случае его лучше заменить на UNION-ALL, что устранит из плана выполнений затратный этап устранения дублирования. Другой пример - это использование подзапроса NOT IN в то время, как подзапрос NOT EXIST продуцировал бы тот же результат намного более эффективно. Выяснение того, какая из этих альтернативных форм написания является наиболее эффективной - это кошмарная задача для разработчика приложений, так как она требует глубоких знаний как в области свойств данных (например, нет пустых значений в столбце), так и в области понимания семантики (то есть, смыслового значения) SQL-конструкций. Кроме того, на стадии разработки разработчики в основном сосредоточены на том, как написать SQL-предложение так, чтобы оно давало желаемый результат и улучшало производительность. Иногда простая ошибка может заставить SQL-предложение выполняться очень плохо. Хороший тому пример - это несоответствие типа столбца и значение его предиката, что по существу исключает использование индексов, даже если они существуют и доступны. Automatic Tuning Optimizer выполняет анализ SQL-структуры, чтобы обнаружить плохо написанные SQL-предложения, и рекомендует подвергнуть результат пользовательской поверке на предмет нахождения альтернативных способов написания SQL-предложения для улучшения его производительности. Для помощи в написании правильных SQL-предложений и в целях профилактики разработчики могут запускать SQL Tuning Advisor в режиме Limited. В процессе построения плана при анализе SQL-структуры Automatic Tuning Optimizer генерирует обширные аннотации и диагностики и связывает их с планом выполнения. Аннотации содержат решения, сделанные оптимизатором, и приводят основания таких решений. Используя эти основания, ассоциированные с дорогостоящими операторами плана выполнения, Automatic Tuning Optimizer дает рекомендации или о том, как переписать SQL-предложение, или о том, как изменить схему, для улучшения производительности. Существуют различные основания, связанные со структурой SQL-предложения, которые могут вызвать плохое выполнение. Часть из них -синтаксические, часть - семантические, а некоторые просто являются проблемами разработки. Мы сгруппировали эти основания по трем категориям:
|