Направление Oracle  
  Анализ настройки и функционирования экземпляра (старая версия)  


Эти материалы являются объектом авторского права и защищены законами РФ и международными соглашениями о защите авторских прав. Перед использованием материалов вы обязаны принять условия лицензионного договора на использование этих материалов, или же вы не имеете права использовать настоящие материалы

Авторская площадка "Наши орбиты" состоит из ряда тематических подразделов, являющихся моими лабораторными дневниками, содержащими записи за разное, иногда продолжительно отличающееся, время. Эти материалы призваны рассказать о прошедшем опыте, они никого ни к чему не призывают и совершенно не обязательно могут быть применимы кем-то ещё. Это только лишь истории о прошлом

статья не завершена

О тюнинге экземпляра

Задача оптимизации БД распадается на оптимизацию движка (для целей данного обзора можно говорить об оптимизации экземпляра) и оптимизацию прикладного решения. Эти две задачи не взаимозаменяемы. Как неоптимизированный экземпляр, так и неоптимизированное прикладное решение могут привести к снижению производительности вплоть до невозможности нормальной работы. Кроме того нужно сказать о проводимых в процессе эксплуатации сессионной аналитике и аналитике запросов в контексте утилизации ресурсов движка, но эти темы запланировано рассмотреть в отдельной статье цикла

Если оптимизация прикладного решения по большей части является задачей разработчика, хотя абсолютно незаслуженно иногда её пытаются вручить в нагрузку администратору БД, то оптимизация экземпляра является непосредственной задачей именно администратора. Хотя найти проблемные запросы, выкатить по ним статистику утилизации ресурсов движка и передать разработчику также непосредственная задача администратора

Оптимизация экземпляра по большей части сводится к оптимизации работы компонент, рассмотренных как базовые понятия в первой статье цикла с учётом характера нагрузки на базу, а также мониторинга и анализа функционирования экземпляра для выявления узких мест и перспективных требований

Для решения этих задач СУБД Oracle ведёт детальную статистику деятельности экземпляра несколько сотен параметров, а также статистику событий ожидания, возникающих при невозможности движка выполнить ту или иную задачу в силу занятости некоторого ресурса тоже несколько сотен предопределённых событий ожидания

Знание о связях и взаимном влиянии компонент движка, а также о соответствии параметров статистики и событий ожидания функционированию той или иной компоненты позволяет решать задачи оптимизации экземпляра с той или иной степенью «мастерства», напрямую зависящей от адекватности картины устройства СУБД и достаточной детальности этой картины

В настоящем обзоре не ставится задача детально описать оптимизацию экземпляра. Гораздо важнее предложить читателю некий каркас предварительных исследований, по которому можно идти как по списку для определения диагноза. Однако нужно понимать, что в силу большого количества взаимосвязанных компонент, специфики прикладных задач и их реализации, профиля нагрузки и особенностей аппаратной платформы полной формализации достигнуть никогда не получится. После грубого определения диагноза методы корректировки могут быть выведены из знания взаимодействия компонент движка и всей специфики, однако рекомендации Oracle говорят о том, что большая часть тюнинга - это тюнинг приложения, что является задачей разработчиков и специалистов поддержки прикладного решения

Добиться существенной компенсации работы "криво" разработанной прикладной части средствами тюнинга экземпляра, равно как и наращиванием мощности аппаратной платформы, в общем случае малореально, а в частных случаях возможны несущественные выигрыши. Об этом говорит руководство по тюннгу экземпляра, и гораздо более жёстко об этом говорят такие признанные специалисты - практики, как Том Кайт. Этот постулат лучше сразу принять за аксиому, ибо последующий опыт только подтверждает его. Задачей администратора является оптимальная конфигурация движка, обеспечение корректных условий для работы оптимизатора и тому подобные "системные" задачи, но не оптимизация прикладного решения и отдельных запросов в частности. Ниже будет представлен скелетный алгоритм анализа функционирования экземпляра и даны пояснения к нему в разрезе следующих акцентов

  • инструменты администрирования, сбора и анализа (коллекторы, формы аналитики и построение графиков), не требующие дополнительных лицензионных отчислений, и требующие лицензирования
  • анализ статистик на предмет достаточности и оптимальности конфигурирования компонент экземпляра (за недавний и за относительно разумный диапазон)
  • анализ событий ожидания экземпляра (за недавний и относительно разумный диапазон)
  • анализ профиля загрузки

Инструменты администрирования

Как накапливаются данные статистики и событий ожидания ? В общем случае это счётчики, монотонно возрастающие с момента старта экземпляра и доступный как таблицы и представления через стандартные SQL запросы. Таким образом считав значение какого-либо счётчика сейчас и через десять минут, можно увидеть приращение за эти десять минут. Такие счётчики статистики и событий ожидания ведутся как на экземпляр в целом, так и с несколько большей детализацией - на текущие сессии. Это базовый механизм

На базовый механизм, являющийся не самым удобным для непосредственного использования, могут быть надстроены различные расширения. Например Oracle поставляет пакет statspack, не стоящий дополнительных денег, и реализующий периодический съём значений счётчиков и сохранение их в базе, а также построение отчёта по двум указанным точкам среза. Важно, что это стандартный механизм, и что он не требует дополнительных отчислений

Учёт по текущим сессиям, аналогичный ASH, такой механизм не обеспечивает (и вообще охват сессионной статистики пакетом Statspack разнится от версии к версии движка, в 9-й версии он был шире, чем в 11), однако позволяет как посмотреть на состояние экземпляра в динамике, так и выявить наиболее тяжёлые запросы за указанный период. Однако аналитика запросов подразумевает использование смежных периодов и корректное конфигурирование библиотечного кэша - его должно хватать для сохранения информации по SQL запросам без вытеснения от одной точки среза до следующей - иначе статистика просто будет неадекватна. Что касается сессионной статистики - "наклепать" некоторый аналог ASH вполне реально, только вот аналитический интервал в 10 секунд он обеспечивать не будет, но ведь это и не всегда нужно

Расширением механизма Statspack является AWR, хранящий уже величину приращения, а также сохраняющий данные по наиболее тяжёлым сессиям ASH. Этот механизм поставляется в составе СУБД, однако требует дополнительных лицензионных отчислений, о чём знают не все, и стоимость лицензии на Tuning Pack довольно высока. Именно из AWR графическая консоль администратора от Oracle (DB Console и Oracle Management Server) берёт информацию для построения любимых администраторами БД наглядных графиков работы экземпляра, и далеко не все догадываются, что, не лицензировав эту, включёную по умолчанию. опцию (Diagnostic Pack, включает ADDM, AWR и др. опции, $5000 за сокет, что сопоставимо со стоимостью сокета для редакции Standart Edition самой СУБД), они являются пиратами. Хотя, конечно, этот вопрос каждому стоит прояснить для себя из официальных источников

Вместе с тем, за исключением ASH, совсем неполной альтернативой которому является съём сессионных статистик либо триггером по окончании сессии, либо периодическим заданием, получить информацию о статистиках и событиях ожидания можно как напрямую из представлений счётчиков, являющихся базовым механизмом, так и из statspack, который может быть развёрнут без дополнительных лицензионных отчислений. Конечно без своих доработок это будет не так красиво, совсем не так удобно и без графиков, да и вглубь придётся влезть больше. Но возможно оно того стоит - ведь не всегда компания, в которой вы работаете, готова будет лицензировать топовые решения и дополнительные опции СУБД, да и агрегирующую надстройку написать не очень сложно

