Привет, Я DocuDroid!
Оценка ИИ поиска
Спасибо за оценку нашего ИИ поиска!
Мы будем признательны, если вы поделитесь своими впечатлениями, чтобы мы могли улучшить наш ИИ поиск для вас и других читателей.
GitHub

Сжатие данных

Андрей Аксенов

Сжатие данных в кластерах 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

Возможные значения 1 — 19:

  • 1 (по умолчанию) — самый быстрый, наименьшее сжатие.

  • 19 — самый медленный, максимальное сжатие.

Возможные значения 1 — 9:

  • 1 (по умолчанию) — самый быстрый, наименьшее сжатие.

  • 9 — самый медленный, максимальное сжатие.

Возможные значения 1 — 4:

  • 1 (по умолчанию) — только RLE. Самый быстрый, наименьшее сжатие.

  • 2 — RLE + zlib с уровнем сжатия 1.

  • 3 — RLE + zlib с уровнем сжатия 5.

  • 4 — RLE + zlib с уровнем сжатия 9. Самый медленный, максимальное сжатие.

Обратите внимание на следующее:

  • Более высокие уровни сжатия позволяют уменьшить размер данных, но увеличивают нагрузку на 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) таблицу.

Настройка параметров сжатия

Предварительные требования

Для выполнения команд, описанных в следующих разделах, подключитесь к мастер-хосту Greengage DB с помощью psql, как описано в статье Подключение к Greengage DB с использованием psql. Затем создайте новую базу данных и подключитесь к ней:

CREATE DATABASE marketplace;
\c marketplace

Уровень таблицы

Эта команда создает строковую (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