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

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 partitioning | Expression 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.