В качестве инструментов для администрирования, сбора статистик и проведения аналитики автор придерживается смешанного подхода. Если лицензирование вам позволяет - необходимо использовать поставляемые Oracle графические консоли и AWR. Но только как дополнение к «самописным» инструментам, позволяющим более глубоко понимать отдельные тонкости и грани работы СУБД

В документации Oracle сплошь и рядом приводятся примеры SQL запросов, отражающих тот или иной аспект функционирования движка. Это работает, но не всегда удобно, особенно если баз больше, чем две три. Решением автора является разработка модульной WEB консоли, обеспечивающей быстрое переключение между базами и отработку различных запросов, отражающих текущее состояние базы

Этот продукт автора называется ОрСиМОН БЕССТ и предназначен для удобного доступа к текущему состоянию БД и обеспечивает быструю модификацию отдельных модулей при выявлении каких либо неточностей или необходимости дополнения. Средства разработки Perl/HTML/CGI. Такой подход, на взгляд автора, более нагляден, удобен и прост. Однако этот продукт не обеспечивает сбора и анализа статистик, но является удобной формой к административным представлениям БД

Сбор и анализ статистик обеспечивает другой продукт автора коллектор статистик. Этот инструмент использует в качестве начального коллектора статистик штатный инструмент Oracle пакет statspack. Периодически производится опрос данных statspack модулями авторского коллектора, и подкачка ранее не обработанных данных в единую базу коллектора. Такой подход позволяет организовать мало зависимое от качества канала решение по сбору статистических данных локальных и удалённых баз в единую базу, а также позволяет выбирать отдельные параметры для сохранения в единой базе коллектора, обращаясь к другим параметрам штатным методом работы с пакетом statspack

В процессе обработки производится вычисление величин приращений из данных кумулятивных счётчиков, хранимых statspack. В дальнейшем собранная статистическая информация обрабатывается отдельными аналитическими модулями коллектора и отдаётся администратору через браузер. Также продукт содержит форму мониторинга, производящую опрос баз в режиме реального времени и отдающую информацию по всем базовым параметрам наличию доступность баз, создание резервных копий, ошибок в alert, блокировок, утилизации табличных пространств с учётом авторасширения и т.п.

Модульная архитектура этого продукта позволяет наращивать функциональность по мере необходимости. Коллектор статистик разрабатывался для работы с версией движка 9i, написан на Pl/SQL, Perl и Shell, для отдачи информации пользователю используется Oracle HTTP server, с привлечением modPlSQL для форм аналитики на Pl/SQL и просто функциональность Apache для CGI форм на shell и perl. Разработка этого инструмента была заморожена автором в 2008 году в силу ряда причин

Администратор БД может создать свои продукты, аналогичные описанным авторским, для получения в чём то более удобных инструментов, чем предлагаемые штатные. И именно поэтому здесь говорится о продуктах автора цикла статей по мере приобретения опыта или сразу вы можете компоновать свой набор инструментария в дополнение к поставляемому компанией Oracle штатно, потому что удобство работы важный аспект для получения более качественного результата

Для построения графиков могут использоваться специализированные UNIX инструменты, например графическая библиотека GD с многочисленными программными интерфейсами, или такие утилиты, как GNUPlot, о чём запланирована отдельная статья

Что касается инструментов, предоставляемых Oracle, то, как уже говорилось, их использование в дополнение к другим инструментам приветствуется, они предоставляют некоторый набор функционала, удобный в первую очередь для получения наглядных графиков и «взвешенной» аналитики масштаба экземпляра и сессий, но скрывают тонкости реализации и требуют дополнительного лицензирования AWR

Сказанное касается инструментов, напрямую работающих с СУБД. Однако важно также получать и анализировать статистику операционной системы, с чем вполне справляются штатные утилиты ОС UNIX (напоминаю, что настоящий цикл ориентирован на IT специалистов - юниксоидов), такие, как sar, vmstat и т.д. Более детально использование таких утилит автор рассматривает в своей отдельной статье. Кроме того администраторы БД могут разработать надстройки над стандартными утилитами UNIX, аналогичные компоненте "коллектора и анализа статистики ОС" авторской системы КоСиКУЛС БЕССТ, в частности в разделе скриншотов представлены формы агрегации, анализа и построения графиков компоненты

Анализ статистик на достаточность и оптимальность конфигурирования компонент

Для анализа достаточности и оптимальности конфигурации отдельных компонент экземпляра существует набор статистических показателей, сведения о которых сведены в таблице ниже. Этот набор не является полным, но отражает основные направления анализа. Кроме этих показателей необходимо анализировать возникновение и величины событий ожидания, о чём будет сказано в этом и следующем разделе

Достаточность является критичным показателем, оптимальность опциональна, она позволяет по возможности уменьшить выделенные экземпляру ресурсы до величин, которые ещё не влияет на ухудшение производительности движка

ПоказательОписание и применение
Память SGA - Кэш буферов
Коэффициент попадания Основное. Параметр должен стремиться к 100%, однако много зависит от специфики прикладного решения. Если коэффициент попадание не высок, это возможный симптом проблем, но это не обязательно значит, что увеличение размера кэша буферов даст результат. Например OLTP, работающие на ввод информации, могут разово использовать каждую строчку даных, и смысла в вычислении коэффициента попадания не будет
-- из представления со статистиками V$SYSSTAT
Hit Ratio = 1 - ((physical reads - physical reads direct - physical reads direct (lob)) / (db block gets +
            consistent gets - physical reads direct - physical reads direct (lob))
-- из  V$BUFFER_POOL_STATISTICS
SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,
       1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)) "Hit Ratio"
       FROM V$BUFFER_POOL_STATISTICS;
       
Занимаемых буферов по - объектно Вспомогательное. Является вспомогательным критерием, который может, например, выявить неоптимальное использование объектов, например full scan там, где его оптимальнее избежать
COLUMN object_name FORMAT a40
COLUMN number_of_blocks FORMAT 999,999,999,999
SELECT o.object_name, COUNT(1) number_of_blocks 
       FROM DBA_OBJECTS o, V$BH bh
       WHERE o.object_id  = bh.objd AND o.owner != 'SYS'
       GROUP BY o.object_name ORDER BY count(1);
При выделении дополнительных буферов долгого и быстрого хранения Вспомогательное. Является дополнительным критерием при явном выделении и использовании буферов длительного хранения и корзины
SELECT SIZE_FOR_ESTIMATE, BUFFERS_FOR_ESTIMATE, 
       ESTD_PHYSICAL_READ_FACTOR, ESTD_PHYSICAL_READS
       FROM V$DB_CACHE_ADVICE
       WHERE NAME = 'KEEP'
             AND BLOCK_SIZE = (SELECT VALUE FROM V$PARAMETER 
                                      WHERE NAME = 'db_block_size')
             AND ADVICE_STATUS = 'ON';
Память SGA - Библиотечный кэш
Коэффициент попадания Основное. Параметр отражает базовую эффективность использования библиотечного кэша
SELECT namespace, sum(pins), sum(pinhits), sum(pins) / sum(pinhits) hitratio 
       FROM V$LIBRARYCACHE ORDER BY namespace ;
Перезагрузки и инвалидации Основное. Параметры переразборов (reloads) и инвалидации (например из за DDL) должны стремиться к нулю
SELECT namespace, pins, pinhits, reloads, invalidations
       FROM V$LIBRARYCACHE ORDER BY namespace ;
