Перейти к основному содержимому

List partitioning

Начиная с версии 1.5.0, Selena поддерживает list partitioning. Данные разбиваются на разделы на основе предопределенного списка значений для каждого раздела, что может ускорить запросы и упростить управление в соответствии с перечисленными значениями.

Введение

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

list_partitioning

List partitioning подходит для хранения данных, столбцы которых содержат небольшое количество перечисляемых значений, и вы часто запрашиваете и управляете данными на основе этих перечисляемых значений. Например, столбцы представляют географические местоположения, штаты и категории. Каждое значение в столбце представляет независимую категорию. Разбивая данные на основе перечисляемых значений, вы можете улучшить производительность запросов и упростить управление данными.

List partitioning особенно полезно для сценариев, где раздел должен включать несколько значений для каждого столбца разбиения. Например, если таблица включает столбец City, представляющий город, откуда родом человек, и вы часто запрашиваете и управляете данными по штатам и городам. При создании таблицы вы можете использовать столбец City в качестве столбца разбиения для List Partitioning и указать, что данные различных городов в пределах одного штата размещаются в одном разделе, например PARTITION pCalifornia VALUES IN ("Los Angeles", "San Francisco", "San Diego"). Этот метод может ускорить запросы на основе штатов и городов, одновременно упрощая управление данными.

Если раздел должен содержать только данные с одинаковым значением каждого столбца разбиения, рекомендуется использовать expression partitioning.

Сравнение между list partitioning и expression partitioning

Основное различие между list partitioning и expression partitioning (рекомендуется) заключается в том, что list partitioning требует от вас ручного создания разделов один за другим. С другой стороны, expression partitioning может автоматически создавать разделы во время загрузки для упрощения разбиения. И в большинстве случаев expression partitioning может заменить list partitioning. Конкретное сравнение между ними показано в следующей таблице:

Метод разбиенияList partitioningExpression partitioning
СинтаксисPARTITION BY LIST (partition_columns)( PARTITION <partition_name> VALUES IN (value_list) [, ...] )PARTITION BY <partition_columns>
Несколько значений для каждого столбца разбиения в разделеПоддерживается. Раздел может хранить данные с различными значениями в каждом столбце разбиения. В следующем примере, когда загружаемые данные содержат значения Los Angeles, San Francisco и San Diego в столбце city, все данные сохраняются в одном разделе pCalifornia.PARTITION BY LIST (city) ( PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego") [, ...] )Не поддерживается. Раздел хранит данные с одинаковым значением в столбце разбиения. Например, выражение PARTITION BY (city) используется в expression partitioning. Когда загружаемые данные содержат значения Los Angeles, San Francisco и San Diego в столбце city, Selena автоматически создаст три раздела pLosAngeles, pSanFrancisco и pSanDiego. Три раздела соответственно хранят данные со значениями Los Angeles, San Francisco и San Diego в столбце city.
Создание разделов перед загрузкой данныхПоддерживается. Разделы должны быть созданы при создании таблицы.Нет необходимости делать это. Разделы могут быть автоматически созданы во время загрузки данных.
Автоматическое создание List разделов во время загрузки данныхНе поддерживается. Если раздел, соответствующий данным, не существует во время загрузки данных, возвращается ошибка.Поддерживается. Если раздел, соответствующий данным, не существует во время загрузки данных, Selena автоматически создает раздел для хранения данных. Каждый раздел может содержать только данные с одинаковым значением для столбца разбиения.
SHOW CREATE TABLEВозвращает определение разделов в операторе CREATE TABLE.После загрузки данных оператор возвращает результат с предложением partition, используемым в операторе CREATE TABLE, то есть PARTITION BY (partition_columns). Однако возвращаемый результат не показывает автоматически созданные разделы. Если вам нужно просмотреть автоматически созданные разделы, выполните SHOW PARTITIONS FROM <table_name>.

Использование

Синтаксис

PARTITION BY LIST (partition_columns) (
PARTITION <partition_name> VALUES IN (value_list)
[, ...]
)

partition_columns::=
<column> [,<column> [, ...] ]

value_list ::=
value_item [, value_item [, ...] ]

value_item ::=
{ <value> | ( <value> [, <value>, [, ...] ] ) }

Параметры

ПараметрыОбязательныеОписание
partition_columnsДАимена столбцов разбиения. Значения столбца разбиения могут быть строковыми (BINARY не поддерживается), датой или datetime, целыми числами и логическими значениями. Начиная с версии 1.5.0, столбец разбиения допускает значения NULL.
partition_nameДАИмя раздела. Рекомендуется устанавливать подходящие имена разделов на основе бизнес-сценария для различения данных в разных разделах.
value_listДАСписок значений столбцов разбиения в разделе.

Примеры

Пример 1: Предположим, вы часто запрашиваете детали биллинга центра обработки данных на основе штатов или городов. При создании таблицы вы можете указать столбец разбиения как city и указать, что каждый раздел хранит данные городов в пределах одного штата. Этот метод может ускорить запросы для конкретных штатов или городов и упростить управление данными.

CREATE TABLE t_recharge_detail1 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY LIST (city) (
PARTITION pLos_Angeles VALUES IN ("Los Angeles"),
PARTITION pSan_Francisco VALUES IN ("San Francisco")
)
DISTRIBUTED BY HASH(`id`);

Пример 2: Предположим, вы часто запрашиваете детали биллинга центра обработки данных на основе временных диапазонов и конкретных штатов или городов. Во время создания таблицы вы можете указать столбцы разбиения как dt и city. Таким образом, данные конкретных дат и конкретных штатов или городов сохраняются в одном разделе, улучшая скорость запросов и упрощая управление данными.

CREATE TABLE t_recharge_detail4 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
) ENGINE=OLAP
DUPLICATE KEY(id)
PARTITION BY LIST (dt,city) (
PARTITION p202204_California VALUES IN (
("2022-04-01", "Los Angeles"),
("2022-04-01", "San Francisco"),
("2022-04-02", "Los Angeles"),
("2022-04-02", "San Francisco")
),
PARTITION p202204_Texas VALUES IN (
("2022-04-01", "Houston"),
("2022-04-01", "Dallas"),
("2022-04-02", "Houston"),
("2022-04-02", "Dallas")
)
)
DISTRIBUTED BY HASH(`id`);

Ограничения

  • List partitioning не поддерживает динамическое разбиение и создание нескольких разделов одновременно.
  • В настоящее время режим shared-data Selena не поддерживает эту функцию.
  • Когда оператор ALTER TABLE <table_name> DROP PARTITION <partition_name>; используется для удаления раздела, созданного с помощью list partitioning, данные в разделе удаляются напрямую и не могут быть восстановлены.
  • В настоящее время вы не можете создавать резервные копии и восстанавливать таблицы, созданные со стратегией list partitioning.
  • Начиная с версии 1.5.0, Selena поддерживает создание асинхронных материализованных представлений с базовыми таблицами, созданными со стратегией list partitioning.