Блоки данных Oracle: размер блока и множественный выбор

Блоки данных в базе OracleБлок данных Oracle - это основа иерархии хранения базы данных и основа всего хранилища базы данных Oracle. Блок данных состоит из определенного числа байтов дискового пространства в системе хранения операционной системы. База данных Oracle выделяет свободное пространство для данных в терминах блоков данных Oracle.

Блок данных — мельчайший логический компонент базы данных Oracle. Например,вы можете установить размер блока данных Oracle в 2, 4, 8, 16 или 32 Кбайт (или даже больше), и эти блоки данных принято называть блоками Oracle. Диски хранилища, на которых располагаются блоки Oracle, сами делятся на блоки данных, которые представляют собой непрерывные области, хранящие некоторое число байт, например, 4096 или 32768 байт (т.е. 4 или 32 Кбайт).


Оглавление статьи[Показать]


Насколько крупным должен быть размер блока данных Oracle?

Вы, как администратор базы данных (DBA), должны выбрать размер блоков вашей базы данных Oracle, установив параметр DB_BLOCK_SIZE в вашем инициализационном файле Oracle (init.ora). Воспринимайте размер блока как минимальную единицу обновления, выбора или вставки данных. Когда пользователь выбирает данные из таблицы, оператор SELECT “читает”, или извлекает (fetch), данные из файлов базы в единицах блоков Oracle.

Если вы выберите общепринятый размер блока Oracle в 8 Кбайт, ваши блоки данных будут содержать в точности 8192 байта. Если вы выберите размер блока в 64 Кбайт (65536 байт), то даже если захотите извлечь имя длиной в четыре символа, вам придется прочесть весь блок размером 64 Кбайт, в котором содержатся интересующие четыре буквы.


Совет

Если вы перешли на Oracle от SQL Server, то воспринимайте размер блока Oracle как аналог размера страницы SQL Server.


Как упоминалось ранее, операционная система также имеет размер блока диска, и читает и пишет информацию целыми блоками. В идеале размер блока Oracle должен быть кратным размеру дискового блока; если это не так, вы, возможно, будете впустую тратить время на чтение и запись целых дисковых блоков, используя только часть данных при каждой операции чтения/записи. Так, например, в системе HP-UX, если установить размер блока Oracle кратным размеру блока операционной системы, то можно за счет этого выиграть 5% производительности.

В Oracle предлагают руководствоваться следующими принципами при выборе размера блока базы данных.

  • Выберите минимальный размер блока, если ваши хранимые записи малы и доступ к ним чаще всего произвольный.
  • Выбирайте более крупный размер блока, если строки малы, но доступ к ним в основном последовательный (или произвольный и последовательный), или же если строки велики.

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


На заметку!

Размер блока Oracle, который вы должны выбирать, зависит от того, что вы собираетесь делать с базой данных. Например, малый размер блока удобен, если вы работаете с мелкими записями и выполняете большой объем поиска по индексу. Более крупный размер блоков подходит для приложений, формирующих отчеты, выполняя сканирование больших таблиц. Если вы не уверены в выборе размера блока, помните, что Oracle рекомендует размер блока в 8 Кбайт для систем, выполняющих большое число транзакций.


 

Множественные размеры блоков данных Oracle

Инициализационный параметр DB_BLOCK_SIZE определяет стандартный размер блока в базе данных Oracle и находится в диапазоне от 2 Кбайт до 32 Кбайт. Системное табличное пространство всегда создается со стандартным размером блока, однако Oracle позволяет специфицировать до четырех нестандартных размеров блоков. Например, внутри одной и той же базы данных можно иметь размеры блоков 2 Кбайт, 4 Кбайт,8 Кбайт, 16 Кбайт и 32 Кбайт; причины такой организации будут описаны далее, в разделе “Табличные пространства”. Если вы решили сконфигурировать множественные размеры блоков, то потребуется также сконфигурировать соответствующие подкэши в буферном кэше SGA.

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

 

Что находится внутри блока данных?

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

Иногда бывает нужно точно узнать, какие данные находятся в конкретном блоке,или найти блок, содержащий определенную часть данных. Вы можете “увидеть” содержимое блока данных, подготовив “дамп” содержимого блоков. Блоки Oracle могут быть сброшены в дамп на уровне операционной системы (что называется бинарными дампами), и вы можете также выполнять форматированные Oracle дампы блоков.

Наиболее частой причиной для выполнения дампа блока является необходимость исследования повреждения блока, которое может быть вызвано ошибками операционной системы или программного обеспечения Oracle, дефектами оборудования или проблемами кэширования операций ввода-вывода. Диспетчер восстановления (Recovery Manager — RMAN) предусматривает способы восстановления повреждения блоков, а, кроме того, вы можете использовать Data Recovery Advisor (Советник по восстановлению данных), чтобы выбрать другие стратегии восстановления поврежденных блоков.

Теперь давайте посмотрим, что в действительности находится в блоке данных Oracle. Во-первых, прежде чем подготовить дамп данных, нужно определить, какой блок данных из какого файла данных следует дампировать. В листинге 1 показан запрос,позволяющий определить идентификаторы (ID) файла и блока.


SELECT segment_name,
file_id,
block_id
FROM dba_extents
WHERE owner = 'OE'
AND segment_name LIKE 'ORDERS%';
SEGMENT_NAME        FILE_ID   BLOCK_ID
------------------- -------- ---------
ORDERS              397       32811


В качестве альтернативы можно использовать следующий запрос для получения той же информации:

SELECT header_file,header_block FROM dba_segments
WHERE segment_name = 'PERSONS';
HEADER_FILE HEADER_BLOCK
----------- ------------
397         32811

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

ALTER SYSTEM DUMP DATAFILE 397 BLOCK 32811;
System altered.

Приведенная команда создаст дамп блока в каталоге трассировки по умолчанию (UDUMP) базы данных Oracle. Листинг 2 показывает часть вывода этой команды.


Dump file /a03/app/oracle/admin/pasu/udump/pasu_ora_29673.trc
...
Start dump data blocks tsn: 110 file#: 397 minblk 32811 maxblk 32811
buffer tsn: 110 rdba: 0x6340802b (397/32811)
scn: 0x0001.610ac43d seq: 0x01 flg: 0x04 tail: 0xc43d2301
frmt: 0x02 chkval: 0x882e type: 0x23=PAGETABLE SEGMENT HEADER
Extent Control Header
----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 59 #blocks: 483328
last map 0x00000000 #maps: 0 offset: 2720
Highwater:: 0x63826009 ext#: 58 blk#: 8192 ext size: 8192
#blocks in seg. hdr's freelists: 0
#blocks below: 479093
mapblk 0x00000000 offset: 58
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x6381ef7e ext#: 4 blk#: 3957 ext size: 8192
#blocks in seg. hdr's freelists: 0
#blocks below: 36725
mapblk 0x00000000 offset: 4
Level 1 BMB for High HWM block: 0x63824028
Level 1 BMB for Low HWM block: 0x6381e018
--------------------------------------------------------
Segment Type: 1 nl2: 0 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001438
First Level 3 BMB: 0x6340802a
L2 Hint for inserts: 0x63408029
Last Level 1 BMB: 0x63824028
Last Level II BMB: 0x63412029
Last Level III BMB: 0x6341202a
Map Header:: next 0x00000000 #extents:59 obj#:4916681 flag: 0x10000000
. . .
End dump data blocks tsn: 110 file#: 397 minblk 32811 maxblk 32811 

Можно прочесть и интерпретировать данные дампа, чтобы узнать подробности относительно таблицы или индекса. Рассмотрим простой пример, который продемонстрирует, как можно получить имя таблицы из информации приведенного выше дампа блока. Возьмите ob# из предпоследней строки и запустите следующий запрос:

SELECT name
2 FROM sys.obj$
3*WHERE obj#='4916681';
NAME
---------------
PERSONS

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

 

Вас заинтересует / Intresting for you:

Создание базы данных Oracle
Создание базы данных Oracle 18909 просмотров Александров Попков Wed, 14 Nov 2018, 12:44:39
Физические структуры базы данн...
Физические структуры базы данн... 7065 просмотров Дэйзи ак-Макарова Sun, 02 Sep 2018, 09:01:15
База данных Oracle
База данных Oracle 7519 просмотров Antoniy Tue, 21 Nov 2017, 13:32:12
Индексы Oracle
Индексы Oracle 15349 просмотров Игорь Воронов Tue, 21 Nov 2017, 13:18:46
Войдите чтобы комментировать

ildergun аватар
ildergun ответил в теме #9119 27 июль 2018 06:00
Хорошо написано! Особенно про различный размер блока данных (множественный выбор).