Соотношение исполнений SQL запросов, «полных» и «мягких» разборов Основное. Важным показателем для OLTP систем является относительно невысокое количество полных разборов к неполным (мягким), что свидетельствует об эффективной архитектуре прикладного решения, использующей, в частности, связанные (binding) переменные. Количество исполнений (executions) является дополнительным информационным фактором. Эта информация доступна в представлении статистик экземпляра (V$SYSSTAT) и сессий (V$SESSTAT)

Основное. Коэффициент "parse time CPU / parse time elapsed" отражает время отработки парсинга и должен стремиться к 1, что говорит об отсутствии ожиданий ресурсов (защёлок и т.п.) в процессе парсинга. Коэффициент "parse time CPU / CPU used by this session" время, используемое для парсинга относительно общего времени сессии, искомое приближение к нулю говорит о том, что время на парсинг не тратится
SELECT NAME, VALUE FROM V$SYSSTAT
       WHERE NAME IN ('parse time cpu', 'parse time elapsed',
                      'parse count (hard)',
                      'CPU used by this session' );
Вспомогательное. Кроме того удобным является вывод информации с группировкой по первой части SQL запросов
col sql_text for a90
select UPPER(substr(sql_text,0,70)) AS SQL_TEXT, 
       sum(version_count) COUNT, sum(parse_calls) PARSE, 
       sum(executions) EXEC, sum(SHARABLE_MEM) MEM
       from v$sqlarea group by UPPER(substr(sql_text,0,70))
       having sum(version_count) > 25 order by 2 ;
Наличие свободной памяти shared pool в часы пик Основное. Т.к. библиотечный кэш является частью разделяемого пула, важным показателем является остаток свободной памяти разделяемого пула в часы пик
SELECT * FROM V$SGASTAT 
       WHERE NAME = 'free memory' AND 
                      POOL = 'shared pool';
Распределение памяти по типам объектов Вспомогательное. Является вспомогательным информационным критерием, представление V$LIBRARY_CACHE_MEMORY отражает распределение памяти в библиотечном кэше по типам объектов
Использование аналитических (advisor) - представлений Вспомогательное. Представление V$SHARED_POOL_ADVICE отражает ожидаемое движком СУБД время разбора при изменении размера shared pool, и может быть использовано как дополнительный источник информации
Память SGA - Кэш словаря
Коэффициент попадания Основное. Отражает эффективность использования кэша словаря. Может отражать неэффективное прикладное решение (например, одновременное интенсивное использование DDL и DML операторов на одном объекте)
column parameter format a21
column pct_succ_gets format 999.9
column updates format 999,999,999
SELECT parameter, sum(gets), sum(getmisses), 
       100*sum(gets - getmisses) / sum(gets) pct_succ_gets, 
       sum(modifications) updates
       FROM V$ROWCACHE WHERE gets > 0
       GROUP BY parameter ;

SELECT (SUM(GETS - GETMISSES - FIXED)) / SUM(GETS) 
       "ROW CACHE" FROM V$ROWCACHE;       
Использование разгружающих режимов LMT и автоматическое управление экстентами Вспомогательное. Исследуется наличие или отсутствие, крайне рекомендуется использовать для снятия дополнительной нагрузки со словаря
Память SGA - Резервный пул
Контроль работы резервного пула, являющегося частью разделяемого пула (по умолчанию резервируется 5%, регулируется параметром SHARED_POOL_RESERVED_SIZE) Основное. V$SHARED_POOL_RESERVED, причём если есть память для увеличения SGA, цель - обеспечить стремление к нулю REQUEST_MISSES, если же размер памяти ограничен, то цель не получать REQUEST_FAILURES или хотя бы ограничить их рост. Рекомендации таковы:
  • резервный пул слишком мал, если значение REQUEST_FAILURES больше нуля и растет. Увеличивать резервный пул и разделяемый пул вообще
  • резервный пул слишком велик, если REQUEST_MISSES равно нулю и не растет, а FREE_MEMORY больше 50% от SHARED_POOL_RESERVED_SIZE. Уменьшать резервный пул
  • индицируется недостаточность shared pool - если REQUEST_FAILURES больше нуля и растет, то при включении резервного пула (SHARED_POOL_RESERVED_SIZE больше нуля) необходимо уменьшить размер резервного пула, а при выключенном резервном пуле - увеличивать размер SHARED_POOL_SIZE
Память SGA - Буфер оперативных журналов
Контроль статистик Основное. Статистика 'redo buffer allocation retries' должна стремиться к нулю и не должна увеличиваться
SELECT NAME, VALUE FROM V$SYSSTAT
       WHERE NAME = 'redo buffer allocation retries';
Контроль событий ожидания Основное. Событие ожидания 'log buffer space', чем оно реже и короче, тем адекватнее сконфигурирован буфер. При существенных значениях этого события ожидания нужно выверить статистику 'redo buffer allocation retries' в V$SYSSTAT, конфигурацию log buffer, носители для redo logs
Тюнинг носителя Вспомогательное. Рекомендуется выносить оперативные журналы на отдельные шпинделя. Однако в случае использования выделенных массивов с большим количеством шпинделей, от десяти, вынос оперативных журналов может не принести никакой выгоды
Ввод/вывод оперативных журналов
События ожидания записи в оперативные журналы Основное. При существенных величинах события 'log file sync' обратить внимание на конфигурацию носителей redo logs и скорость (количество) транзакций (commits + rollbacks) за секунду в V$SYSSTAT

Основное. Событие 'redo log space requests' говорит о недоступности не буфера, но оперативных журналов. Может помочь тюнинг checkpoints, DBWR или процессов архивирования
Скорость роста и частота переключения оперативных журналов Вспомогательное. Рекомендуется выводить на 1 переключение в 20 минут, однако зависит от архитектуры решения. Например, для организации «ручного» standby - оптимальнее переключать журналы чаще например, 1 раз в 5 минут - это уменьшает время потери данных при крахе основного сервера
Динамика генерации журнальной информации Основное. Важный показатель, отражающий объём генерируемой журнальной информации фактически показывает требуемое под хранение архивных журналов ёмкость накопителей. Имеет смысл обратить внимание на среднюю и пиковую скорость генерации журнальной информации, и обеспечить полуторный относительно пикового размер накопителей под архивные журналы

Одним из вариантов вычисления размера генерируемой журнальной информации является вычисление размеров сохранёных архивных журналов за определённый периоды времени. Кроме того информацию о максимальной и средней скорости генерации журнальной информации в байтах в секунду можно получить из административных представлений СУБД. Важно, что при этом вы должны активировать режим ARCHIVE_LOG. Оба эти варианта используют метод косвенного вычисления через информацию об оперативных журналах, но это довольно точный метод
SELECT AVG(lsize), MAX(lsize)
       FROM (SELECT (BLOCKS * BLOCK_SIZE)/((NEXT_TIME - FIRST_TIME) * 86400)
            as lsize
       FROM V$ARCHIVED_LOG) ;
Память - PGA
Соотношение оптимальных, однопроходных и многопроходных сортировок Необходимо стремиться к оптимальным сортировкам, а однопроходные и многопроходные сводить к минимуму
Основное. Распределение по типу выделенного PGA
SELECT LOW_OPTIMAL_SIZE/1024 low_kb, 
       (HIGH_OPTIMAL_SIZE+1)/1024 high_kb,
       OPTIMAL_EXECUTIONS, ONEPASS_EXECUTIONS, 
       MULTIPASSES_EXECUTIONS
       FROM V$SQL_WORKAREA_HISTOGRAM 
       WHERE TOTAL_EXECUTIONS != 0 ;
