Рекомендации по DDL

В этом документе описаны рекомендации по созданию таблиц с использованием YMatrix.

0 Соглашения об именовании

Требование Обязательно
Имена баз данных, таблиц, столбцов, функций, представлений, последовательностей, псевдонимов и т.д. должны состоять из строчных букв, подчёркиваний и цифр, начинаться со строчной буквы и не должны начинаться с pg. Длина имени объекта не должна превышать 63 символов Да
Имена полей (или столбцов) не должны использовать зарезервированные имена или ключевые слова, такие как oid, xmin, ctid, select, insert, update и т.д. Да
Имя первичного ключа — pk_column_name, уникального индекса — uk_column_name, обычного индекса — idx_column_name Да
Для секционированных таблиц следует использовать имя родительской таблицы в качестве префикса, а характеристики дочерней таблицы — в качестве суффикса, например, родительская таблица order, дочерние таблицы order_p_202010, order_p_202009 Да
Если поле означает «является ли xx», рекомендуется использовать формат is_xxx и тип Boolean, например is_deleted Нет
Желательно, чтобы имя базы данных совпадало с именем сервиса приложения Нет
Имена таблиц должны быть понятными и осмысленными, избегайте двусмысленных сокращений или чрезмерно длинных имён. Рекомендуется следовать формату business name_table purpose, для представлений использовать префикс, для временных таблиц — префикс tmp. Примеры: trade_config, payment_task. Не рекомендуется: tradeconfig, paymenttask. Нет

1 Хранение по строкам и по столбцам

Режим хранения Применим к
Хранение по строкам Частое обновление или вставка данных.
Необходимость одновременного доступа ко многим полям таблицы
Хранение по столбцам Множество полей, но большинство запросов обращаются лишь к нескольким.
Агрегация по небольшому числу полей.
Периодическое обновление отдельных полей без изменения остальных.
Для большинства OLAP-сценариев и временных рядов рекомендуется отдавать приоритет хранению по столбцам.

2 Движок хранения

YMatrix предлагает четыре движка хранения: HEAP, AO и MARS3. Выбор подходящего движка обычно зависит от масштаба данных и требований к производительности записи.

Движок хранения Поддерживаемый режим Применим к
HEAP Хранение по строкам Таблицы, которые часто обновляются
Таблицы с хранением по строкам
AO Хранение по строкам/по столбцам Таблицы и секционированные таблицы, которые после начальной загрузки данных редко обновляются, а данные вставляются только пакетами
MARS3 Гибридное хранение (строки/столбцы)/хранение по столбцам Сценарии временных рядов
OLTP-сценарии с высокочастотной малопакетной записью данных
OLAP-сценарии с низкочастотной массовой записью данных

Примечание!
Более подробную информацию о движках хранения см. в разделе Обзор движков хранения.

3 Типы данных

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

  • Минимализация. Для целых и чисел с плавающей точкой выбирайте наименьший тип, способный представлять нужный диапазон. Например, для поля возраста используйте int2 вместо int4/int8.
  • При использовании векторизованного исполняющего механизма отдавайте предпочтение типам, которые лучше раскрывают потенциал векторизации при соблюдении бизнес-требований, таким как примитивные типы, например int и float.

4 Ключ распределения

YMatrix поддерживает распределение данных по разным узлам для использования возможностей параллельной обработки и повышения производительности. При выборе ключа распределения следует учитывать следующие факторы:

  • Равномерность данных. Равномерное распределение данных позволяет эффективно избежать эффекта узких мест и сбалансировать нагрузку между узлами. Например, столбец, который равномерно распределяет данные по всем сегментам, может использоваться в качестве ключа распределения. Значения в столбце-ключе должны иметь большой и равномерный диапазон; в противном случае возможно возникновение перекоса данных. В особых случаях можно рассмотреть случайное распределение для обеспечения абсолютной равномерности. Запрос для проверки распределения данных выглядит следующим образом: SELECT gp_segment_id, count(*) FROM table_name GROUP BY gp_segment_id;.
  • Удобство JOIN. Для больших таблиц, участвующих в соединениях, по возможности используйте поля соединения в качестве ключей распределения. Это значительно повышает производительность за счёт локальных соединений и избегания перемещения данных между узлами.
  • Дискретность полей. Выбирайте поле с наибольшим количеством различных значений в таблице в качестве ключа распределения. Чем больше значение count(distinct field_name) (то есть количество уникальных значений в этом поле), тем более подходящим является это поле в качестве ключа распределения.
  • Не используйте столбцы из условия WHERE запроса в качестве ключей распределения; вместо этого используйте их в качестве ключей секционирования.
  • Проверяйте данные после начальной и инкрементной загрузки, чтобы минимизировать перекос данных.
  • Не используйте даты или временные метки в качестве ключей распределения.

5 Настройка секционирования

YMatrix — распределённая база данных, которая создаёт различные секции в зависимости от объёма данных. При настройке секционирования следует учитывать несколько ключевых моментов:

  • Размер секции. Для сценариев временных рядов обычно рекомендуется секционирование по году или месяцу, а не по дням. На практике чрезмерно детальное планирование секций затрудняет обслуживание и снижает производительность: при хранении по столбцам слишком большое количество физических файлов может мешать оптимизации запросов.
  • Резервирование секций. Не нужно заранее резервировать слишком много секций. Их можно создавать перед использованием. Например, если используется месячное секционирование, можно создавать 12 новых секций на следующий год в конце каждого года.
  • Стоимость обслуживания секций. В сценариях временных рядов часто в качестве ключа секционирования используется время. По мере его течения можно резервировать и перемещать данные по секциям. Для исторических секций, в которых подтверждено отсутствие данных или нет актуальных данных, своевременно выполняйте очистку. Подробнее см. Регулярная очистка (Vacuuming).
  • Используйте секционирование только тогда, когда по условиям запроса возможно исключение секций (partition pruning). Отдавайте приоритет диапазонному секционированию перед списочным и избегайте одновременного распределения и секционирования таблицы по одному и тому же столбцу.
  • Минимизируйте использование секций по умолчанию, не применяйте многоуровневое секционирование и стремитесь создавать меньше секций, чтобы каждая содержала больше данных.

