DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Проактивное управление конкуренцией для временных сегментов


В основном временные сегменты создаются Oracle при выполнении опера­ций сортировки. Кроме того, начиная с Oracle8i, глобальные временные табли­цы создаются как временные сегменты. Сначала мы обсудим временные сегменты, получаемые во время сортировки. Операции сортировки выполня­ются Oracle во многих случаях, например, при создании индексов или использо­вании в операторах SQL операций order by, group by, distinct, union, intersect или minus. Сортировка запускается и при соединении сортировкой-слиянием, при выполнении команд analyze и во многих других случаях. Реальная сорти­ровка проходит в оперативной памяти. Однако всем хорошо известно, что обычно объем данных превышает любые доступные размеры оперативной па­мяти, по крайней мере доступные для большинства из нас. Как же поступает Oracle при сортировке больших объемов данных? Когда выделенная для сорти­ровки данных область заполняется, Oracle записывает отсортированные дан­ные на диск, чтобы освободить оперативную память для сортировки новой порции данных. Эти временные сегменты в случае необходимости создаются Oracle в табличном пространстве TEMP, назначаемом пользователю. Как толь­ко сортировка заканчивается, Oracle прочитывает все эти временные сегменты (операция выборки) и представляет отсортированные данные приложению. После этого временные сегменты вычеркиваются. Вы спросите, как же эти вре­менные сегменты могут создавать проблемы с конкуренцией, если всего лишь используются при сортировке, а затем уничтожаются?

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

транзакции управления памятью 

(space management transaction (ST) enqueue). Это необходи­мо для того, чтобы операция обновления таблиц словаря данных выполнялась в последовательном режиме. Постановкой в очередь называется механизм в рам­ках Oracle для блокировки коллективно используемых ресурсов типа таблиц словаря данных. Вот она - та игрушка, о которой мечтают все дети! Во всей базе данных имеется только один ресурс постановки в очередь ST. Каждая связанная с управлением памятью процедура, например, выделение и освобождение эк­стентов или объединение свободного пространства (как с помощью фонового процесса SMON, так и вручную), должны получить ресурс постановки ST в оче­редь и сохранять его до тех пор, пока не закончится связанная с ним деятельность. Запросы на этот единичный ресурс увеличиваются, когда операции сортировки используют временные сегменты. Иногда, если такое ожидание становится чересчур длительным, Oracle выдает сообщение об ошибке "ORA-01575 - Timeout waiting for space management resource". He стоит и гово­рить, что лучшим решением для вопроса является экономия данного ресурса. А для этого нужно всего лишь сократить число событий управления памятью.
Можно начать с проверки, использует ли база данных при выполнении сор­тировок дисковую память. Это делается так:
□  SQL> select Name, Value
2        from V$SYSSTAT
where Name like  ,%sort%';
NAME                               VALUE

       

sorts (memory)        77027
sorts (disk)        8471
sorts  (rows)        138003699
3 rows selected. SQL>
Этот пример демонстрирует, сколько сортировок выполняется в памяти, а
сколько используют диск (и снова напоминаем, что эти данные являются нако-
пительными с момента последнего старта экземпляра). Кроме того, имеется
возможность увидеть полное число отсортированных строк. В приведенном вы-
ше примере довольно большое число сортировок использует диск. И хотя, ско-
рее всего, полностью устранить использование диска не удастся, его можно
значительно минимизировать, соответствующим образом скорректировав па-
раметры SORT_AREA_SIZE и SORT_AREA_RETAINED_SIZE. Желательно уста-
новить более высокие значения        для сеанса, выполнив перед
запуском пакетного задания, в котором имеется много операций сортировок,
или перед построением большого индекса команду alter session set sort_area_
Эта команда действует только для конкретного сеанса и не затро-
нет другие сеансы, где тоже выполняются сортировки. Использование более
высоких значений параметра улучшит производительность
сортировки и в то же время уменьшит конкуренцию за ресурс постановки ST в
очередь.
Чтобы еще больше уменьшить динамическое выделение экстентов временных сегментов, можно конфигурировать табличные пространства временного типа и соответствующим образом устанавливать для них значения экстентов 

initial 

и 

next. 

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

initial и next можно 

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

initial 

и 

next 

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

initial 

и 

next 

и установите 

pctinc-


rease 

равным 0. Не забывайте, что мы хотим иметь одинаковые размеры для всех
экстентов табличного пространства. Произвольное число выбирается для того,
чтобы размер экстента был достаточно велик для размещения в нем объема дан-
ных, крапюго        Поскольку каждая сортировка состоит из двух
фаз - фазы сортировки и фазы выборки - полезно отметить, что SORT AREA
SIZE используется во время фазы сортировки, a SORT_ARFA_RETAINED_SIZI -
во время фазы выборки.
 


лабораторный пластик







jAntivirus