Основное. Процент распределения по типам сортировок
SELECT optimal_count, round(optimal_count*100/total, 2) optimal_perc, 
       onepass_count, round(onepass_count*100/total, 2) onepass_perc,
       multipass_count, round(multipass_count*100/total, 2) multipass_perc
       FROM (SELECT decode(sum(total_executions), 0, 1, sum(total_executions)) total,
                    sum(OPTIMAL_EXECUTIONS) optimal_count,
                    sum(ONEPASS_EXECUTIONS) onepass_count,
                    sum(MULTIPASSES_EXECUTIONS) multipass_count
                    FROM v$sql_workarea_histogram
                    WHERE low_optimal_size > 64*1024) ;
Вспомогательное. по - сессионо курсоры с одной или несколькими рабочими областями в режиме one-pass или multi-pass
col sql_text format A80 wrap 
SELECT sql_text, sum(ONEPASS_EXECUTIONS) onepass_cnt,
       sum(MULTIPASSES_EXECUTIONS) mpass_cnt 
FROM V$SQL s, V$SQL_WORKAREA wa 
WHERE s.address = wa.address 
GROUP BY sql_text 
HAVING sum(ONEPASS_EXECUTIONS+MULTIPASSES_EXECUTIONS)>0;
Вспомогательное. по - сессионо по данным ADDRESS и HASH_VALUE можно вычислить текущий план исполнения, соответствующий рабочей области
col "O/1/M" format a10
col name format a20
SELECT operation, options, object_name name, trunc(bytes/1024/1024) "input(MB)",
       trunc(last_memory_used/1024) last_mem, trunc(estimated_optimal_size/1024) 
            optimal_mem, 
       trunc(estimated_onepass_size/1024) onepass_mem,
       decode(optimal_executions, null, null, 
              optimal_executions||'/'||onepass_executions||'/'||
              multipasses_executions) "O/1/M"
       FROM V$SQL_PLAN p, V$SQL_WORKAREA w 
       WHERE p.address=w.address(+) 
             AND p.hash_value=w.hash_value(+) 
             AND p.id=w.operation_id(+) 
             AND p.address='88BB460C'
             AND p.hash_value=3738161960 ;
Общее количество сортировок Вспомогательное. по - запросно. Параметр отражает количество сортировок для SQL запросов. Это могут быть сортировки для обеспечения соединений, группировок, упорядочивания
SELECT HASH_VALUE, SQL_TEXT, SORTS, EXECUTIONS
       FROM V$SQLAREA ORDER BY SORTS;
Соотношение сортировок в памяти и дисковых Основное. Необходимо сводить дисковые сортировки к нулю
SELECT NAME, VALUE FROM V$SYSSTAT
       WHERE NAME IN ('sorts (memory)', 'sorts (disk)') ;
посессионная статистика PGA Вспомогательное. Параметр позволяет выявить использование PGA текущими сессиями
SELECT PROGRAM, PGA_USED_MEM, PGA_ALLOC_MEM, PGA_MAX_MEM 
       FROM V$PROCESS;

-- 10 жрущих больше всего памяти
SELECT * FROM ( SELECT workarea_address, operation_type, policy, estimated_optimal_size
                       FROM V$SQL_WORKAREA
                       ORDER BY estimated_optimal_size )
         WHERE ROWNUM <= 10 ;
Также полезно получать информацию о количестве рабочих областей с различными типами размеров, для чего можно использовать представления V$SYSSTAT и v$SESSTAT
SELECT name profile, cnt, decode(total, 0, 0, round(cnt*100/total)) percentage
    FROM (SELECT name, value cnt, (sum(value) over ()) total
    FROM V$SYSSTAT 
    WHERE name like 'workarea exec%');
Использование аналитических (advisor) представлений Вспомогательное. Для использования необходимо включить PGA_AGGREGATE_TARGET и установить STATISTICS_LEVEL в TYPICAL или ALL. Применительно к V$PGA_TARGET_ADVICE необходимо избегать попадания в зону overhead (столбец ESTD_OVERALLOC_COUNT представления V$PGA_TARGET_ADVICE), а также стремиться к увеличению hit ratio. Представление V$PGA_TARGET_ADVICE_HISTOGRAM отражает отработку с оптимальным, одно- и многопроходным размером work area
SELECT LOW_OPTIMAL_SIZE/1024 low_kb, (HIGH_OPTIMAL_SIZE+1)/1024 high_kb, 
       estd_optimal_executions estd_opt_cnt, 
       estd_onepass_executions estd_onepass_cnt, 
       estd_multipasses_executions estd_mpass_cnt 
       FROM v$pga_target_advice_histogram 
       WHERE pga_target_factor = 2 AND estd_total_executions != 0 
       ORDER BY 1 ;
Ввод/вывод данных
Анализ взвешенных статистик файлов данных Основное. Представление v$filestat отражает статистики ввода - вывода по отдельным файлам данных. Анализ этих статистик, взвешенний относительно суммарных величин, позволяет выявить аномальную активность ввода/вывода отдельных файлов данных. Такая активность может свидетельствовать о существовании так называемых "горячих" блоков. При фиксации симптома аномальной активности имеет смысл собирать информацию о текущих событиях ожидания отдельных сессий, для возможного выявления "горячих" блоков
Контроль событий ожидания  
Разнесение по шпинделям Вспомогательное. Как и во всех случаях, когда рекомендуется выделение отдельных физических носителей, истина не окончательна. Примером служит использование промышленных сетевых хранилищ, которые, в отдельных случаях, могут делать подобную рекомендацию не столь однозначной. При большом количестве (несколько десятков) шпинделей, по которым размазываются операции ввода/вывода, выделение отдельных шпинделей под оперативные журналы, файлы данных и т.п. может оказаться неэффективным, и даже менее предпочтительным. Также стоит упомянуть, что рекомендация разнесения файлов данных таблиц и индексов в силу последовательной записи может оказаться не очень эффективным в контексте уменьшения конкуренции за ввод/вывод
Ввод/вывод архивных журналов
Скорость роста журнальной информации Основное. Важный показатель, отражающий объём генерируемой журнальной информации фактически показывает требуемое под хранение архивных журналов ёмкость накопителей. Имеет смысл обратить внимание на среднюю и пиковую скорость генерации журнальной информации, и обеспечить полуторный относительно пикового размер накопителей под архивные журналы

Одним из вариантов вычисления размера генерируемой журнальной информации является вычисление размеров сохранёных архивных журналов за определённый периоды времени. Кроме того информацию о максимальной и средней скорости генерации журнальной информации в байтах в секунду можно получить из административных представлений СУБД. Важно, что при этом вы должны активировать режим ARCHIVE_LOG
SELECT AVG(lsize), MAX(lsize)
       FROM (SELECT (BLOCKS * BLOCK_SIZE)/((NEXT_TIME - FIRST_TIME) * 86400)
                    as lsize
                    FROM V$ARCHIVED_LOG) ;
