Сжатие данных
Сжатие данных в кластерах Greengage DB позволяет оптимизировать производительность ввода-вывода и уменьшить требования к хранилищу. Сжатие доступно только для оптимизированных для добавления (Append-Optimized, AO) таблиц и может быть настроено на двух различных уровнях:
-
Сжатие данных на уровне таблицы (table-level) применяет один алгоритм сжатия ко всем столбцам таблицы.
-
Сжатие данных на уровне столбца (column-level) позволяет применять разные алгоритмы сжатия к отдельным столбцам. Этот тип сжатия доступен только для оптимизированных для добавления (AO) таблиц с колоночной ориентацией данных (column-oriented).
Обзор
Поддерживаемые алгоритмы сжатия
В таблице ниже перечислены алгоритмы сжатия, поддерживаемые в Greengage DB, их области применения и соответствующие параметры хранения.
Zstandard | Deflate | Run-length encoding | |
---|---|---|---|
Описание |
Обеспечивает как скорость, так и высокую степень сжатия данных |
По большей части, используется для обратной совместимости. Для большинства типов нагрузок Zstandard обычно обеспечивает лучшее сжатие и производительность |
Run-length encoding (RLE) лучше сжимает данные, когда значения повторяются во множестве последовательных строк. Однако RLE неэффективен для столбцов, в которых повторяющиеся значения встречаются редко |
Типы таблиц |
AO: строковое и колоночное хранение |
AO: строковое и колоночное хранение |
AO: колоночное хранение |
Применим к |
Таблицы и столбцы |
Таблицы и столбцы |
Столбцы |
compresstype |
zstd |
zlib |
rle_type |
compresslevel |
Возможные значения
|
Возможные значения
|
Возможные значения
|
Обратите внимание на следующее:
-
Более высокие уровни сжатия позволяют уменьшить размер данных, но увеличивают нагрузку на CPU и время обработки. Выберите уровень сжатия, который обеспечивает баланс между экономией места, доступными ресурсами CPU и требованиями производительности.
-
Производительность работы со сжатыми таблицами зависит от аппаратного обеспечения и характера запросов. Проведите тестирование разных уровней сжатия в конкретном окружении, чтобы определить эффективность сжатия данных.
Используйте сжатие rle_type
для столбцов с большим количеством повторяющихся значений.
Для большинства случаев zstd
с уровнем сжатия 1
обеспечивает оптимальный баланс скорости и степени сжатия, сопоставимый с zlib
на уровне 5
.
Параметры сжатия: синтаксис
Вы можете указать параметры сжатия на уровне таблицы или столбца с помощью команд CREATE TABLE
или ALTER TABLE
.
Синтаксис команды CREATE TABLE
описан в разделе Синтаксис CREATE TABLE.
Чтобы задать параметры сжатия для таблицы или столбца, используйте одно из следующих выражений:
-
WITH
для сжатия на уровне таблицы:CREATE TABLE <table_name> ( [ ... ] ) WITH ( <storage_directive> [, ... ] )
-
ENCODING
для сжатия определенного столбца:<column_name> <data_type> ENCODING ( <storage_directive> [, ... ] ), ... -- или -- COLUMN <column_name> ENCODING ( <storage_directive> [, ... ] ), ... -- или -- DEFAULT COLUMN ENCODING ( <storage_directive> [, ... ] )
Независимо от уровня, на котором применяется сжатие данных, вы можете использовать следующие параметры:
-
compresstype
— устанавливает используемый алгоритм сжатия. См. строку compresstype в таблице Поддерживаемые алгоритмы сжатия, чтобы узнать возможные значения. Значения не чувствительны к регистру. По умолчанию используетсяnone
(без сжатия). -
compresslevel
— устанавливает уровень сжатия данных. См. строку compresslevel в таблице Поддерживаемые алгоритмы сжатия, чтобы узнать возможные значения. -
blocksize
— определяет размер (в байтах) каждого блока хранения в таблице. Меньшие значения параметраblocksize
ускоряют случайный доступ, а большие — последовательный доступ.
Вы также можете использовать указанные выше параметры для настройки сжатия при определении нового типа данных с помощью команды CREATE TYPE
.
Параметр конфигурации сервера gp_default_storage_options
позволяет задавать значения по умолчанию для параметров хранения таблиц, включая compresstype
и compresslevel
.
Параметры сжатия: приоритет
Настройки сжатия столбца наследуются в следующем порядке приоритетов — от наименьшего к наибольшему:
тип -> таблица -> партиция (partition) -> сабпартиция (subpartition)
Это означает, что:
-
Настройки на уровне таблицы переопределяют настройки на уровне типа.
-
Настройки на уровне партиции переопределяют настройки на уровне таблицы и типа.
-
Настройки на уровне сабпартиции переопределяют все настройки вышестоящих уровней, включая партицию, таблицу и тип.
При одновременном описании сжатия данных в выражениях ENCODING
и WITH
более высокий приоритет у выражения ENCODING
.
Параметр конфигурации сервера gp_add_column_inherits_table_setting
включает автоматическое наследование настроек сжатия при добавлении нового столбца в колоночную оптимизированную для добавления (AO) таблицу.
Настройка параметров сжатия
Уровень таблицы
Эта команда создает строковую (row-oriented) оптимизированную для добавления (AO) таблицу со сжатием Zstandard (zstd
) на уровне 5
, заданным с помощью выражения WITH
:
CREATE TABLE customers_table_compression
(
customer_id INTEGER,
name VARCHAR(25)
)
WITH (
appendoptimized = true,
compresstype = zstd,
compresslevel = 5
)
DISTRIBUTED BY (customer_id);
INSERT INTO customers_table_compression (customer_id, name)
SELECT customer_number AS customer_id,
'customer' || customer_number AS name
FROM generate_series(1, 1000) AS customer_number;
Вы можете использовать аналогичную команду для создания сжатой колоночной таблицы (AO, column-oriented):
CREATE TABLE orders_table_compression
(
order_id INTEGER,
customer_id INTEGER,
amount DECIMAL(6, 2)
)
WITH (
appendoptimized = true,
orientation = column,
compresstype = zstd,
compresslevel = 5
)
DISTRIBUTED BY (customer_id);
INSERT INTO orders_table_compression (order_id, customer_id, amount)
SELECT order_number AS order_id,
FLOOR(RANDOM() * 1000 + 1)::INTEGER AS customer_id,
ROUND((100 + RANDOM() * 1000)::NUMERIC, 2) AS amount
FROM generate_series(1, 10000) AS order_number;
Уровень столбца
Команда ниже применяет сжатие на уровне столбцов с помощью выражения ENCODING
.
Для столбца order_status
используется сжатие RLE (rle_type
), а столбец amount
сжимается с помощью Zstandard (zstd
):
CREATE TABLE orders_column_compression
(
order_id INTEGER,
customer_id INTEGER,
order_status TEXT ENCODING (compresstype = rle_type, compresslevel = 1),
amount DECIMAL(6, 2) ENCODING (compresstype = zstd, compresslevel = 5)
)
WITH (
appendoptimized = true,
orientation = column
)
DISTRIBUTED BY (customer_id);
INSERT INTO orders_column_compression (order_id, customer_id, order_status, amount)
SELECT order_number AS order_id,
FLOOR(RANDOM() * 1000 + 1)::INTEGER AS customer_id,
(ARRAY ['new', 'shipped', 'cancelled', 'returned'])[FLOOR(RANDOM() * 4 + 1)::INTEGER] AS order_status,
ROUND((100 + RANDOM() * 1000)::NUMERIC, 2) AS amount
FROM generate_series(1, 10000) AS order_number;
Просмотр информации о сжатии данных
Информация о сжатии таблиц
Чтобы просмотреть параметры сжатия, примененные к конкретной таблице, используйте метакоманду \d+
:
\d+ orders_table_compression
Параметры сжатия отображаются в разделе Options
вывода команды:
Append-Only Columnar Table "public.orders_table_compression" Column | Type | Modifiers | Storage | Stats target | Compression Type | Compression Level | Block Size | Description -------------+--------------+-----------+---------+--------------+------------------+-------------------+------------+------------- order_id | integer | | plain | | zstd | 5 | 32768 | customer_id | integer | | plain | | zstd | 5 | 32768 | amount | numeric(6,2) | | main | | zstd | 5 | 32768 | Checksum: t Distributed by: (customer_id) Options: appendonly=true, orientation=column, compresstype=zstd, compresslevel=5
Вы также можете выполнить запрос к системной таблице pg_appendonly
, чтобы получить информацию о параметрах хранения и других характеристиках оптимизированной для добавления таблицы:
SELECT compresstype, compresslevel, blocksize, columnstore
FROM pg_appendonly
WHERE relid = 'orders_table_compression'::regclass;
Результат может выглядеть следующим образом:
compresstype | compresslevel | blocksize | columnstore --------------+---------------+-----------+------------- zstd | 5 | 32768 | t (1 row)
Информация о сжатии столбцов
Чтобы просмотреть параметры сжатия, применяемые к столбцам, используйте метакоманду \d+
:
\d+ orders_column_compression
Столбцы Compression Type
и Compression Level
показывают алгоритм и уровень сжатия, используемые для каждого столбца таблицы:
Append-Only Columnar Table "public.orders_column_compression" Column | Type | Modifiers | Storage | Stats target | Compression Type | Compression Level | Block Size | Description --------------+--------------+-----------+----------+--------------+------------------+-------------------+------------+------------- order_id | integer | | plain | | none | 0 | 32768 | customer_id | integer | | plain | | none | 0 | 32768 | order_status | text | | extended | | rle_type | 1 | 32768 | amount | numeric(6,2) | | main | | zstd | 5 | 32768 | Checksum: t Distributed by: (customer_id) Options: appendonly=true, orientation=column
Вы также можете выполнить запрос к системной таблице pg_attribute_encoding
, чтобы получить информацию о параметрах хранения столбцов:
SELECT *
FROM pg_attribute_encoding
WHERE attrelid = 'orders_table_compression'::regclass;
Результат выглядит следующим образом:
attrelid | attnum | attoptions ----------+--------+----------------------------------------------------- 393543 | 1 | {compresstype=zstd,compresslevel=5,blocksize=32768} 393543 | 2 | {compresstype=zstd,compresslevel=5,blocksize=32768} 393543 | 3 | {compresstype=zstd,compresslevel=5,blocksize=32768} (3 rows)
Коэффициент сжатия
Используйте функцию get_ao_compression_ratio()
, чтобы определить коэффициент сжатия таблицы:
SELECT get_ao_compression_ratio('orders_table_compression');
Возвращаемое значение 2.14 указывает, что в несжатом виде данные заняли бы более чем в два раза больше места по сравнению со сжатой таблицей:
get_ao_compression_ratio -------------------------- 2.14