Перейти к основному содержимому
Версия: 2.0.x

List partitioning (Legacy)

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

примечание

Обратите внимание, что начиная с версии v1.5.2, expression partitioning был дополнительно оптимизирован для унификации всех стратегий partitioning и поддержки более сложных решений. Он рекомендуется в большинстве случаев и заменит стратегию list partitioning в будущих релизах.

Введение

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

list_partitioning

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

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

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

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

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

Метод partitioningList partitioningExpression partitioning
СинтаксисPARTITION BY LIST (partition_columns)( PARTITION <partition_name> VALUES IN (value_list) [, ...] )PARTITION BY <partition_columns>
Несколько значений для каждого столбца partitioning в partitionПоддерживается. Partition может хранить данные с различными значениями в каждом столбце partitioning. В следующем примере, когда загруженные данные содержат значения Los Angeles, San Francisco и San Diego в столбце city, все данные хранятся в одной partition pCalifornia.PARTITION BY LIST (city) ( PARTITION pCalifornia VALUES IN ("Los Angeles","San Francisco","San Diego") [, ...] )Не поддерживается. Partition хранит данные с одинаковым значением в столбце partitioning. Например, выражение PARTITION BY (city) используется в expression partitioning. Когда загруженные данные содержат значения Los Angeles, San Francisco и San Diego в столбце city, Selena автоматически создаст три partitions pLosAngeles, pSanFrancisco и pSanDiego. Три partitions соответственно хранят данные со значениями Los Angeles, San Francisco и San Diego в столбце city.
Создание partitions перед загрузкой данныхПоддерживается. Partitions должны быть созданы при создании таблицы.Не требуется. Partitions могут быть автоматически созданы во время загрузки данных.
Автоматическое создание List partitions во время загрузки данныхНе поддерживается. Если partition, соответствующая данным, не существует во время загрузки данных, возвращается ошибка.Поддерживается. Если partition, соответствующая данным, не существует во время загрузки данных, Selena автоматически создает partition для хранения данных. Каждая partition может содержать только данные с одинаковым значением для столбца partitioning.
SHOW CREATE TABLEВозвращает определение partitions в операторе CREATE TABLE.После загрузки данных оператор возвращает результат с предложением partition, использованным в операторе CREATE TABLE, то есть PARTITION BY (partition_columns). Однако возвращенный результат не показывает автоматически созданные partitions. Если вам нужно просмотреть автоматически созданные partitions, выполните 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ДАИмена столбцов partitioning. Значения столбца partitioning могут быть строковыми (BINARY не поддерживается), датой или datetime, целочисленными и булевыми значениями. Начиная с v1.5.2, столбец partitioning допускает значения NULL.
partition_nameДАИмя partition. Рекомендуется устанавливать подходящие имена partitions на основе бизнес-сценария для разделения данных в разных partitions.
value_listДАСписок значений столбца partitioning в partition.

Примеры

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

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: Предположим, вы часто запрашиваете детали выставления счетов дата-центра на основе временных диапазонов и конкретных штатов или городов. При создании таблицы вы можете указать столбцы partitioning как dt и city. Таким образом, данные конкретных дат и конкретных штатов или городов хранятся в одной partition, улучшая скорость запросов и упрощая управление данными.

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