Выделение шпинделей архивным журналам  
Контроль событий ожидания  
Утилизация CPU
Соотношение общего и эффективного времени CPU Основное. Отражает время CPU, потраченное на обработку запросов и времени различных ожиданий, расходуемого непроизводительно. События ожидания, когда движок СУБД вынужденно простаивает, фиксируются системой статистики СУБД и могут быть проанализированны на предмет выявления узких мест и проблем в конфигурации и прикладном решении
Соотношение времени разборов и исполнения Основное. Параметр отражает как эффективность использования библиотечного кэша, так и особенности функционирования системы. Например ситуация, при которой время разборов превышает время исполнения, обычно является симптомом проблем в прикладном решении
Соотношение утилизации CPU СУБД и иными процессами  
Обнаружение блокировок
Контроль событий ожидания Основное. События ожидания enqueue свидетельствуют о наличии блокировок, вызывающих простой других сессий. Анализ взвешенного относительно общего времени работы экземпляра времени события ожидания enqueue говорит о той или иной степени интенсивности нежелательных блокировок, которые обычно вызваны особенностями реализации прикладного решения
Блокирующие другие сессии Вспомогательное. по - сессионный параметр. Индицирует наличие блокировок, вызывающих простой других сессий в силу занятости требуемых им ресурсов. Обнаружение таких блокировок отличается для версии 9i, где используется представление v$lock в самосоединении с собой, и последующие вресии, в которых старый метод отрабатывает со сбоями в силу изменения определения этого представления. Вместо v$lock для версий 10 и далее предлагается использовать специально выделенное поле в представлении v$session, отражающее SID блокирующей текущую сессии, и представления dba_ddl_locks и dba_dml_locks
Утилизация пространства отмены (UNDO)
Скорость роста информации отмены и достаточность размера Основное. Средняя скорость роста информации отмены, умноженная на требуемое время хранения прежних версий данных, дадут искомый размер пространства UNDO. Однако всё зависит от профиля нагрузки, стоит контролировать как среднюю, так и пиковую скорости. Информация о размере информации отмены отражается в представлении V$UNDOSTAT в виде десятиминутных интервалов. Для вычисления средней скорости и пиковой в блоках за секунду можно использовать запрос
SELECT AVG(usize), MAX(usize) 
       FROM (SELECT sum(UNDOBLKS)/sum((END_TIME - BEGIN_TIME) * 86400)
                    as usize
                    FROM V$UNDOSTAT) ;
Отсутствие ошибок Основное. Важным симптомом достаточности конфигурации UNDO является отсутствие ошибок типа ORA-1555 (snapshot too old). Появление таких ошибок для ручного, ныне почти не используемого, режима свидетельствует о недостаточности размера сегментов отмены. Для автоматического режима следующим шагом является расширение объёма пространства отмены и установка корректного значение параметра UNDO_RETENTION
Утилизация временных табличных пространств
Контроль утилизации по - сессионный параметр. Отражает утилизацию временных табличных пространств отдельными сессиями, может свидетельствовать, например, о наличии неэффективных дисковых сортирововк
Дополнительные параметры контроля
Контроль параметров утилизации ОС Основное. Контроль статистик операционной системы является самым первым шагом, который необходимо делать при первоначальном и последующих регламентных (периодических) исследованиях серверов СУБД. Статистики ОС как минимум отвечают на вопрос о достаточности или недостаточности аппраратных ресурсов для существующей конфигурации

Как и все другие параметры, статистики ОС наиболее целесообразно исследовать в динамике за продолжительный период времени с небольшими отрезками группировок. Примером обеспечивающего решение инструментария является компонента "коллектора и анализа статистики ОС" авторской системы КоСиКУЛС БЕССТ. В этом продукте для сбора статистик ОС используется СУБД PostgreeSQL, но не Oracle
Динамика роста базы Вспомогательное. Важный показатель, учёт которого позволяет избежать ситуации, при которой ёмкости используемых хранилищ может "внезапно оказаться недостаточно"
Динамика роста отдельных объектов Вспомогательное. Отдельные объекты могут расти существенно быстрее, чем другие. Анализ динамики роста объектов может выявить кандидатов на изменение параметров хранения, с том числе INITRANS, PCTUSED, PCTFREE, NEXT(EXTENT), MAXEXTENTS и т.п.
Контроль динамики утилизации ёмкости накопителей Вспомогательное. Утилизация физических накопителей в динамике позволяет предсказать достаточность или требуемое увеличение ёмкости

Анализ описанных параметров должен проводится в динамике, оптимальным является построение ряда приращений исследуемых параметров за относительно небольшие интервалы на протяжении некоторого отрезка времени. Здесь на первый план выходит наличие соответствующего инструментария, без которого сделать такой анализ не представляется возможным

Штатные инструменты типа statspack могут сравнивать только две точки среза, тогда как оптимальным является построение ряда данных по нескольким десяткам или даже сотням последовательных точек среза, возможно с построением графиков. Альтернативой является использование ADDM/AWR и DBConsole/OMS, но это путь, требующий дополнительного лицензирования и предполагающий только заложенную функциональность. Или же можно использовать самописные инструменты, позволяющие неограниченно расширять функциональность в соответствии с пониманием администратора, в том числе обеспечивающие группировку по дням, часам и т.п.

Также важно, что такой анализ возможен только при предварительном сборе статистической информации, что делается не всегда. Чудес не бывает для обеспечения результата должны быть сформированы определённые условия, а именно предварительный сбор статистик

Итак, в случае, когда указанные параметры находятся в пределах нормы, и проведённый параллельно анализ событий ожидания (о чём в следующем разделе) не выявил аномалий, а анализ утилизации аппаратных ресурсов средствами ОС не выявил нехватки каких либо ресурсов - можно говорить о достаточно качественном функционировании экземпляра, и об отсутствии основных «узких мест». В таком состоянии движок сконфигурирован достаточно оптимально и на существующей аппаратной платформе дальнейшая оптимизация работы решения должна вестись в сторону оптимизации прикладной части, а при необходимости - и аппаратной платформы. В случае же, когда отдельные из указанных параметров выходят за пределы нормы, необходимо провести дополнительное конфигурирование экземпляра

Анализ событий ожидания экземпляра

В процессе обработки пользовательских запросов и других функций движок СУБД может столкнуться с ситуацией, когда какие либо ресурсы заняты, и в этом случае ему приходится ждать освобождения требуемых ресурсов. Такие "события ожидания" являются непроизводительными, и их возникновение и характеристики движок отслеживает и сохраняет в процессе работы экземпляра. Информация о событиях ожидания доступна через административные представления, например V$SYS_EVENT и V$SESS_EVENT, и может быть проанализирована администратором для выявления проблемных мест

Фактически анализ событий ожидания, вместе с анализом основных статистических показателей и анализом статистик ОС, является основным методом контроля функционирования движка СУБД, и обеспечивает принятие обоснованных решений по оптимизации. Как и информация по статистикам, информация по событиям ожидания хранится в кумулятивных счётчиках, расположенных в памяти и доступных через административные представления. Как и для статистик, существуют разнообразные надстройки, позволяющие периодически сохранять информацию о событиях ожидания и анализировать её. К штатным надстройкам относятся statspack, не требующий дополнительного лицензирования, и AWR, входяхий в отдельно лицензируемый пакет ADDM. Штатные графические консоли DBConsole и консоль OMS используют информацию AWR, что подразумевает предварительное лицензирование пакета ADDM

Что можно добавить к штатным консолям ? Как всегда самописные решения. Сбор информации о событиях ожидания и вычисления "дельт", дающих приращения для рассматриваемого периода (периодов) времени можно организовать как на основе использования statspack, так и на основе непосредственного периодического съёма информации с административных представлений кумулятивных счётчиков экземпляра. В дальнейшем потребуется аналитика собранной информации. и здесь можно использовать мощь самописных решений для формирования требуемых администратору результатов

Важным моментом является существование так называемых "фиктивных" событий ожидания, отражающих не непроизводительные ожидания ресурсов, но простой в силу отсутствия заданий для обработки. Такие фиктивные события ожидания отражаются вместе с непроизводительными ожиданиями и не должны учитываться при проведении анализа и поиска узких мест. Фиктивные события ожидания описаны в административном представлении STATS$IDLE_EVENT (события простоя)

Другим важным моментом является необязательная, но крайне желательная возможность сбора дополнительной информации по событиям ожидания, относящаяся ко времени ожиданий. Эта возможность включается установкой инициализационного параметра движка TIMED_STATISTICS в ON, и обеспечивает адекватную аналитику с учётом не только количества возникновения событий ожидания, но и времени ожидания для каждого события. Без включения этой возможности анализ событий ожидания становится гораздо менее продуктивным

Ещё одним важным аспектом является различная детализация. Движок СУБД поддерживает сбор статистики и информации о бобытиях ожидания как для экземпляра в целом, так и для каждой текущей сессии. Информация о событиях ожидания для текущих сессий имеет существенно больший уровень детализации. Например, события ожидания текущих сессий могут отразить не только факт ожидания чтения информации в кэш буферов, но и указывают на конкретный файл и блок. Для агрегирующих представлений масштаба экземпляра такая информация уже недоступна, так как файли и блоки каждый раз будут разные, однако суммарная информация содержит данные об общем времени простоя по причине указанного события ожидания, и для анализа в масштабе экземпляра это вполне достаточная информация. Потом можно спускаться "ниже", но углублённый и сессионный анализ планируется рассмотреть отдельно в другом разделе

Таким образом первый горизонт аналитики событий ожидания задействует информацию о событиях ожидания масштаба экземпляра. Чтто может предложить здесь штатный инструментарий ? Не требующий дополнительного лицензирования statspack предлагает сравнение двух указанных ему точек среза, и вывод отчёта по ним. AWR предлагает не сильно больше возможностей - сравнение двух пар точек срезов, и требует дополнительных лицензионных отчислений. Насколько достаточно такой аналитики ? Получить информацию по двум точкам можно, но такой анализ не учтёт возможных отклонений в течении рассматриваемого периода. Поэтому в дополнение к предлагаемой штатным инструментарием возможностям имеет смысл добавить дополнительную аналитику. Это особенно важно, когда количество БД не ограничивается одной - двумя

Автор настоящего цикла статей использует свой метод "взвешенного анализа событий ожидания", при котором организован съём срезов информации за относительно короткие промежутки времени - например 20 или 30 минут. В дальнейшем для каждой пары соседних точек среза вычисляется значение приращений, и за рассматриваемый период, содержащий множество точек среза, производится выборка наиболее тяжёлых событий ожидания. Далее такие события упорядочиваются как по времени ожиданий, так и по количеству попадания каждого такого ожидания в общую выборку. Полученная аналитическая картина является гораздо более наглядной, чем предоставляемое штатным инструментарием сравнение двух точек

Общее количество ожиданий довольно велико. Ниже в сводной таблице представлены события ожидания, на которых акцентирует внимание различная документация и руководства

ПоказательОписание и применение
Память SGA - Кэш буферов
buffer busy waits Это событие отражает конкуренцию за какой либо блок в одном из кэшей. Статистику по классам буферов (основные классы data block, segment header, undo header, and undo block) можно получить из V$WAITSTAT, а из V$SESSION_WAIT можно получить данные о файле (P1) и блоке в нем (параметр P2), по которым можно вычислить сегмент и его тип:
SELECT class, count FROM V$WAITSTAT
       WHERE count > 0 ORDER BY count DESC;

SELECT segment_owner, segment_name
       FROM DBA_EXTENTS
       WHERE file_id = <&p1>
             AND <&p2> BETWEEN block_id AND 
                       block_id + blocks - 1;
Реакция на событие зависит от класса блоков
  • заголовок сегмента (segment header) - скорее всего связан с утилизацией FREELIST. По возможности необходимо перевести управление сегментами в автоматический режим, что исключит необходимость установки параметров PCTUSED, FREELISTS, and FREELIST GROUPS. Freelist - список свободных (свободного места больше PCTFREE) блоков в экстентах некоторого сегмента, определяется модификатором параметров хранения FREELISTS, по умолчанию один. Методом решения является увеличение количества freelists, а при недостаточности - введение групп списков (даже для одного экземпляра, в RAC у каждого экземпляра должна быть своя группа). Текущие настройки для сегмента можно увидеть запросом:
    SELECT SEGMENT_NAME, FREELISTS FROM DBA_SEGMENTS
           WHERE SEGMENT_NAME = segment name
                 AND SEGMENT_TYPE = segment type;
    
  • блок данных (data block) - для таблицы или индекса необходимо исключить использование неселективных индексов, проверить нагруженные индексы (когда вставка инициируется многими процессами, например, последовательности), перейти на автоматическое управление сегментами или увеличить количество freelist
  • заголовок отмены (undo header) - если не используется автоматическое управление пространством отмены, нужно увеличить количество сегментов отката
  • блок отмены (undo block) - если не используется автоматическое управление пространством отмены, нужно увеличить размер сегментов отката
free buffer waits возникает, когда серверный процесс не может найти свободный буфер и запрашивает сброс процессом грязных (в которых были изменены данные) буферов на диск. Причины - медленный I/O, ожидание ресурсов (например, защелки), слишком маленький буфер - процесс DBRW не успевает обработать или же слишком большой - один DBRW не справляется. При частом возникновении нужно отследить события ожидание, связанные с DBRW. Если это записи, смотреть в V$FILESTAT и статистику ОС на предмет допустимости нагрузки и последующая оптимизация или расширение подсистемы ввода / вывода, если малый кеш - коэффициент попадания будет низкий, а новый оптимальный размер можно подсмотреть в V$DB_CACHE_ADVICE. Если размер кеша адекватен, но проблема остается - можно перевести DBRW в асинхронный режим или активировать несколько DBRW параметром DB_WRITER_PROCESSES (количество сканеров LRU списка кеша, опция предпочтительна на SMP системах с асинхронным I/O) или параметром DBWR_IO_SLAVES (непосредственно дочки, осуществляющие ввод / вывод, допустимо при одном CPU или для эмуляции асинхронного I/O, который предпочтителен). При отсутствии поддержки асинхронного I/O его необходимо отключить в движке DISK_ASYNCH_IO = false. Также нужно использовать только один из параметров DB_WRITER_PROCESSES и DBWR_IO_SLAVES
Память SGA - Библиотечный кэш
latch free Описание в разделе "другие события ожидания"
Память SGA - Буфер оперативных журналов
log buffer space событие подразумевает ожидание серверным процессом свободного места в журнальном буфере, по причине наполнения буфера настолько быстрого, что LGWR не успевает записывать данные в redo log. Если подсистема воода / вывода для оперативных журналов адекватна, то необходимо увеличить размер журнального буффера до момента, пока событие станет редким или перестанет появляться, до этого выверять и тюнить подсистему I/O
Ввод/вывод оперативных журналов
log file switch ... это группа из двух событий - log file switch (archiving needed) и log file switch (checkpoint incomplete) - подразумевает, что LGRW не может переключиться на следующий журнал, и все COMMIT запросы ожидают этого переключения

