Применение:
База данных Oracle — версия 12.1.0.2
Автор:
Махеш Редди М.
Введение.
С момента появления Oracle Database 12c In-Memory одна база данных может эффективно поддерживать смешанные рабочие нагрузки, обеспечивая оптимальную производительность для транзакций и поддерживая функции отчетности и аналитики в реальном времени. Хранение данных в памяти позволяет выполнять специализированный анализ как на витринах данных, так и в хранилищах данных, и конечные пользователи получают возможность выполнять несколько бизнес-запросов за то же время, за которое в традиционных системах можно выполнить всего один запрос. Эта функция позволяет сохранять столбцы, таблицы, разделы и материализованные представления в памяти в колоночном формате, а не в стандартном строчном формате. Колоночный формат в оперативной памяти стал главной новой функцией в наборе исправлений 12.1.0.2.
Архитектура Oracle Database 12c In-Memory:
Обычно данные хранятся только в строчном формате, а в базе данных в оперативной памяти данные хранятся только в колоночном формате. Таким образом, Oracle Database 12c поддерживает двухформатную архитектуру.
- Когда запрашиваются данные для операций чтения и записи (операции с данными), они загружаются в традиционное хранилище строк (буферный кэш).
- Когда запрашиваются данные для операций только для чтения, этими данными заполняется новое хранилище столбцов в памяти. Разумеется, во время этого заполнения происходит преобразование данных из строчного в колоночный формат.
- При фиксации транзакции, включающей вставки, обновления или удаления, новые данные немедленно и одновременно появляются как в хранилище строк, так и в хранилище столбцов в памяти. Поэтому оба хранилища являются транзакционно согласованными.
Хранилище столбцов в памяти:
База данных в памяти использует хранилище столбцов в памяти, которое является новым компонентом глобальной области системы (SGA), называемым «областью в памяти». Данные в хранилище столбцов в памяти находятся не в традиционном строчном формате, а в новом колоночном формате. Хранилище столбцов в памяти не заменяет буферный кэш, а выступает в качестве дополнения к нему, поэтому теперь данные можно хранить в памяти как в строчном, так и в колоночном формате.
Область в памяти — это статический пул в SGA, размер которого определяется параметром инициализации INMEMORY_SIZE (по умолчанию 0). Текущий размер области в памяти отображается в V$SGA.
Хранилище столбцов в памяти разделено на два пула:
- Пул 1 Мбайт — в нем хранятся сами данные в формате столбцов.
- Пул 64 Кбайт — в нем хранятся метаданные объектов.
Объем памяти, доступный в каждом пуле, можно просмотреть, выполнив приведенный ниже запрос:
SQL> select * from v$inmemory_area;
POOL |
ALLOC_BYTES |
USED_BYTES |
POPULATE_STATUS |
CON_I |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
1 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
1 |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
2 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
2 |
1MB POOL |
2.5767E+11 |
2.3569E+11 |
DONE |
3 |
64KB POOL |
6.4408E+10 |
876347392 |
DONE |
3 |
Таблица 1. Объем памяти, доступный в каждом пуле
Включение хранилища столбцов в памяти:
Для статического пула любые изменения параметра INMEMORY_SIZE вступят в силу только после перезапуска экземпляра базы данных. Кроме того, на статический пул не влияет автоматическое управление памятью (AMM). Размер области в памяти должен составлять не менее 100 Мбайт.
sql> ALTER SYSTEM SET SGA_TARGET=500G SCOPE=SPFILE;
sql> ALTER SYSTEM SET INMEMORY_SIZE=300G SCOPE=SPFILE;
sql>SHUTDOWN IMMEDIATE;
sql>STARTUP;
Запускается экземпляр ORACLE.
Total System Global Area 4.2950E+11 bytes
Fixed Size 7677400 bytes
Variable Size 2.0938E+10 bytes
Database Buffers 8.5899E+10 bytes
Redo Buffers 529190912 bytes
In-Memory Area 3.2212E+11 bytes
Database mounted.
Database opened.
Параметры в памяти можно просмотреть, выполнив следующий запрос:
SQL> SHOW PARAMETER INMEMORY
NAME TYPE VALUE
---------------------------------- ----------- -----
inmemory_clause_default string
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 1
inmemory_query string ENABLE
inmemory_size biginteger 300G
inmemory_trickle_repopulate_servers_ integer 1
percent
optimizer_inmemory_aware boolean TRUE
Также можно задать параметр inmemory_size на уровне CDB и PDB. Если этот параметр установлен на уровне PDB, перезапускать экземпляр или PDB не нужно. Сумма всех значений PDB меньше значения CDB или равна ему.
Хранение данных в памяти можно включить и отключить на уровне PDB, как показано ниже:
Подключитесь к PDB и выполните следующую команду:
Отключение:
Alter system set inmemory_size=0; or
Alter system reset inmemory_size;
Включение:
Alter system set inmemory_size=20G;
Уровни приоритета в памяти:
В хранилище столбцов в памяти должны размещаться наиболее важные с точки зрения производительности данные в базе данных. Данные, которые менее важны с точки зрения производительности, можно разместить на более дешевых флэш-накопителях или дисках. Разумеется, если база данных достаточно мала, можно разместить все таблицы в хранилище столбцов в памяти. В базе данных в памяти добавляется новый атрибут INMEMORY для таблиц и материализованных представлений.
Атрибут INMEMORY можно включить для
табличных областей, таблиц, разделов и подразделов и материализованных представлений.
Если этот атрибут включен на уровне табличной области, то по умолчанию для хранилища IMCOLUMN будут включены все таблицы и материализованные представления в табличной области.
alter tablespace quest INMEMORY;
Если этот атрибут включен на уровне таблицы, то все столбцы таблицы должны размещаться в хранилище IMCOLUMN. Однако, также можно разместить в хранилище IMCOLUMN только подмножество столбцов.
Alter table quest_tab INMEMORY NO Inmemory (EMP);
Аналогично для секционированной таблицы:
Alter table quest_tab INMEMORY MODIFY Partition quest_part_1 No Inmemory;
Фоновые процессы:
IMCO: фоновый процесс IMCO инициирует заполнение (предварительное заполнение) объектов в памяти с приоритетом LOW/MEDIUM/HIGH/CRITICAL.
SMCO: SMCO динамически ускоряет подчиненные процессы (Wnnn) для реализации этих задач.
Wnnn: процессы Wnnn выполняют операции заполнения и повторного заполнения памяти, служащие для заполнения или повторного заполнения объектов, для которых включено хранение в памяти.
Объекты размещаются в хранилище столбцов в памяти либо в списке с приоритетами сразу после открытия базы данных, либо после первого сканирования (или выполнения запроса к этим объектам). Порядок заполнения объектов определяется ключевым словом PRIORITY, которое задает приоритет. Существует пять уровней приоритета. Значение PRIORITY по умолчанию — NONE (Нет). Это означает, что объект заполняется только после первого сканирования.
Различные уровни приоритета определяются вложенным предложением PRIORITY в предложении INMEMORY.
Уровень приоритета Описание
CRITICAL Объект заполняется сразу после открытия базы данных
HIGH Объект заполняется после заполнения всех объектов уровня CRITICAL
MEDIUM Объект заполняется после заполнения всех объектов уровней CRITICAL и HIGH
LOW Объект заполняется после заполнения всех объектов уровней CRITICAL, HIGH и MEDIUM
NONE Объекты заполняются только после первого сканирования (по умолчанию)
Объекты размером менее 64 Кбайт не помещаются в память. Это связано с тем, что они будут занимать значительный объем памяти в хранилище столбцов в памяти, так как память выделяется блоками по 1 Мбайт.
Пример: alter table quest inmemory priority critical;
Методы сжатия в хранилище столбцов в памяти:
В хранилище столбцов в памяти используются специальные форматы сжатия, которые оптимизированы для скорости доступа, а не для уменьшения используемого объема памяти. База данных обеспечивает увеличение скорости доступа следующим образом:
- Форматы сжатия позволяют базе данных уменьшить объем обрабатываемой памяти для каждого столбца. Инструкции SQL выполняются непосредственно в сжатых столбцах.
- В базе данных используются векторные инструкции SIMD (для работы с массивами), которые обрабатывают массив значений столбцов за каждый тактовый цикл ЦП. В векторе базы данных может храниться несколько значений, что максимально повышает производительность векторной обработки SIMD.
Сжатие в памяти задается с помощью ключевого слова MEMCOMPSS, вложенного предложения атрибута INMEMORY. Существует шесть уровней сжатия и производительности.
Без сжатия памяти (No Memcompress): данные записываются в память без сжатия.
Сжатие памяти для DML (Memcompress for DML): оптимизация для производительности DML с минимальным сжатием.
Низкое сжатие памяти для запросов (Memcompress for Query Low): оптимизация для производительности запросов (по умолчанию).
Высокое сжатие памяти для запросов (Memcompress for Query High): оптимизация для производительности запросов и экономия пространства.
Низкое сжатие памяти для емкости (Memcompress for Capacity Low): большая экономия пространства по сравнению с высоким и низким сжатием памяти для запросов.
Высокое сжатие памяти для емкости (Memcompress for Capacity High): оптимизация для экономии пространства с небольшим снижением производительности.
Коэффициент сжатия может варьироваться в диапазоне от 2X до 20X в зависимости от выбранного уровня сжатия, типа данных и содержимого таблицы.
Пример: alter table quest inmemory memcompress for query high;
Хранилище столбцов в памяти в RAC:
В кластерной среде каждый узел имеет собственное хранилище столбцов. Каждый узел в кластере должен поддерживать одинаковый размер хранилища столбцов в памяти. По умолчанию все объекты, записываемые в память, будут распределены по всем хранилищам столбцов в памяти в составе кластера. Распределение объектов по хранилищам столбцов в памяти в составе кластера контролируется двумя дополнительными вложенными предложениями атрибута INMEMORY: DISTRIBUTE и DUPLICATE (только для специализированных систем).
Распределение (DISTRIBUTE):
Объекты распределяются по кластеру в зависимости от заданного вложенного предложения распределения. Объекты могут быть распределены следующими способами:
Распределение по строкам — распределение объектов по строкам в разных узлах.
Распределение по разделам — распределение разделов по узлам в составе кластера.
Распределение по подразделам — распределение подразделов по различным узлам.
Пример: alter table quest inmemory distribute by partition;
Важно отметить, что Oracle In-Memory RAC является
архитектурой без общего доступа для запросов, то есть если выполняется запрос к объектам данных в памяти (предполагая, что объекты распределены по двум хранилищам столбцов в памяти), можно получить только доступ к данным в узле подобия. Другими словами, IMCU (единицы сжатия данных в памяти) не являются общими между экземплярами в составе кластера.
Поэтому можно
установить степень параллелизма (DOP) в режим AUTO (автоматически). Координатор параллельных запросов определяет другие экземпляры местоположения IMCU. Если вы не можете установить DOP в режим AUTO, координатор параллельных запросов не будет использовать другие экземпляры IMCU.
set the degree of parallel to auto
alter system set parallel_degree_policy=AUTO scope=both sid='*';
Дублирование (DUPLICATE):
Для повышения доступности объекты копируются во все экземпляры. Вы можете использовать вложенное предложение дублирования, чтобы указать, что таблица в памяти хранится во всех экземплярах в составе кластера. Этот вариант не подходит для неспециализированных систем.
Пример: alter table quest inmemory duplicate all;
Таблица quest хранится во всех экземплярах.
Мониторинг объектов в памяти:
Для мониторинга объектов в памяти Oracle представляет два новых представления V$:
v$IM_SEGMENTS or v$IM_USER_SEGMENTS and v$IM_COLUMN_LEVEL.
С помощью этих представлений можно узнать число заполненных объектов в хранилище IMCOLUMN.
Пример:
set linesize 256
set pagesize 999
select segment_name,ROUND(SUM(BYTES)/1024/1024/1024,2) "DATA GB",
ROUND(SUM(INMEMORY_SIZE)/1024/1024/1024,2) "IN-MEM GB",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)*100/SUM(BYTES),2) "% IN_MEM",
ROUND(SUM(BYTES-BYTES_NOT_POPULATED)/SUM(INMEMORY_SIZE),2) "COMP RATIO"
from V$IM_SEGMENTS
group by owner,segment_name
order by SUM(bytes) desc;
SEGMENT_NAME ORIG GB IN-MEM GB % IN_MEM COMP RATIO
H_LINEITEM 317.27 68.2 88.77 4.13
H_PARTSUPP 35.17 21.04 100 1.67
Пример:
set linesize 256
set pagesize 999
set verify off
col OBJECT format a30
SELECT owner||'.'||table_name OBJECT,
inmemory INMEMORY,inmemory_priority PRIORITY,
inmemory_distribute DISTRIBUTE,inmemory_compression COMPRESSION,
inmemory_duplicate DUPLICATE
FROM all_tables
where owner='QUEST'
ORDER BY inmemory, owner||'.'||table_name;
OBJECT INMEMORY PRIORITY DISTRIBUTE COMPRESSION DUPLICATE
H_NATION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_REGION ENABLED CRITICAL AUTO FOR QUERY HIGH NO DUPLICATE
H_CUSTOMER
H_SUPPLIER
В приведенном выше примере видно, что для двух таблиц (Customer и Supplier) не задано значение столбца INMEMORY. Атрибут INMEMORY является атрибутом уровня сегмента. Customer и Supplier являются секционированными таблицами и, следовательно, логическими объектами. Атрибут INMEMORY для этих таблиц будет записан на уровне раздела или подраздела в *_TAB_ (SUB) PARTITIONS.
Три дополнительных столбца — INMEMORY_PRIORITY, INMEMORY_DISTRIBUTE и INMEMORY_COMPRESSION — также были добавлены в представления *_TABLES для указания текущих атрибутов в памяти для каждой таблицы.