Сжатие данных
Сжатие данных в кластерах 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.
Настройка параметров сжатия
Уровень таблицы
Эта команда создает строковую (row-oriented) оптимизированную для добавления (AO) таблицу со сжатием Zstandard (zstd) на уровне 5, заданным с помощью выражения WITH:
CREATE TABLE customers_table_compression
(
customer_id INTEGER,
name VARCHAR(25)
)
USING ao_row
WITH (
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)
)
USING ao_column
WITH (
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)
)
USING ao_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;
Добавление столбца со сжатием
Используйте команду ALTER TABLE для добавления нового столбца со сжатием.
Следующий пример добавляет столбец со сжатием zstd:
ALTER TABLE orders_column_compression
ADD COLUMN discount_rate DECIMAL(5, 2) DEFAULT 0
ENCODING (compresstype = zstd, compresslevel = 5);
Просмотр информации о сжатии данных
Информация о сжатии таблиц
Чтобы просмотреть параметры сжатия, примененные к конкретной таблице, используйте метакоманду \d+:
\d+ orders_table_compression
Параметры сжатия отображаются в разделе Options вывода команды:
Table "public.orders_table_compression" Column | Type | Collation | Nullable | Default | 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 | Distributed by: (customer_id) Access method: ao_column Options: compresstype=zstd, compresslevel=5, blocksize=32768, checksum=true
Вы также можете выполнить запрос к системной таблице pg_class, чтобы получить информацию о параметрах хранения и других характеристиках оптимизированной для добавления таблицы:
SELECT relname, relkind, reloptions
FROM pg_class
WHERE relname = 'orders_table_compression';
Результат может выглядеть следующим образом:
relname | relkind | reloptions
--------------------------+---------+-------------------------------------------------------------------
orders_table_compression | r | {compresstype=zstd,compresslevel=5,blocksize=32768,checksum=true}
(1 row)
Информация о сжатии столбцов
Чтобы просмотреть параметры сжатия, применяемые к столбцам, используйте метакоманду \d+:
\d+ orders_column_compression
Столбцы Compression Type и Compression Level показывают алгоритм и уровень сжатия, используемые для каждого столбца таблицы:
Table "public.orders_column_compression"
Column | Type | Collation | Nullable | Default | 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 |
discount_rate | numeric(5,2) | | | 0 | main | | zstd | 5 | 32768 |
Distributed by: (customer_id)
Access method: ao_column
Options: blocksize=32768, compresslevel=0, compresstype=none, checksum=true
Вы также можете выполнить запрос к системной таблице pg_attribute_encoding, чтобы получить информацию о параметрах хранения столбцов:
SELECT *
FROM pg_attribute_encoding
WHERE attrelid = 'orders_table_compression'::regclass;
Результат выглядит следующим образом:
attrelid | attnum | filenum | lastrownums | attoptions
----------+--------+---------+-------------+-----------------------------------------------------
25751 | 1 | 1 | | {compresstype=zstd,compresslevel=5,blocksize=32768}
25751 | 2 | 2 | | {compresstype=zstd,compresslevel=5,blocksize=32768}
25751 | 3 | 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
(1 row)