Типы таблиц

Обзор

ADB, как и Greenplum, поддерживает несколько типов таблиц, отличающихся способом хранения данных:

  • Heap. Этот тип таблиц используется по умолчанию и рекомендуется для OLTP-нагрузок. Heap-таблицы являются оптимальным выбором в случае частого обновления данных после первоначальной загрузки, а также подходят для однострочных операций INSERT, UPDATE и DELETE.

  • Append-optimized. Эти таблицы предпочтительны для OLAP-нагрузок. Они также отлично подходят для пакетной загрузки данных (bulk data loading). Их рекомендуется использовать при редких обновлениях данных, то есть когда в системе преобладают read-only запросы. В отличие от Heap-таблиц (в которых возможна только строковая ориентация данных — row-oriented), таблицы append-optimized поддерживают две формы ориентации данных:

    • Строковая (row-oriented). Эта модель хранения данных рекомендуется для запросов, в которых одновременно извлекаются все либо большая часть столбцов таблицы.

    • Колоночная (column-oriented). Эта модель подходит для вычислений на базе небольшого набора столбцов таблицы. Ее также рекомендуется использовать при регулярных обновлениях незначительной части столбцов.

table types dark
Типы таблиц
table types light
Типы таблиц

Тип хранения данных необходимо явно указывать на этапе создания таблицы. В последующих подразделах описаны основные отличия существующих типов таблиц. Эта информация может быть полезной для выбора модели хранения данных, наиболее подходящей для нужд проекта и используемых в нем нагрузок.

Сравнение таблиц Heap и Append-optimized

Критерий Heap Append-optimized

Профиль нагрузки

OLTP

OLAP

Размер таблиц

Небольшие таблицы. Например, таблицы измерений (dimension tables)

Денормализованные таблицы фактов (fact tables), которые, как правило, являются самыми объемными в системе

Частота обновлений данных после изначальной загрузки

Часто

Редко

Преобладающий тип запросов

Множество итеративных транзакций, включая однострочные, а также параллельные пакетные обновления данных

  • Пакетная загрузка данных.

  • Частые выборки данных (read-only).

Возможность настройки уникальных значений

Поддерживается — за счет использования модификаторов UNIQUE и PRIMARY KEY при объявлении таблиц

 — 

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

 — 

  • Row-oriented: ZSTD, ZLIB (на уровне таблицы).

  • Column-oriented: ZSTD, ZLIB, RLE_TYPE (на уровне таблицы и столбца).

Синтаксис

Heap-таблицы создаются по умолчанию:

CREATE TABLE test_heap (a int, b text) DISTRIBUTED BY (a);

Для создания таблицы append-optimized необходимо использовать опцию appendoptimized=true в выражении WITH. Устаревшая форма записи appendonly=true допускается, но не рекомендуется:

CREATE TABLE test_ao (a int, b text)
  WITH (appendoptimized=true)
  DISTRIBUTED BY (a);

Рекомендации по использованию

OLTP-нагрузки — с множеством итеративных транзакций на базе небольших таблиц

Хранилища Data Warehouse (OLAP) — с пакетной загрузкой данных и последующими запросами на чтение (read-only) на базе больших денормализованных таблиц

ВНИМАНИЕ

Не рекомендуется применять следующие типы операций к таблицам append-optimized в силу их неэффективности:

  • Однострочные операции INSERT, UPDATE и DELETE.

  • Пакетные параллельные операции UPDATE и DELETE (это не касается пакетных запросов INSERT).

Сравнение таблиц Row-oriented и Column-oriented

Критерий Row-oriented Column-oriented

Тип таблиц

Heap и Append-optimized

Append-optimized

Частота обновлений данных после изначальной загрузки

Часто

Редко

Частота добавления новых данных

Часто

Редко  
 
(таблицы с колоночной ориентацией данных не оптимизированы для INSERT-запросов, поскольку значения столбцов одной строки могут записываться в различные области на диске)

Количество столбцов в таблицах

Относительно небольшое

Множество столбцов (десятки и более)

Количество запрашиваемых столбцов

Все или большая часть

Небольшое подмножество столбцов

Преобладающий тип запросов

Любые

  • SELECT-запросы, которые:

    • Выполняют агрегацию на базе одного столбца (при этом предикаты WHERE и HAVING также используют этот столбец):

      SELECT SUM(price) FROM book;
      SELECT SUM(price) FROM book WHERE price > 1000;
    • Возвращают относительно небольшое число столбцов (при этом предикат WHERE использует один столбец):

      SELECT title FROM book WHERE public_year=2022;
  • Запросы UPDATE, которые изменяют небольшое подмножество столбцов.

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

Возможно на уровне таблицы — в таблицах append-optimized.  
Алгоритмы: ZSTD, ZLIB

Возможно на уровне таблицы и столбца — в таблицах append-optimized.  
Алгоритмы: ZSTD, ZLIB, RLE_TYPE

Синтаксис

  • Heap:

    CREATE TABLE test_heap (a int, b text) DISTRIBUTED BY (a);
  • Append-optimized:

    CREATE TABLE test_ao_row (a int, b text)
      WITH (appendoptimized=true, orientation=row)
      DISTRIBUTED BY (a);

Только append-optimized:  

CREATE TABLE test_ao_column (a int, b text)
  WITH (appendoptimized=true, orientation=column)
  DISTRIBUTED BY (a);

Рекомендации по использованию

  • Нагрузки OLTP-типа — с множеством итеративных транзакций, включая частые вставки и обновления данных.

  • Нагрузки OLAP-типа или смешанные нагрузки — с преобладанием запросов, в которых одновременно извлекаются все или большая часть столбцов таблицы.

Хранилища Data Warehouse (OLAP) — с агрегацией на основе одного столбца или регулярными выборками/обновлениями небольшого набора столбцов

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней