Skip to main content
  • Place orders quickly and easily
  • View orders and track your shipping status
  • Enjoy members-only rewards and discounts
  • Create and access a list of your products

Как настроить хранение данных в памяти для базы данных Oracle 12c

Summary: Наша задача — предоставлять решения для упрощения ИТ-инфраструктуры, предлагая решения для баз данных, специализированную разработку, динамические ЦОД и гибкие вычислительные системы. ...

This article applies to This article does not apply to This article is not tied to any specific product. Not all product versions are identified in this article.

Symptoms

Применение: 
База данных Oracle — версия 12.1.0.2

Автор:

Махеш Редди М.

Введение.

С момента появления Oracle Database 12c In-Memory одна база данных может эффективно поддерживать смешанные рабочие нагрузки, обеспечивая оптимальную производительность для транзакций и поддерживая функции отчетности и аналитики в реальном времени. Хранение данных в памяти позволяет выполнять специализированный анализ как на витринах данных, так и в хранилищах данных, и конечные пользователи получают возможность выполнять несколько бизнес-запросов за то же время, за которое в традиционных системах можно выполнить всего один запрос. Эта функция позволяет сохранять столбцы, таблицы, разделы и материализованные представления в памяти в колоночном формате, а не в стандартном строчном формате. Колоночный формат в оперативной памяти стал главной новой функцией в наборе исправлений 12.1.0.2.

Архитектура Oracle Database 12c In-Memory:

Обычно данные хранятся только в строчном формате, а в базе данных в оперативной памяти данные хранятся только в колоночном формате. Таким образом, Oracle Database 12c поддерживает двухформатную архитектуру.
  1. Когда запрашиваются данные для операций чтения и записи (операции с данными), они загружаются в традиционное хранилище строк (буферный кэш).
  2. Когда запрашиваются данные для операций только для чтения, этими данными заполняется новое хранилище столбцов в памяти. Разумеется, во время этого заполнения происходит преобразование данных из строчного в колоночный формат.
  3. При фиксации транзакции, включающей вставки, обновления или удаления, новые данные немедленно и одновременно появляются как в хранилище строк, так и в хранилище столбцов в памяти. Поэтому оба хранилища являются транзакционно согласованными.
Хранилище столбцов в памяти:

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

Область в памяти — это статический пул в SGA, размер которого определяется параметром инициализации INMEMORY_SIZE (по умолчанию 0). Текущий размер области в памяти отображается в V$SGA.

Хранилище столбцов в памяти разделено на два пула:
  1. Пул 1 Мбайт — в нем хранятся сами данные в формате столбцов.
  2. Пул 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 для указания текущих атрибутов в памяти для каждой таблицы.
Article Properties
Article Number: 000124827
Article Type: Solution
Last Modified: 21 Feb 2021
Version:  3
Find answers to your questions from other Dell users
Support Services
Check if your device is covered by Support Services.