Особенности операций обслуживания секций для таблиц MARS2/MARS3:

  • Операции ALTER над секциями требуют блокировки всей таблицы, что вызывает взаимоблокировки запросов.
    • Одновременный запрос слишком большого числа секций значительно замедляет выполнение. Поэтому для таблиц MARS2/MARS3 рекомендуется ограничивать размер одной секции на одном сегменте примерно 5 ГБ.

Особенности выполнения операций обслуживания секций для таблиц HEAP/AOCO:

  • Для таблиц HEAP рекомендуется ограничивать размер одной секции на одном сегменте примерно 5 ГБ. Также обращайте внимание на контроль размера индексов.
  • Для таблиц AOCO рекомендуется ограничивать размер одной секции на сегменте примерно 3 ГБ. Также обращайте внимание на контроль размера индексов.

Примечание!
Указанные рекомендуемые значения размера секций применимы к YMatrix 5.X.

6 Размер блока

Вы можете настроить порог сжатия, указав параметр compress_threshold на уровне таблицы MARS3. Увеличение этого значения может снизить количество операций ввода-вывода, но также может снизить эффективность фильтрации блоков.

7 Сжатие и отсутствие сжатия

Рекомендуется использовать сжатое хранение, особенно для таблиц с хранением по столбцам, где сжатие оказывается наиболее эффективным. Сжатое хранение позволяет использовать простаивающие ресурсы ЦП для компенсации времени чтения/записи, снижая нагрузку на ввод-вывод и повышая эффективность запросов.

Если вы используете движок хранения MARS2 или MARS3 для создания таблиц:

  • Что касается типов сжатия, YMatrix рекомендует использовать цепочечное сжатие. Оно уменьшает объём данных на диске и снижает объём данных, считываемых при запросах.
  • Сжатие также связано с накладными расходами на распаковку, поэтому при оптимизации запросов следует отдавать предпочтение алгоритмам с более высокой скоростью распаковки. Собственные алгоритмы YMatrix, за исключением Gorilla, как правило, превосходят LZ4 по скорости распаковки и могут выбираться в зависимости от характеристик данных.

HEAP не поддерживает явное сжатие.

8 Индексы

Индексы — это метод ускорения запросов. Индексные данные обычно хранятся отдельно, поэтому этот раздел рассматривается отдельно.

Для таблиц HEAP и AO существуют различные методы индексации: Btree, Brin, Bitmap, Hash. Для текстовых и пространственных данных дополнительно доступны Gin, Gist, Odin, Spgist и Toin.

MARS2 в настоящее время поддерживает индексы первичного ключа и индексы Brin. Первые — это ключи сортировки, указанные через mars2_btree, которые хранятся отдельно в указанном файле индекса. Вторые — это индексы minmax, созданные для конкретного столбца и хранящиеся в отдельном файле метаданных. Примечания:

  • Если ключ сортировки состоит из нескольких столбцов, внимательно определите порядок. Чем дальше столбец находится в ключе сортировки, тем хуже эффект фильтрации, хотя локальная сортировка всё ещё положительно влияет на сжатие. Например, если требуется запрос по одному устройству, то в сценарии временных рядов ключ сортировки — номер устройства (vin). Если требуется детальный запрос, агрегированный запрос или запрос по нескольким устройствам за определённый период времени, то ключ сортировки обычно — номер устройства и временная метка (vin,daq_time).
  • Выбор индексов Brin тесно связан с результатами сортировки. Если количество кортежей в отсортированном столбце уже мало, сортировка может не обеспечить фильтрацию и даже добавить негативные накладные расходы, поэтому такие столбцы следует исключить.

MARS3 в настоящее время поддерживает индексы Brin. Можно дополнительно создать один или несколько индексов mars3_brin для повышения эффективности запросов (аналогично индексу minmax для таблиц MARS2).

9 Таблицы-копии

  • Данные реплицированной таблицы сохраняются на каждом сегменте, что уменьшает перемещение и перераспределение данных малых таблиц между секциями.
  • Большие таблицы не подходят для стратегии распределения с репликацией, поскольку репликация больших объёмов данных на каждый узел требует значительных затрат на хранение и обслуживание.
    • Например, таблица детализированных данных сцены содержит миллиарды записей, а таблица прав пользователей — всего несколько сотен. Теперь необходимо связать таблицу детализированных данных сцены с таблицей прав пользователей с помощью запроса. Если они связаны напрямую, будет задействовано сотни миллиардов записей. Только путём копирования таблицы прав пользователей на каждый Segement можно избежать таких огромных затрат.
  • Таблица-копия настраивается с помощью параметра DISTRIBUTED REPLICATED.
  • Помимо указанных функций, использование этой стратегии также позволяет снять ограничения на действия, которые пользовательские функции могут выполнять на узлах.

10 Представления

  • Если в сценарии запросов много кластерных запросов, рекомендуется создать представление Continuous Cluster.
  • Если сценарий запросов включает непрерывную агрегацию данных за последний период времени, рекомендуется создать представление sliding window.