Sunday, July 22, 2018

Oracle Async и Direct I/O.

На написание этой статьи меня сподвигла тема на одном из форумов Oracle, в который всплыли очередные мифы о возможностях direct и async, их скорости и возможной потери данных в БД.

На эту тему есть старенькая, но отличная статья (на английском): http://mgogala.byethost5.com/directio.pdf?i=2

Рассмотрим ее основные положения.

В обычном режиме Unix disk IO операции выглядят, так:




Т.е. когда используется обычный системный вызов на чтение, данные с диска не отправляются напрямую в user buffer, Unix «вставляет» свой buffer между user buffer и диском. Соответственно, Oracle БД, когда читает из файла, блок сначала помещается в буфер ОС. Это дает ОС возможность кэшировать и распределять общие данные между процессами. Буфер ОС не доступен напрямую из пользовательского кода – это внутренний системный инструмент. При том, вы наверняка знаете, он разделяется на область ядра (kernel space) и пользовательскую (user space). Как именно это разделение происходит зависит от конкретной реализации архитектуры ОС.

Sunday, October 30, 2016

Space Management and Oracle Direct Path Load in Oracle 12c

Управление пространством и Oracle Direct Path Load (операции прямой загрузки) в Oracle 12c

Еще один перевод отличной статьи с blogs.oracle.com, теперь от Nigel Bayliss . На этот раз, особенности управления пространством при Direct Path Load  операциях. Уделено внимание и новым фичам в этой области в 12с, релиза. 12.1.0.2. 

Оригинал здесь https://blogs.oracle.com/optimizer/entry/space_management_and_oracle_direct

С 12.1.0.2 в explain plan появилась информация о том как оракл распределяет блоки данных внутри сегментов при direct loads.
Давайте разберемся, почему существуют разные методы управления пространством и единый не подходит для каждого случая.
Просто, учитывая, что direct path load может использоваться, наполняя секционированные и нет таблицы, наполняя один или множество сегментов, работать параллельно или в один поток, выполняться на одном инстансе либо быть распределенным по множеству инстансов RAC. Также следует учитывать некоторые нюансы, например, неравномерное распределение данных - некоторые секции могут содержать значительно больше данных, чем остальные. Успешное параллельное выполнение зависит от равномерности распределения нагрузки по процессам параллельной обработки.
Оракл использует различные стратегии для достижения хорошего масштабирования в самых разнообразных условиях, избегая неэффективной работы при неравномерном распределении данных.
Рассмотрим эти стратегии для 11gR2 и затем дополним их нововведениями из 12c.

Tuesday, February 2, 2016

Особенности параллельного выполнения sql в Oracle (Understanding Parallel Execution by Randolf Geist). Перевод.

Особенности параллельного выполнения sql в Oracle

Этот перевод делал в основном для себя, не утруждаясь коррекцией и стилем, за сим не обессудьте. Выражения с большой буквы (как то Parallel Slave Set или Data Flow Operation) считал за термины и не переводил либо давал перевод рядом в скобках, дабы избежать путаницы и искажения. Форматирование автора по возможности сохранено.

Оригинал тут:


Для параллельного выполнения, требования должны быть выполнены, по порядку:
1. Эффективный Parallel Execution план
2. Достаточные ресурсы доступны, в процессе выполнения
3. Отсутствие существенных проблем распределения Parallel Slaves (параллельных исполнителей).
Рассмотрим по-порядку:

1. Эффективный Parallel Execution план

Зачастую, Parallel Execution считается "серебряной пулей", способной решить проблемы медленных запросов, выполняющихся в один поток. Но, если последовательный план не эффективен (например, неверный порядок соединений или неверны сами соединения или способы доступа), Parallel Execution план будет также неэффективен. Прежде всего, важно, понимать каким должен быть эффективный план, после этого может быть использован Parallel Execution, если он применим для запроса.

