Политика секционирования
Политика секционирования определяет, следует ли и как секционировать экстенты (сегменты данных) для определенной таблицы или материализованного представления.
Политика активирует дополнительный фоновый процесс, который выполняется после создания экстентов после приема данных. Этот процесс включает в себя повторный прием данных из исходных экстентов и создание однородных экстентов, в которых все значения столбца, назначенного как ключ секции , находятся в одной секции.
Основная цель политики секционирования — повысить производительность запросов в определенных поддерживаемых сценариях.
Примечание
По умолчанию, если политика секционирования данных не определена (имеет значение null
), экстенты секционируются по времени создания (приема). В большинстве случаев нет необходимости задавать политику секционирования данных.
Поддерживаемые сценарии
Ниже приведены единственные сценарии, в которых рекомендуется задать политику секционирования данных. Во всех остальных сценариях задавать политику не рекомендуется.
- Частые фильтры по средней или высокой кратности
string
илиguid
столбцу:- Например, мультитенантные решения или таблица метрик, в которой большинство или все запросы фильтруют по столбцу типа
string
илиguid
, напримерTenantId
илиMetricId
. - Средняя кратность составляет не менее 10 000 различных значений.
- Задайте для хэш-ключа
string
секции значение илиguid
столбца и задайте дляPartitionAssigmentMode
свойства значениеuniform
.
- Например, мультитенантные решения или таблица метрик, в которой большинство или все запросы фильтруют по столбцу типа
- Частые агрегирования или объединения в столбце с высокой кратностью
string
:guid
- Например, данные Интернета вещей с различных датчиков или академические записи многих разных учащихся.
- Высокая кратность составляет не менее 1 000 000 различных значений, где распределение значений в столбце приблизительно равно.
- В этом случае задайте для ключа хэш-секции значение столбца, который часто группируется или объединяется, и задайте
PartitionAssigmentMode
для свойства значениеByPartition
.
- Прием неупорядоченных данных:
- Данные, попадаемые в таблицу, могут быть не упорядочены и секционированы на экстенты (сегменты) в соответствии с конкретным
datetime
столбцом, который представляет время создания данных и обычно используется для фильтрации данных. Это может быть связано с обратным заполнением разнородных исходных файлов, которые содержат значения datetime в течение большого промежутка времени. - В этом случае задайте в качестве столбца ключ секции datetime в универсальном диапазоне
datetime
. - Если необходимо, чтобы политики хранения и кэширования соответствовали значениям даты и времени в столбце, вместо согласования со временем приема присвойте свойству
OverrideCreationTime
значениеtrue
.
- Данные, попадаемые в таблицу, могут быть не упорядочены и секционированы на экстенты (сегменты) в соответствии с конкретным
Внимание!
- Жестко заданные ограничения на количество таблиц с определенной политикой секционирования не установлены. Однако каждая дополнительная таблица добавляет дополнительные затраты на фоновый процесс секционирования данных, который выполняется на узлах кластера. Установка политики для большего объема таблиц приведет к использованию большего объема ресурсов кластера и повышению затрат из-за базовых транзакций хранилища. Дополнительные сведения см. в разделе о емкости.
- Не рекомендуется задавать политику секционирования, если размер сжатых данных на секцию должен быть меньше 1 ГБ.
- Процесс секционирования приводит к тому, что артефакты остаточного хранилища для всех экстентов, замененных в процессе секционирования и во время слияния. Ожидается, что большинство артефактов остаточного хранилища будут удалены в процессе автоматической очистки. Увеличение значения
MaxPartitionCount
свойства увеличивает количество артефактов остаточного хранилища и может снизить производительность очистки. - Перед применением политики секционирования к материализованному представлению ознакомьтесь с рекомендациями по политике секционирования материализованных представлений.
Ключи секции
Поддерживаются следующие типы ключей секций.
Kind | Тип столбца | Свойства раздела | Значение секции |
---|---|---|---|
Хэш | string или guid |
Function , MaxPartitionCount , Seed , PartitionAssignmentMode |
Function (ColumnName , MaxPartitionCount , Seed ) |
Универсальный диапазон | datetime |
RangeSize , Reference , OverrideCreationTime |
bin_at (ColumnName , RangeSize , Reference ) |
Хэш-ключ секции
Если политика включает ключ хэш-секции, все однородные экстенты, принадлежащие одной секции, будут назначены одному узлу данных в кластере.
Примечание
Операция секционирования данных увеличивает значительную нагрузку на обработку. Мы рекомендуем применять ключ хэш-секции к таблице только при следующих условиях:
- Если в большинстве запросов используются фильтры равенства (
==
,in()
). - Большинство запросов агрегируют или объединяют для определенного столбца типа
string
илиguid
большого размера (кратность 10 М или выше), напримерdevice_ID
, илиuser_ID
. - Шаблон использования секционированных таблиц находится в высокой нагрузке на запросы с параллелизмом, например в приложениях мониторинга или панелей мониторинга.
- Функция hash-modulo используется для секционирования данных.
- Данные в однородных (секционированных) экстентах упорядочены по ключу хэш-секции.
- Не нужно включать ключ хэш-секции в политику порядка строк, если он определен в таблице.
- Ожидается, что запросы, использующие стратегию перетасовки и в которых
shuffle key
используется вjoin
,summarize
илиmake-series
является ключом хэш-секции таблицы, будут работать лучше, так как объем данных, необходимых для перемещения между узлами кластера, сокращается.
Свойства раздела
Свойство | Описание | Поддерживаемые значения | Рекомендуемое значение |
---|---|---|---|
Function |
Имя используемой функции с хэш-модулем. | XxHash64 |
|
MaxPartitionCount |
Максимальное число создаваемых секций (аргумент modulo функции hash-modulo) за период времени. | В диапазоне (1,2048] . |
Более высокие значения приводят к большей нагрузке на процесс секционирования данных на узлах кластера и большему числу экстентов за каждый период времени. Мы рекомендуем использовать значение 128 . Более высокие значения значительно увеличат затраты на секционирование данных после приема и размер метаданных, поэтому не рекомендуется. |
Seed |
Используется для случайного определения хэш-значения. | Положительное целое число. | 1 , которое также является значением по умолчанию. |
PartitionAssignmentMode |
Режим, используемый для назначения секций узлам в кластере. | ByPartition : все однородные (секционированные) экстенты, принадлежащие одной секции, назначаются одному узлу. Uniform : значения секции экстентов игнорируются. Экстенты равномерно назначаются узлам кластера. |
Если запросы не объединяются или не объединяются по ключу хэш-секции, используйте Uniform . В противном случае используйте коллекцию ByPartition . |
Пример ключа хэш-секции
Ключ хэш-секции над типизированным столбцом string
с именем tenant_id
.
В нем используется XxHash64
хэш-функция с рекомендуемыми значениями 128
MaxPartitionCount
и значением по умолчанию Seed
1
.
{
"ColumnName": "tenant_id",
"Kind": "Hash",
"Properties": {
"Function": "XxHash64",
"MaxPartitionCount": 128,
"Seed": 1,
"PartitionAssignmentMode": "Uniform"
}
}
Ключ секции даты и времени в универсальном диапазоне
Примечание
Примените ключ datetime
секции datetime к типизированному столбцу таблицы только в том случае, если данные, полученные в таблицу, вряд ли будут упорядочены в соответствии с этим столбцом.
В таких случаях можно перетасовать данные между экстентами, чтобы каждый экстент включает записи из ограниченного диапазона времени. Этот процесс приводит к тому, что фильтры по столбцу datetime
будут более эффективными во время запроса.
Используемая функция секционирования является bin_at() и не настраивается.
Свойства раздела
Свойство | Описание | Рекомендуемое значение |
---|---|---|
RangeSize |
Скалярная timespan константа, указывающая размер каждой секции datetime. |
Начните со значения 1.00:00:00 (один день). Не устанавливайте более короткое значение, так как это может привести к тому, что таблица будет иметь большое количество небольших экстентов, которые невозможно объединить. |
Reference |
Скалярная datetime константа, указывающая фиксированную точку во времени, в соответствии с которой выравниваются секции даты и времени. |
Начните с метода 1970-01-01 00:00:00 . Если есть записи, в которых ключ секции datetime имеет null значения, их значение секции устанавливается в значение Reference . |
OverrideCreationTime |
Значение типа , bool указывающее, следует ли переопределять минимальное и максимальное время создания результирующих экстентов диапазоном значений в ключе секции. |
По умолчанию — false . Задайте значение , true если данные не подается в порядке времени прибытия. Например, один исходный файл может содержать удаленные значения даты и времени, и (или) может потребоваться принудительное хранение или кэширование на основе значений datetime, а не времени приема.Если OverrideCreationTime для задано значение true , экстенты могут быть пропущены в процессе слияния. Экстенты пропускаются, если время их создания превышает Lookback период действия политики слияния экстентов таблицы. Чтобы убедиться, что экстенты доступны для обнаружения, присвойте свойству Lookback значение HotCache . |
Пример секции даты и времени в универсальном диапазоне
В фрагменте кода показан универсальный ключ секции диапазона даты и времени для типизированного datetime
столбца с именем timestamp
.
Он использует datetime(2021-01-01)
в качестве точки отсчета с размером для каждой секции 7d
и не переопределяет время создания экстентов.
{
"ColumnName": "timestamp",
"Kind": "UniformRange",
"Properties": {
"Reference": "2021-01-01T00:00:00",
"RangeSize": "7.00:00:00",
"OverrideCreationTime": false
}
}
Объект политики
По умолчанию политика секционирования данных таблицы имеет значение null
, и в этом случае данные в таблице не будут повторно секционированы после приема.
Политика секционирования данных имеет следующие свойства main:
PartitionKeys:
- Коллекция ключей секций , определяющих способ секционирования данных в таблице.
- Таблица может содержать до
2
ключей секций с одним из следующих вариантов: - Каждый ключ секции имеет следующие свойства:
ColumnName
:string
— имя столбца, в соответствии с которым данные будут секционированы.Kind
:string
— тип секционирования данных для применения (Hash
илиUniformRange
).Properties
:property bag
— определяет параметры, в соответствии с которыми выполняется секционирование.
EffectiveDateTime:
- Дата и время в формате UTC, с которого действует политика.
- Это необязательное свойство. Если она не указана, политика вступит в силу для данных, которые будут приниматься после применения политики.
Внимание!
- Значение даты и времени можно задать в прошлых и секционированных уже поставляемых данных. Однако такой подход может значительно увеличить объем ресурсов, используемых в процессе секционирования.
- В большинстве случаев рекомендуется секционировать только новые данные, чтобы избежать секционирования больших объемов исторических данных.
- Если вы решили секционировать исторические данные, рекомендуется делать это постепенно, задав для параметра EffectiveDateTime значение предыдущего
datetime
в течение нескольких дней при каждом изменении политики.
Пример секционирования данных
Объект политики секционирования данных с двумя ключами секционирования.
- Ключ хэш-секции над типизированным столбцом
string
с именемtenant_id
.- В нем используется
XxHash64
хэш-функция с рекомендуемыми значениями128
MaxPartitionCount
и значением по умолчаниюSeed
1
.
- В нем используется
- Универсальный ключ секции диапазона даты и времени для столбца
datetime
типа с именемtimestamp
.- В качестве точки отсчета используется
datetime(2021-01-01)
размер для каждой секции7d
.
- В качестве точки отсчета используется
{
"PartitionKeys": [
{
"ColumnName": "tenant_id",
"Kind": "Hash",
"Properties": {
"Function": "XxHash64",
"MaxPartitionCount": 128,
"Seed": 1,
"PartitionAssignmentMode": "Uniform"
}
},
{
"ColumnName": "timestamp",
"Kind": "UniformRange",
"Properties": {
"Reference": "2021-01-01T00:00:00",
"RangeSize": "7.00:00:00",
"OverrideCreationTime": false
}
}
]
}
Дополнительные свойства
Следующие свойства можно определить как часть политики. Эти свойства являются необязательными, и мы не рекомендуем их изменять.
Свойство | Описание | Рекомендуемое значение | Значение по умолчанию |
---|---|---|---|
MinRowCountPerOperation | Минимальное целевое значение для суммы количества строк исходных экстентов одной операции секционирования данных. | 0 |
|
MaxRowCountPerOperation | Максимальный целевой объект для суммы количества строк исходных экстентов одной операции секционирования данных. | Задайте значение ниже 5M, если вы видите, что операции секционирования потребляют большой объем памяти или ЦП на каждую операцию. | 0 с целевым значением по умолчанию 5 000 000 записей. |
MaxOriginalSizePerOperation | Максимальное целевое значение для суммы исходного размера (в байтах) исходных экстентов одной операции секционирования данных. | Если операции секционирования потребляют большой объем памяти или ЦП для каждой операции, задайте значение ниже 5 ГБ. | 0 с целевым значением по умолчанию 5 368 709 120 байт (5 ГБ). |
Процесс секционирования данных
- Секционирование данных выполняется в кластере в фоновом режиме после приема.
- Ожидается, что таблица, которая постоянно попадает в, всегда будет содержать "хвост" данных, которые еще не секционированы (неоднородные экстенты).
- Секционирование данных выполняется только в горячих экстентах, независимо от значения
EffectiveDateTime
свойства в политике.- Если требуется секционирование холодных экстентов, необходимо временно настроить политику кэширования.
Вы можете отслеживать состояние секционирования таблиц с определенными политиками в базе данных с помощью команды .show database extents partitioning statistics .
Емкость секционирования
- Процесс секционирования данных приводит к созданию дополнительных экстентов. Кластер может постепенно увеличивать емкость слияния экстентов, чтобы процесс объединения экстентов мог не отставать.
- Если имеется высокая пропускная способность приема или достаточно большое количество таблиц, для которых определена политика секционирования, кластер может постепенно увеличивать емкость секции Экстентов, чтобы не отставать от процесса секционирования экстентов .
- Чтобы избежать потребления слишком большого количества ресурсов, это динамическое увеличение ограничивается. Вам может потребоваться постепенно и линейно увеличивать их за пределы крышки, если они используются полностью.
- Если увеличение емкости приводит к значительному увеличению использования ресурсов кластера, можно увеличить масштаб кластера/ вручную или путем включения автомасштабирования.
Ограничения
- Попытки секционирования данных в базе данных, которая уже имеет более 5 000 000 экстентов, будут регулироваться.
- В таких случаях
EffectiveDateTime
свойство политик секционирования таблиц в базе данных будет автоматически отложено на несколько часов, что позволяет повторно оценить конфигурацию и политики.
- В таких случаях
Выбросы в секционированных столбцах
- Следующие ситуации могут привести к несбалансированному распределению данных по узлам кластера и снижению производительности запросов.
- Если ключ хэш-секции содержит значения, которые гораздо более распространены, чем другие, например пустая строка или универсальное значение (например
null
, илиN/A
). - Значения представляют сущность (например
tenant_id
, ), которая является более распространенной в наборе данных.
- Если ключ хэш-секции содержит значения, которые гораздо более распространены, чем другие, например пустая строка или универсальное значение (например
- Если ключ секции даты и времени в равномерном диапазоне имеет достаточно большой процент значений, которые находятся "далеко" от большинства значений в столбце, затраты на процесс секционирования данных увеличиваются и могут привести к множеству небольших областей, которые кластеру потребуется отслеживать. Примером такой ситуации являются значения datetime из далекого прошлого или будущего.
В обоих случаях либо исправьте данные, либо отфильтруйте все ненужные записи в данных до или во время приема, чтобы сократить затраты на секционирование данных в кластере. Например, используйте политику обновления.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по