Для события log file switch (archiving needed) необходимо выявить причину, по которой архивер не может записать архивную информацию в разумные сроки. Причины могут быть - нехватка места для архивного журнала, архивер не может читать из оперативного журнала достаточно быстро (связано с LGWR), архивер не может отписывать достаточно быстро (в этом случае нужно проверить пропускную способность целевого хранилища, потом - его заполненность, потом - увеличивать количество процессов архивирования ARCHn

Для события log file switch (checkpoint incomplete) необходимо выявить причины, по которым DBWR отрабатывает медленно - это или медленное хранилище, или неоптимальное распределение данных в хранилище. Если не DBWR - причиной может быть малое количество журнальных групп или малый размер оперативных журналов, когда цикл переключения оперативных журналов проходится быстрее, чем DBWR отрабатывает запись данных по контрольной точке - в этом случае нужно учеличить количество журнальных групп и/или размер групп соответственно
log file sync при запросе операций COMMIT или ROLLBACK окончание такой операции требует сброса соответствующей порции данных в оперативные журналы процессом LGWR, и ожидание такого сброса отражает событие ожидания log file sync. Если среднее время ожидания мало, а количество ожиданий велико, вероятно использование COMMIT после каждой операции (например после каждого INSERT), тогда полезно перейти на пакетный COMMIT (после нескольких операций, а не после одной). Если же среднее время ожидания велико, наиболее вероятен медленный ввод/вывод, что требует перераспределения данных (например, вынос оперативных журналов на отдельные шпинделя) или аппаратная модернизация подсистемы ввода/вывода
Память - PGA
direct path read и direct path read (lob) эти события характеризуются прямым чтением пользовательским процессом данных в PGA, минуя SGA. Если система не поддерживает асинхронный ввод/ывод, каждое новое ожидание соответствует новому запросу ввода/вывода. Иначе при каждом обращении к блоку, еще не прочитанному в буфер, возникает запрос на чтение и обновляется статистика событий ожидания. Однако, в отличие от scattered и sequental read, количество событий ожидания может быть не равно количеству запросов на чтение. Параметры V$SESSION_WAIT являются P1 - абсолютный номер файла, P2 - номер блока, P3 - количество блоков. Причины возникновения событий - сортировки не помещаются в памяти и уходят на диск (потом забираются пользователем через direct read), для сканирования используются параллельные дочки, серверный процесс обрабатывает буфера быстрее, чем подсистема ввода вывода возвращает буфера (сигнал о перегрузке I/O подсистемы). Это довольно ожидаемо для warehouse, но для DSS требует расследования

Для дисковых сортировок можно вычислить породившие сортировку запросы в V$TEMPSEG_USAGE, и размер сортировки в V$SESSTAT, далее можно уменьшить сортировку тюнингов SQL. Если WORKAREA_SIZE_POLICY = MANUAL, можно вручную увеличить SORT_AREA_SIZE, для автоматического режима нужно увеличивать PGA_AGGREGATE_TARGET. Для table full scan возможны искажения оптимизатора при большом коэффициенте параллелизма таблицы, необходимо проверить, что чтение производится корректно (?). Для запросов с hash join чрезмерный ввод / вывод возможен при малом размере HASH_AREA_SIZE, который имеет смысл увеличить (для автоматического режима нужно увеличивать PGA_AGGREGATE_TARGET
direct path write отражает ожидания при прямой записи из PGA минуя DBWR (запись сортировок на диск, параллельные DML операции, прямые (direct-path) вставки и параллельные create table as select, а также некоторые LOB операции. Как и для direct path read при работе ФС в асинхронном режиме количество ожиданий не равняется количеству запросов на запись. Сессии ждут, когда все буфера PGA обработаны и нельзя продолжать выполнение до завершения поераций ввода / вывода. Параметры V$SESSION_WAIT - P1 (файл для записи), P2 (стартовый блок для записи), P3 (количество записываемых блоков). Причины возникновения - сортировки не помещаются в память или для создания и наполнения объектов используются параллельные операции. Для больших сотрировок можно вычислить породившие сортировку запросы в V$TEMPSEG_USAGE, и размер сортировки в V$SESSTAT, далее можно уменьшить сортировку тюнингов SQL. Если WORKAREA_SIZE_POLICY = MANUAL, можно вручную увеличить SORT_AREA_SIZE, для автоматического режима нужно увеличивать PGA_AGGREGATE_TARGET. Для параллельных DML операций нужно проверить распределение данных по дискам и выверить разметку (sizing) ФС на соответствие коэффициенту паралеллизма
Ввод/вывод данных
db file scattered read (рассеянное чтение) это событие подразумевает, что пользовательский процесс производит чтение в буффер, и в процессе ожидает I/O операций. Обычно это чтение в несвязанные разделы буфера, обычно это чтение multiboot, оно может подразумевать fast-scan операции, а не только полное сканирование таблицы. Параметрами V$SESSION_WAIT являются P1 - абсолютный номер файла, P2 - номер блока, P3 - количество блоков. На здоровой системе вполне ожидаемы после ожиданий простоя (idle), однако появление ожиданий прямого чтения (direct read подразумевает full scan в параллельным запросом) и db file scattered read говорят о недостаточности доступа по индексам. Дополнительные симптомы - низкий коэффициент попадания в кэш и большое время на события ожидания для пользователей с проблемным временем отклика. Это ситуация чрезмерного ввода / вывода, для ее разрешения необходимо снизить I/O тюнингом запросов, конфигурированием workarea, добавлением дисков или разнесением данных на разные диски

Для начала необходимо пробовать тюнить SQL, для чего нужно найти запросы как по событиям ожидания сессий, как и по размеру физического ввода/вывода в V$SQLAREA. Причинами могут быть плохо оптимизированный SQL, неиспользование индексов, высокопараллельный запрос или недостаточно аккуратная статистика оптимизатора. Также возможно некорректное распределение денных по дискам, что выявляется аналитикой нагрузки на диски. Ниже примеры вычисления SQL и сегментов, порождающих событие:
SELECT s.sql_address, s.sql_hash_value
       FROM V$SESSION s, V$SESSION_WAIT w
       WHERE w.event LIKE 'db file%read'
             AND w.sid = s.sid ;

SELECT segment_owner, segment_name FROM DBA_EXTENTS
       WHERE file_id = &p1 AND &p2 between 
             block_id AND block_id + blocks - 1 ;
db file sequential read (последовательное чтение) это событие подразумевает, что пользовательский процесс производит чтение в буффер, и в процессе ожидает I/O операций. От предыдущего отличается тем, что чтение в последовательную область и, обычно это одноблоковое чтение. Обычно это результат использования индексов, редко full scan усекается до одного блока. Параметрами события в V$SESSION_WAIT являются P1 - абсолютный номер файла, P2 - номер блока, P3 - количество блоков. На здоровой системе события вполне ожидаемы после ожиданий простоя (idle), однако появление db file sequential read свидетельствует о необходимости предпочтительного использования на больших warehouse операций полного сканирования таблиц в параллельном режиме
Ввод/вывод архивных журналов
log file switch (archiving needed) в разделе ввод/вывод оперативных журналов
Обнаружение блокировок
enqueue (очереди) блокируют серийный доступ к ресурсам БД. Это событие показывает, что сессия ожидает снятия блокировки, подвешенной другой сессией. Параметрами V$SESSION_WAIT являются P1 (тип блокировки, то же в "V$LOCK.TYPE = chr(bitand(P1,-16777216) / 16777215) || chr(bitand(P1,16711680) / 65535))", для запроса блокировки вычисляется как request = mod(P1, 65536)), P2 (то же, что и V$LOCK.ID1), P3 (V$LOCK.ID2). Сессии, держащие (hold) блокировки, можно получить из представления V$LOCK, как и ожидающие (для этих поле REQUEST != 0)
# отразить ждущие освобождения блокировки
SELECT * FROM V$LOCK WHERE request > 0:

# отразить блокирующие, для которых есть ждущие
SELECT DECODE(request,0,'Holder: ','Waiter: ')|| sid sess, 
       id1, id2, lmode,request, type
       FROM V$LOCK
       WHERE (id1, id2, type) IN (SELECT id1, id2, type 
                                         FROM V$LOCK WHERE request>0)
       ORDER BY id1, request;
реакция зависит от типа блокировки
  • ST enqueue - блокировка возникает только для управляемых словарем бабличних пространств при задержке автоматического выделения места. Для временных табличных пространств нужно убедиться в использовании TEMPFILES. Для динамически растущих сегментов оптимально перейти на LMT, при невозможности - увеличит размер next_extent для избегания постоянного выделения места, или же предварительно выделить место для сегмента командой ALTER TABLE ALLOCATE EXTENT
  • HW enqueue - блокировка гарантирует последовательное выделение места за пределами HIGH WATER MARK сегмента. Параметры позволяют вычислить табличное пространство (V$SESSION_WAIT.P2 / V$LOCK.ID1) и заголовок увеличиваемого сегмента (V$SESSION_WAIT.P2 / V$LOCK.ID2). Решением является ручное довыделение места
  • TM enqueue - эта стек DML блокировок, чаще всего событие ожидания возникает при отсутствии издекса для поля внешнего ключа, и создание индекса позволяет избегать такого события ожидания
  • TX enqueue - эксклюзивная блокировка с начала первого изменения транзакции до операций COMMIT или ROLLBACK. Mode 6 возникает при ожидании строки, занятой другой сессией и разрешается командами COMMIT/ROLLBACK в удерживаеющей сессии. Mode 4 есть ьожидание ITL block, возникает при попытке заблокировать строку в блоке, в котором находятся другие заблокированные строки и свободных транзакционных слотов нет, решается увеличением количества транзакционных слотов (ITL, параметры INITTRANS или MAXTRANS для таблицы). Также возникает при ожидании сессией возможных задваиваний значения в уникальном индексе, когда при попытке записи одного значения двумя сессиями вторая ждет, возбуждать или не ORA-0001, решается COMMIT/ROLLBACK первой сессии. Также возникает пр ожидании фрагмента bitmap индекса, когда несколько сессий меняют строки, покрываемые одним фрагментом bitmap индекса, решение то же - COMMIT/ROLLBACK в первой сессии. Также возникает при ожидании PREPARED транзакции
Другие события ожидания
latch free защёлки являются низкоуровневыми внутренними блокировками для защиты структур памяти, аналогичными блокировкам на прикладном уровне. Использование защёлки обычно идёт по пути - попытка вбить костыль (pins), при удаче - "взведение" защёлки (latch), а при неудаче - ожидание. Счетчик события обновляется, когда при попытке получения защелки (latch) она не отдаёся с первого раза. Обращать внимание стоит, если время ожидания по событию составляет большую часть общего времени ожидания для системы или пользователя.

Для определения причины нужно идентифицировать защёлку (их много видов под разные задачи), анализировать смежные ресурсы (например для нагрузки на защёлки библиотечного кэша полезно проанализировать показатели полных и неполных запросов), проанализировать запросы проблемных сессий. Параметры V$SESSION_WAIT - P1 (адрес защёлки), P2 (номер защелки), P3 (время ожидания процессом защёлки)
# текущие ожидания защёлок
SELECT n.name, SUM(w.p3) Sleeps
       FROM V$SESSION_WAIT w, V$LATCHNAME n
       WHERE w.event = 'latch free' AND
             w.p2 = n.latch#
       GROUP BY n.name ;
ЗащёлкаОбласть SGAВозможные причиныКуда смотреть
Shared pool, library cache Shared pool Запросы не используются повторно, не используются связанные переменные, недостаточен размер кэша приложения, курсор явно закрывается после каждого выполнения, частый login/logout, базовые структуры объекта модифицированы (например очищены), shared pool слишком мал в V$SESSTAT высоки: parse time CPU, parse time elapsed, parse count (hard) / execute count, parse count (total) / execute count. Курсоры в V$SQLAREA/V$SQL отражают высокий коэффициент PARSE_CALLS / EXECUTIONS, EXECUTIONS = 1 отличаются только литералами в классе WHERE, высоки значения RELOADS и/или INVALIDATIONS, большой (> 1mb) SHARABLE_MEM
cache buffers lru chain Buffer cache LRU lists Чрезмерный обмен кеша буферов (например неэффективный SQL производит множественные full scan или итерации по неэфективным большим индексам), слишком маленький кэш, DBRW не успевает отписывать загрязненные буфера, что удлиняет ожидание защёлки при поиске свободных буферов SQL предложения с большим логическим или физическим вводом/выводом или используются неселективные индексы
cache buffers chains Buffer cache buffers Повторяющийся доступ к блоку (или малое количество блоков), называемое "горячим блоком" Свой код вычисления номера последовательности на основе update строки вместо использования штатного генератора номера последовательности, индексный лист утилизируется большим количеством процессов сканирования некоторого неселективного индекса с простым предикатом, нужно идентифицировать "горячий блок"

Обычно проблемы с защелками shared pool или библиотечного кэша связаны с парсингом
# сравнить вручную
SELECT sql_text FROM V$SQLAREA
       WHERE executions < 4
       ORDER BY sql_text;

# найти отличающиеся литералами полуавтоматом
SELECT SUBSTR(sql_text,1, 60), COUNT(*) FROM V$SQLAREA
       WHERE executions < 4
       GROUP BY SUBSTR(sql_text, 1, 60)
       HAVING COUNT(*) > 1;

# поиск постоянно перепарсиваемых для тюнинга
# когда PARSE_CALLS стремится к EXECUTIONS
SELECT SQL_TEXT, PARSE_CALLS, EXECUTIONS
       FROM V$SQLAREA
       ORDER BY PARSE_CALLS ;

# поиск сессий с постоянным перепарсиванием
SELECT pa.sid, pa.value "Hard Parses", ex.value "Execute Count"
       FROM v$sesstat pa, v$sesstat ex
       WHERE pa.sid=ex.sid
             AND
             pa.statistic# = (select statistic# FROM v$statname
                                     where name='parse count (hard)')
             AND
             ex.statistic# = (select statistic# FROM v$statname
                                       where name='execute count')
             AND pa.value > 0 ;

Анализ профиля загрузки

статья не завершена

Белонин С.С. (С), октябрь 2010 года

(даты последующих модификаций не фиксируются)


 
        
   
    Нравится     

(C) Белонин С.С., 2000-2024. Дата последней модификации страницы:2019-12-04 00:43:28