Аспекты, что применимы к последовательному выполнению, также применимы и к Parallel Execution, но имеется ряд особенностей:
Parallel Execution Forced to Serial
В некоторых случаях Оракл в процессе разбора оператора определяет, что он не может использовать Parallel Executions, хотя уже начал строить Parallel Execution план. Одна из основных причин - использование пользовательских PL/SQL функций, для которых не задействовано параллельное выполнение, хотя я встречается и в других ситуациях. Такое поведение легко определить по плану – он содержит одну или несколько операций PX COORDINATOR FORCED SERIAL: 
------------------------------------------------------------------------------
| Id  | Operation                    | Name     |    TQ  |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |          |        |      |            |
|   1 |  PX COORDINATOR FORCED SERIAL|          |        |      |            |
|   2 |   PX SEND QC (RANDOM)        | :TQ10003 |  Q1,03 | P->S | QC (RAND)  |
|   3 |    HASH UNIQUE               |          |  Q1,03 | PCWP |            |
|   4 |     PX RECEIVE               |          |  Q1,03 | PCWP |            |
|   5 |      PX SEND HASH            | :TQ10002 |  Q1,02 | P->P | HASH       |
|*  6 |       HASH JOIN BUFFERED     |          |  Q1,02 | PCWP |            |
|   7 |        PX RECEIVE            |          |  Q1,02 | PCWP |            |
|   8 |         PX SEND HASH         | :TQ10000 |  Q1,00 | P->P | HASH       |
|   9 |          PX BLOCK ITERATOR   |          |  Q1,00 | PCWC |            |
|  10 |           TABLE ACCESS FULL  | T2       |  Q1,00 | PCWP |            |
|  11 |        PX RECEIVE            |          |  Q1,02 | PCWP |            |
|  12 |         PX SEND HASH         | :TQ10001 |  Q1,01 | P->P | HASH       |
|  13 |          PX BLOCK ITERATOR   |          |  Q1,01 | PCWC |            |
|  14 |           TABLE ACCESS FULL  | T2       |  Q1,01 | PCWP |            |
------------------------------------------------------------------------------
Будьте внимательней, если вы видите операцию PX COORDINATOR FORCED SERIAL - хоть план выглядит как параллельный, оракл выполнит его последовательно. Основная проблема здесь, в том, что оптимизатор учитывает сокращение стоимости актуальной для параллельного выполнения. Например, стоимость full table scan при параллельности выглядит дешевле доступа по индексу, но учитывая, что запрос выполнится последовательно, очень возможно, что это будет не лучший выбор.
По крайней мере, если выполнение пошло последовательно, потенциальный всплеск дополнительных операций блокировки (на примере выше - это HASH JOIN BUFFERED) удастся избежать.
Объясню природу дополнительных операций блокировки ниже.

Additional Blocking Operations (Дополнительные операции блокировки)


При последовательном плане выполнения, ровно 1 процесс работает над его исполнением и рекурсивно вызывает функции, соответствующие тем или иным операциям execution plan. Tanel Poder наглядно раскрыл сей вопрос в своем блоге (http://blog.tanelpoder.com/2008/06/15/advanced-oracle-troubleshooting-guide-part-6-understanding-oracle-execution-plans-with-os_explain/).
В случае параллельного выполнения, вещи выглядят совсем по-другому. Оракл использует модель Consumer/Producer для не тривиальных Parallel Executions планов, таким образом, 2 сета Parallel Slaves будут работать в одно и тоже время на различных связанных операций единой «Data Flow Operation» (DFO будет описана позже). Вследствие модели Consumer/Producer происходит, что оба Parallel Slave Sets заняты (один извлекает(produce), другой использует(consume) данные), но данные, соответственно, плану выполнения, будут использованы следующей операцией. Если следующая операция, по плану, должна выполняться отдельным Parallel Slave Set (это можно увидеть из TQ колонки плана), и нет свободного слейв сета/процесса, который может обработать данные, в таких случаях ораклу требуется выполнить sync points(точки синхронизации, или операции блокировки), где данные должны быть «запаркованы», до того времени, как один из слейв сетов обводиться для дальнейшей обработки данных.
В текущих релизах Oracle, можно просто определить «дополнительные операции блокировки» в плане выполнения. Это отдельные операции (BUFFER SORT не путайте с обычным BUFFER SORT, который также встречается в последовательном плане) или одну их существующих операций, дополненную опцией BUFFERED, например HASH JOIN BUFFERED.
Итак, есть 3 важных момента, которые следует учитывать: