Oracle как узнать размер блока
Итак, давайте попробуем разобраться, с самой фундаментальной частью БД Oracle, которая называется "блок БД". Блоки являются самой элементарной единицей выборки данных. И стоят на самом нижнем уровне организации собственно самой БД. Блоки хранят всю информацию, из которой собственно и состоит ваша БД. Сразу оговариваюсь, не путайте блоки БД с блоками файловой системы, какая бы она не была на вашем сервере, FAT, FAT32, NTFS и т.д. Блоки БД, естественно базируются на блоках файловой системы, но с последними ничего общего не имеют. :) Хотя блоки БД, должны быть, кратны блокам файловой системы. Например, для UNIX это 8192, 16384 и т.д. Выбирать, размер блока БД можно самостоятельно при создании экземпляра БД, либо система задает этот параметр сама. В том случае как мы с вами устанавливали БД, размер блока у вас, скорее всего будет 2048 байт. В этом легко убедиться, проверив значение параметра db_block_size, в уже известном вам файле init.ora. Естественно при чтении данных из БД, считывается столько байт, сколько входит в один блок или кратное этому числу, в зависимости от количества информации, например, в запросе. Так же запомните сразу, единожды установленный размер блока БД, в процессе уже не может быть изменен. Если вы, по какой либо причине захотите изменить, размер блока БД, то необходимо сохранить ваши данные, затем удалить ваш экземпляр БД, и создать его вновь с новым значением блока БД! Что же представляет из себя блок БД? На рисунке представлено схематичное изображение блока.
Цифрой "1" обозначен заголовок блока, в нем хранится информация о том, к какому сегменту БД, принадлежит блок, количество одновременных транзакций и т.д. Цифрой "2" обозначено пространство, зарезервированное параметром PCTFREE для дальнейших обновлений данных в блоке. Что это за параметр мы сейчас разберем. Цифра "3" и "4" это пространство готовое к использованию, а вот цифра "5" показывает границу параметра PCTUSED. Что, это за параметры? PCTFREE - указывает какое количество (в процентах) пространства будет зарезервировано для дальнейших обновлений данных в блоке, а PCTUSED задает часть объема блока, которое должно освободиться прежде чем БД включит его в список доступных для ввода новых строк. Давайте разберем это все, так чтобы стало понятно! Например, вы создали таблицу MYTABLE, в которую поместили скажем 100 записей, ваша таблица заняла, фигурально один блок. Теперь, при создании БД параметр PCTFREE, в нашем случае, имел значение 10%, а параметр PCTUSED имел значение 40%. Что, это значит? Теперь ваш блок, имеет 10% пространства для обновления находящейся в нем таблицы, а 90% пространства отводятся под саму таблицу. То есть, если ваша таблица заполнила 90% процентов блока, то он вычеркивается самой БД из списка доступных для ввода новых строк БД. Но, те 10% процентов так и остались в блоке, для обновления вашей MYTABLE. Теперь скажем, вы обновили данные в вашей MYTABLE таким образом, что она стала занимать не 90% процентов пространства блока, а скажем 49% блока. Итак, 90%-49% = 41%, а параметр PCTUSED = 40%, замечательно, блок снова включается в список для записи новых строк! Теперь сюда можно поместить, скажем, таблицу NEWTABLE! Вот таким образом эти два параметра работают и управляют блоками БД. При этом ни один из параметров никогда не должен иметь значение 100%! С помощью PCTFREE и PCTUSED можно регулировать производительность самой БД. Забегая немного вперед скажу, что экземпляры БД имеют два типа при построении. Так называемые OLTP и DSS системы, первая это БД рассчитанная на тысячи активных транзакций, а вторая это хранилище данных используемое в основном для чтения, так вот правильная настройка блоков и их размер обязательно необходимое условие для производительного функционирования обоих типов БД! Посмотреть ваши параметры настройки блоков, как я уже говорил, можно в файле init.ora в секции db_block_size, например:
А значение параметров PCTFREE и PCTUSED можно посмотреть, войдя пользователем SYS или SYSTEM в SQL*Plus и написав такой запрос:
Как видно, в нашем случае PCTFREE = 10% и PCTUSED = 40%, в чем мы с вами и убедились! В дальнейшем мы еще, вернемся к этой теме, так как она еще далеко не полностью раскрыта. Но пока на этом с системными объектами БД мы закончили. Советую, еще раз все осмыслить и хорошенечко и запомнить на будущее.
Блок данных Oracle - это основа иерархии хранения базы данных и основа всего хранилища базы данных Oracle. Блок данных состоит из определенного числа байтов дискового пространства в системе хранения операционной системы. База данных Oracle выделяет свободное пространство для данных в терминах блоков данных Oracle.
Блок данных — мельчайший логический компонент базы данных Oracle. Например,вы можете установить размер блока данных Oracle в 2, 4, 8, 16 или 32 Кбайт (или даже больше), и эти блоки данных принято называть блоками Oracle. Диски хранилища, на которых располагаются блоки Oracle, сами делятся на блоки данных, которые представляют собой непрерывные области, хранящие некоторое число байт, например, 4096 или 32768 байт (т.е. 4 или 32 Кбайт).
Множественные размеры блоков данных Oracle
Инициализационный параметр DB_BLOCK_SIZE определяет стандартный размер блока в базе данных Oracle и находится в диапазоне от 2 Кбайт до 32 Кбайт. Системное табличное пространство всегда создается со стандартным размером блока, однако Oracle позволяет специфицировать до четырех нестандартных размеров блоков. Например, внутри одной и той же базы данных можно иметь размеры блоков 2 Кбайт, 4 Кбайт,8 Кбайт, 16 Кбайт и 32 Кбайт; причины такой организации будут описаны далее, в разделе “Табличные пространства”. Если вы решили сконфигурировать множественные размеры блоков, то потребуется также сконфигурировать соответствующие подкэши в буферном кэше SGA.
Множественные размеры блоков данных нужны не всегда, и в большинстве случаев вполне достаточно одного стандартного размера блока Oracle. Множественные размеры блоков в основном используются при перемещении табличных пространств между базами данных с различными размерами блоков.
Экстенты (extent)
Экстенты (extent) - это два или более последовательных блоков данных Oracle, представляющий собой единицу выделения места на диске. Когда комбинируется несколько непрерывных блоков данных, они называются экстентом. Когда вы создаете объект базы данных вроде таблицы или индекса, вы выделяете им некоторый начальный объем пространства, называемый начальным экстентом, и, кроме того, указываете размер следующего экстента. Однажды размещенные в таблице или индексе, экстенты остаются выделенными конкретному объекту, пока вы не удалите этот объект из базы данных - тогда пространство, занимаемое им, вернется в пул свободного пространства базы данных.
Табличное пространство sysaux
Табличное пространство sysaux служит вспомогательным табличным пространством по отношению к табличному пространству system.
We must have known already that block sizes of non-system tablespaces can be controlled and altered, but did you ever think of block sizes of Control files and Redo log files in the database? How to check their block sizes if they have so, can we alter them when required? Well, it is really very important for us to understand these block level concepts.
I did not get some chance to look at this area until I faced a performance issue on one of the database environments I work. Through the process of looking at the issue, I could notice that block size of redo log files is not compatible to the underlined attached storage. This problem is one such real time example of the topic we discussed earlier “How important is disk type for Oracle database files?”.
In this blog, we will discuss only block sizes of control files and redo log files as modifying block sizes on tablespace level is something I hope we would have known it already.
System consideration:
We will be using database server for our next phase of discussion with following configuration:
- OS: Oracle Enterprise Linux
- Database: Oracle 12c database
- Type: Non-CDB database
Control file block size:
Before we actually look at identifying the block size of control file, let us see the default block size of the database.
SQL> show parameter db_block_size
NAME TYPE VALUE
db_block_size integer 8192
It is 8KB on my system, alright now let us check the block size of the control files on this database server.
SQL> select BLOCK_SIZE from v$controlfile;
There are two control files on my system each of 16KB size, Aww. Should it not be the default block size of 8KB? Well, you see that right. Oracle says that irrespective of block size supported by OS or storage control file block size will always remain 16KB and that cannot be altered.
Will this create any issue? I don’t see that this is as problematic until unless your minimum block size at your operating system is more than 16KB ex: 32KB. When minimum block size at the OS level is 4KB or 8KB then Oracle can bundle 4 blocks or 2 blocks respectively to create one logical block for the control file. Interesting isn’t it.
Redo log block size:
Block size of redo log files are bit different from control files which we have seen so far. Let us quickly check the current block size of all the redo logs on my server. Note that I did not specify any block size of the redo logs when I created this database, so the output below is the default size created by DBCA.
SQL> select BLOCKSIZE from v$log;
That’s 512B on my system. Just like control file, block size of redo log is not same as the default database block size(8KB).
But can we have a redo log files of different block sizes, I tried creating two other groups with 1KB , 4KB and 8KB.
SQL> alter database add logfile group 4 size 5M blocksize 1024;
ERROR at line 1:
ORA-01377: Invalid log file block size
SQL> alter database add logfile group 4 size 5M blocksize 4096;
ERROR at line 1:
ORA-01378: The logical block size (4096) of file
/pdbdata/ORACDB3/onlinelog/o1_mf_4_%u_.log is not compatible with the disk
sector size (media sector size is 512 and host sector size is 512)
SQL> alter database add logfile group 4 size 5M blocksize 8192;
ERROR at line 1:
ORA-01377: Invalid log file block size
Oracle says that only possible block sizes for redo logs are 512, 1024 and 4096 bytes.
- For 1024, my database server errors out as invalid block size just because my OS platform doesn’t support it. So 1024 is valid only on few OS platforms.
- For 8192, as database itself doesn’t support we see the same error as invalid block size.
- For 4096, there is some interesting error showing us the media sector size on the disk is 512 so it cannot create a redo log with block size as 4096.
In your environment if redo log block size is 4096 then it means that if media sector supports 4096 bytes of block size then oracle automatically identifies and creates redo logs with block size as 4096.
Will this create any issue? Having redo log block size of 4096 bytes results in redo log wastage compared to 512 bytes. There will be tremendous performance issue if your disk is not aligned with the block size of your redo log blocks.
This was the same reason why one my database environment was performing bad, it was because of 4KB of redo log block size and there was lot of redo wastage happening in the database. I could recognize the redo wastage from V$SYSSTAT.
SQL> SELECT name, value FROM v$sysstat WHERE name = ‘redo wastage’;
redo wastage 17941684
Key points:
- With 512 bytes of media sectors we still have Control file block size as 16KB, as it logically binds 32 sectors to one block. But this is not possible in redo log.
- Having 4KB block size of redo log files will not degrade the performance of the database always. But there is chance for this to happen if your storage disk is not compatible with such setup.
- Changing already existing redo log file block size is possible from 11gR2 only if redo log group is inactive.
- Each redo log group can have different block sizes if media supports, but never a good practice.
I love to see your comments!
Feel free to give additional information in the comments, that I can validate and include in blog posts or update this as well.
Насколько крупным должен быть размер блока данных 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 Кбайт для систем, выполняющих большое число транзакций.
Сегменты (segments)
Сегменты (segments) - набор экстентов, которые вы выделяете логической структуре, такой как таблица или индекс (или некоторый другой объект). Набор экстентов формирует следующую более крупную единицу хранения, именуемую сегментом. Oracle называет сегментом все пространство, выделенное любому конкретному объекту базы данных. Поэтому если у вас есть таблица по имени Customer, вы просто ссылаетесь на пространство, выделенное для нее, как на “сегмент Customer”. Когда вы создаете индекс, он получает свой собственный сегмент, названные его именем. Сегменты данных и индексов - наиболее распространенный тип сегментов Oracle. Есть также временные сегменты, которые база данных использует в транзакциях, включающих сортировку, а также сегменты отката, которые база использует для хранения информации отката. Когда все экстенты сегмента заполнены, Oracle автоматически выделяет дополнительные экстенты при необходимости и эти сегменты могут быть непрерывными.
A mandatory tablespace that consists of the data dictionary, including definitions of tables, views, and stored procedures needed by the database. Oracle Database automatically maintains information in this tablespace.
A mandatory, auxiliary system tablespace that is used by many Oracle Database features and products. This tablespace contains content that was previously stored in the DRSYS , CWMLITE , XDB , ODM , OEM_REPOSITORY , and SYSTEM tablespaces.
An user-created tablespace that consists of application data. As you create and enter data into tables, Oracle Database fills this space with your data.
A mandatory tablespace that contains temporary tables and indexes created during SQL statement processing. You may have to expand this tablespace if you run SQL statements that involve significant sorting, such as ANALYZE COMPUTE STATISTICS on a very large table, or the constructs GROUP BY , ORDER BY , or DISTINCT .
System-managed tablespaces that contain undo data for each instance. Each Oracle RAC instance uses a different value for n in the tablespace name. These tablespaces are used for automatic undo management.
A system tablespace that contains rollback segments. If you do not use automatic undo management, then you must configure the RBS tablespace. The RBS tablespace should only be used when needed for compatibility with earlier versions of Oracle Database.
Посмотреть, какие табличные пространства имеются в базе данных можно следующим запросом.
В каких файлах хранятся табличные пространства.
Что находится внутри блока данных?
Все блоки данных можно разделить на две основные части: часть строк данных и часть свободного пространства. (Есть и другие, более мелкие области, такие как пространство заголовков и пространство для накладных расходов, связанных с обслуживанием базы.) Раздел строк данных содержит собственно данные, хранимые в таблицах и их индексах.Раздел свободного пространства представляет собой место, оставшееся в блоке данных Oracle для вставки новых данных или расширения существующих строк в блоке.
Иногда бывает нужно точно узнать, какие данные находятся в конкретном блоке,или найти блок, содержащий определенную часть данных. Вы можете “увидеть” содержимое блока данных, подготовив “дамп” содержимого блоков. Блоки Oracle могут быть сброшены в дамп на уровне операционной системы (что называется бинарными дампами), и вы можете также выполнять форматированные Oracle дампы блоков.
Наиболее частой причиной для выполнения дампа блока является необходимость исследования повреждения блока, которое может быть вызвано ошибками операционной системы или программного обеспечения Oracle, дефектами оборудования или проблемами кэширования операций ввода-вывода. Диспетчер восстановления (Recovery Manager — RMAN) предусматривает способы восстановления повреждения блоков, а, кроме того, вы можете использовать Data Recovery Advisor (Советник по восстановлению данных), чтобы выбрать другие стратегии восстановления поврежденных блоков.
Теперь давайте посмотрим, что в действительности находится в блоке данных Oracle. Во-первых, прежде чем подготовить дамп данных, нужно определить, какой блок данных из какого файла данных следует дампировать. В листинге 1 показан запрос,позволяющий определить идентификаторы (ID) файла и блока.
В качестве альтернативы можно использовать следующий запрос для получения той же информации:
Затем вы вводите следующую команду, указывая соответствующие номера файла и блока, чтобы получить дамп нужного блока:
Приведенная команда создаст дамп блока в каталоге трассировки по умолчанию (UDUMP) базы данных Oracle. Листинг 2 показывает часть вывода этой команды.
Приведенный пример тривиален, но он показывает, как извлечь нужную информацию прямо из дампа блока базы данных. Конечно, если необходимы более существенные данные из дампа, придется прибегнуть к более серьезным приемам.
Блоки данных (Data Block) - мельчайший строительный блок базы данных Oracle, состоящий из определенного количества байт на диске. Блок данных Oracle - логический компонент базы данных. Диски на которых располагаются блоки Oracle, сами делятся на блоки данных. Обычно блоки данных диска соответствуют блокам данных Oracle. Размер блока базы данных Oracle устанавливается параметром DB_BLOCK_SIZE в файле init.ora. Размер блока следует воспринимать, как минимальную единицу обновления, выбора или вставки данных. Общепринятый размер блока - 8 KByte. Если выбрать размер блока 64 KByte, то даже при извлечении имени длиной в четыре символа, придется прочесть весь блок размером 64 KByte, в котором содержатся интересующие четыре буквы.
Все блоки данных можно разделить на две основные части: часть строк данных и часть свободного пространства.
Табличное пространство system
В табличном пространстве system хранится «Словарь данных Oracle»
Каждая база данных Oracle содержит набор таблиц, доступных только для чтения и известных как словарь данных (data dictionary), который содержит метаданные (информацию о различных компонентах базы данных). Словарь данных Oracle – сердце системы управления базой данных.
Словарь данных создается при создании экземпляра базы данных выполнением инструкций в файле $ORACLE_HOME/rdbms/admin/catalog.sql
Oracle не позволяет обращаться к таблицам словаря данных напрямую. Он создает представления на базе этих таблиц и общедоступные синонины для тих представлений, к которым могут обращаться пользователи. Существует три набора представлений словаря данных: USER, ALL и DBA – каждый из которых содержит сходный набор представлений со сходным набором столбцов.
Посмотреть содержимое табличного пространства system
Читайте также: