Политика секционирования
Область применения: ✅Microsoft Fabric✅Azure Data Explorer
Политика секционирования определяет, следует ли секционировать экстенты (сегменты данных) для определенной таблицы или материализованного представления.
Политика активирует дополнительный фоновый процесс, который происходит после создания экстентов после приема данных. Этот процесс включает повторное получение данных из исходных экстентов и создание однородных экстентов, в которых все значения столбца, указанного в качестве ключа секции, находятся в одной секции.
Основная цель политики секционирования — повысить производительность запросов в определенных поддерживаемых сценариях.
Примечание.
По умолчанию, если политика секционирования данных не определена (является null
), экстенты секционируются по времени создания (прием). В большинстве случаев не нужно задавать политику секционирования данных.
Поддерживаемые сценарии
Ниже приведены единственные сценарии, в которых рекомендуется задать политику секционирования данных. Во всех остальных сценариях установка политики не рекомендуется.
- Частые фильтры на средней или высокой кратности
string
илиguid
столбце:- Например: мультитенантные решения или таблица метрик, в которой большинство или все запросы фильтруют по столбцу типа
string
или , напримерTenantId
, илиMetricId
guid
. - Средняя кратность составляет не менее 10 000 различных значений.
- Задайте для ключа
string
хэш-секции значение илиguid
столбец и задайтеPartitionAssignmentMode
для свойства значениеuniform
.
- Например: мультитенантные решения или таблица метрик, в которой большинство или все запросы фильтруют по столбцу типа
- Частые агрегаты или соединения на высоком кратности
string
илиguid
столбце:- Например, данные Интернета вещей из множества различных датчиков или академических записей многих разных учащихся.
- Высокая кратность составляет не менее 1000 000 различных значений, где распределение значений в столбце приблизительно равно.
- В этом случае задайте для ключа хэш-секции столбец, который часто группируется по или присоединению
PartitionAssignmentMode
, и задайте для свойства значениеByPartition
.
- Прием данных вне порядка:
- Данные, используемые в таблицу, не могут быть упорядочены и секционированы в экстенты (сегменты) в соответствии с определенным
datetime
столбцом, который представляет время создания данных и обычно используется для фильтрации данных. Это может быть связано с обратным заполнением из разнородных исходных файлов, которые включают значения даты и времени в течение большого периода времени. - В этом случае задайте для столбца ключ секции с универсальным диапазоном
datetime
даты и времени. - Если необходимо, чтобы политики хранения и кэширования соответствовали значениям даты и времени в столбце, вместо выравнивания по времени приема задайте
OverrideCreationTime
для свойства значениеtrue
.
- Данные, используемые в таблицу, не могут быть упорядочены и секционированы в экстенты (сегменты) в соответствии с определенным
Внимание
- Ограничения на количество таблиц с определенными политикой секционирования отсутствуют. Но каждая дополнительная таблица добавляет затраты на процесс секционирования фоновых данных. Установка политики для дополнительных таблиц приведет к использованию большего количества ресурсов и более высокой стоимости из-за базовых транзакций хранилища. Дополнительные сведения см. в разделе о емкости.
- Не рекомендуется устанавливать политику секционирования, если сжатый размер данных на секцию должен быть меньше 1 ГБ.
- Процесс секционирования приводит к артефактам остаточного хранилища для всех экстентов, замененных во время процесса секционирования и во время процесса слияния. Большинство артефактов остаточного хранилища, как ожидается, будут удалены во время автоматической очистки. Увеличение значения
MaxPartitionCount
свойства увеличивает количество артефактов остаточного хранилища и может снизить производительность очистки. - Перед применением политики секционирования в материализованном представлении просмотрите рекомендации по политике секционирования материализованных представлений.
Ключи секции
Поддерживаются следующие типы ключей секций.
Вид | Тип столбца | Свойства секционирования | Значение секции |
---|---|---|---|
Hash | string или guid |
Function , , MaxPartitionCount Seed PartitionAssignmentMode |
Function (ColumnName , , Seed MaxPartitionCount ) |
Универсальный диапазон | datetime |
RangeSize , , Reference OverrideCreationTime |
bin_at (ColumnName , , Reference RangeSize ) |
Хэш-ключ секции
Если политика включает хэш-ключ секции, все однородные экстенты, принадлежащие одной секции, будут назначены одному узлу данных.
Примечание.
Операция секционирования данных добавляет значительную нагрузку обработки. Рекомендуется применять хэш-ключ секции к таблице только в следующих условиях:
- Если большинство запросов используют фильтры равенства (
==
,).in()
- Большинство запросов агрегируют или объединяются в определенном столбце типа или который имеет большое измерение (кратность 10 млн или выше), например или
user_ID
device_ID
.guid
string
- Шаблон использования секционированных таблиц находится в высокой нагрузке запросов параллелизма, например в приложениях мониторинга или мониторинга.
- Функция хэш-модулирования используется для секционирования данных.
- Данные в однородных (секционированных) экстентах упорядочивается ключом хэш-секции.
- Не нужно включать хэш-ключ секции в политику порядка строк, если он определен в таблице.
- Ожидается, что запросы, использующие стратегию перетасовки, и в которой
shuffle key
используетсяjoin
summarize
хэш-ключ секции таблицы илиmake-series
хэш-ключ таблицы, будут выполняться лучше, так как объем данных, необходимых для перемещения по узлам, уменьшается.
Свойства секционирования
Свойство | Description | Поддерживаемые значения | Рекомендуемое значение |
---|---|---|---|
Function |
Имя используемой функции hash-modulo. | XxHash64 |
|
MaxPartitionCount |
Максимальное число создаваемых секций (аргумент modulo функции хэш-модуло) в течение определенного периода времени. | В диапазоне (1,2048] . |
Более высокие значения приводят к большей нагрузке на процесс секционирования данных, а также к большему количеству экстентов за каждый период времени. Мы рекомендуем использовать значение 128 . Более высокие значения значительно увеличивают затраты на секционирование данных после приема данных, а также размер метаданных и поэтому не рекомендуется. |
Seed |
Используется для случайного определения хэш-значения. | Положительное целое число. | 1 , который также является значением по умолчанию. |
PartitionAssignmentMode |
Режим, используемый для назначения секций узлам. | ByPartition : все однородные (секционированные) экстенты, принадлежащие одной секции, назначаются одному узлу. Uniform : значения секционирования экстентов игнорируются. Экстенты присваиваются узлам равномерно. |
Если запросы не присоединяются или агрегируются в ключе хэш-секции, используйте Uniform . Или используйте ByPartition . |
Пример ключа хэш-раздела
Хэш-ключ секции по имени столбца string
с типизированным именем tenant_id
.
Он использует хэш-функцию, присвоив MaxPartitionCount
рекомендуемое значение 128
и значение по умолчанию Seed
1
.XxHash64
{
"ColumnName": "tenant_id",
"Kind": "Hash",
"Properties": {
"Function": "XxHash64",
"MaxPartitionCount": 128,
"Seed": 1,
"PartitionAssignmentMode": "Uniform"
}
}
Ключ секции даты и времени единого диапазона
Примечание.
Применяется только ключ секции даты и времени единого диапазона к datetime
типизированному столбцу таблицы, если данные, полученные в таблицу, вряд ли будут упорядочены в соответствии с этим столбцом.
В этих случаях можно перенашифровать данные между экстентами, чтобы каждый экстент включает записи из ограниченного диапазона времени. Этот процесс приводит к тому, что фильтры столбца datetime
более эффективны во время запроса.
Функция секционирования используется bin_at() и не настраивается.
Свойства секционирования
Свойство | Description | Рекомендуемое значение |
---|---|---|
RangeSize |
Скалярная timespan константа, указывающая размер каждой секции datetime. |
Начните со значения 1.00:00:00 (один день). Не устанавливайте более короткое значение, так как это может привести к возникновению большого количества небольших экстентов, которые не могут быть объединены. |
Reference |
Скалярная datetime константа, указывающая фиксированную точку во времени, в соответствии с которой выравниваются секции datetime. |
Начните с метода 1970-01-01 00:00:00 . Если есть записи, в которых ключ секции datetime имеет null значения, их значение секции задается значением Reference . |
OverrideCreationTime |
Значение bool , указывающее, следует ли переопределить минимальное и максимальное время создания экстента в диапазоне значений в ключе секции. |
По умолчанию — false . Задайте значение true , если данные не будут приема в порядке времени прибытия. Например, один исходный файл может включать значения даты и времени, которые являются удаленными, и (или) может потребоваться применить хранение или кэширование на основе значений datetime, а не времени приема.Если OverrideCreationTime задано значение true , экстенты могут быть пропущены в процессе слияния. Экстенты отсутствуют, если время их создания старше, чем Lookback период политики слияния экстентов таблицы. Чтобы убедиться, что экстенты доступны для обнаружения, задайте Lookback для свойства значение HotCache . |
Пример секции datetime с универсальным диапазоном
В фрагменте кода показан ключ секции диапазона даты и времени по типизированному столбцу 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
это политика, в которой данные в таблице не будут повторно разделены после приема.
Политика секционирования данных имеет следующие основные свойства:
PartitionKeys:
- Коллекция ключей секций, определяющих, как секционировать данные в таблице.
- Таблица может иметь до
2
секционирования ключей с одним из следующих вариантов: - Каждый ключ секции имеет следующие свойства:
ColumnName
:string
— имя столбца, по которому будут секционированы данные.Kind
:string
— тип секционирования данных для применения (Hash
илиUniformRange
).Properties
:property bag
— определяет параметры, в соответствии с которым выполняется секционирование.
EffectiveDateTime:
- Дата и время в формате UTC, с которого действует политика.
- Это необязательное свойство. Если он не указан, политика вступит в силу для приема данных после применения политики.
Внимание
- Вы можете задать значение datetime в прошлом и секционирование уже приема данных. Однако эта практика может значительно увеличить ресурсы, используемые в процессе секционирования.
- В большинстве случаев рекомендуется использовать только новые секционированные данные и избегать секционирования больших объемов исторических данных.
- Если вы решили секционировать исторические данные, рассмотрите возможность постепенного выполнения этого действия, задав значение EffectiveDateTime на предыдущие
datetime
шаги до нескольких дней при каждом изменении политики.
Пример секционирования данных
Объект политики секционирования данных с двумя ключами секционирования.
- Хэш-ключ секции по имени столбца
string
с типизированным именемtenant_id
.- Он использует хэш-функцию, присвоив
MaxPartitionCount
рекомендуемое значение128
и значение по умолчаниюSeed
1
.XxHash64
- Он использует хэш-функцию, присвоив
- Универсальный ключ секции диапазона дат и времени по столбцу
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
}
}
]
}
Дополнительные свойства
Следующие свойства можно определить как часть политики. Эти свойства являются необязательными, поэтому мы рекомендуем не изменять их.
Свойство | Description | Рекомендуемое значение | Default value |
---|---|---|---|
MinRowCountPerOperation | Минимальный целевой объект для суммы количества строк исходных экстентов одной операции секционирования данных. | 0 |
|
MaxRowCountPerOperation | Максимальный целевой объект для суммы количества строк исходных экстентов одной операции секционирования данных. | Задайте значение ниже 5M, если вы видите, что операции секционирования используют большой объем памяти или ЦП для каждой операции. | 0 , с целевым значением по умолчанию 500 000 записей. |
MaxOriginalSizePerOperation | Максимальный целевой объект для суммы исходного размера (в байтах) исходных экстентов одной операции секционирования данных. | Если операции секционирования используют большой объем памяти или ЦП на операцию, задайте значение меньше 5 ГБ. | 0 , с целевым объектом по умолчанию 5 368 709 120 байт (5 ГБ). |
Процесс секционирования данных
- Секционирование данных выполняется как фоновый процесс после приема данных.
- Ожидается, что таблица, в которую постоянно выполняется прием, всегда имеет "хвост" данных, которые пока не будут секционированы (нехомогенные экстенты).
- Секционирование данных выполняется только в горячих экстентах независимо от значения
EffectiveDateTime
свойства в политике.- Если требуется секционирование холодных экстентов, необходимо временно настроить политику кэширования.
Вы можете отслеживать состояние секционирования таблиц с определенными политиками в базе данных с помощью команды секционирования статистики и секционирования метрик.
Емкость секционирования
Процесс секционирования данных приводит к созданию дополнительных экстентов. Масштабы объединения могут постепенно увеличиваться, чтобы процесс объединения экстентов мог продолжаться.
Если есть высокая пропускная способность приема или достаточно большое количество таблиц с определенной политикой секционирования, то емкость секционирования экстентов может постепенно увеличиваться, чтобы процесс секционирования экстентов мог продолжаться.
::: moniker range = "azure-data-explorer"
- Чтобы избежать использования слишком большого количества ресурсов, эти динамические увеличение ограничивается. Вам может потребоваться постепенно и линейно увеличить их за пределами крышки, если они используются полностью.
Ограничения
- Попытки секционировать данные в базе данных, которая уже имеет более 5 000 000 экстентов, будет регулироваться.
- В таких случаях
EffectiveDateTime
свойство секционирования политик таблиц в базе данных будет автоматически отложено на несколько часов, чтобы можно было повторно оценить конфигурацию и политики.
- В таких случаях
Выбросы в секционированных столбцах
- Следующие ситуации могут способствовать несбалансированному распределению данных между узлами и снижению производительности запросов:
- Если хэш-ключ секции содержит значения, которые гораздо чаще, чем другие, например пустую строку или универсальное значение (например
null
, илиN/A
). - Значения представляют сущность (например
tenant_id
, более распространенную в наборе данных).
- Если хэш-ключ секции содержит значения, которые гораздо чаще, чем другие, например пустую строку или универсальное значение (например
- Если ключ секции даты и времени в едином диапазоне имеет достаточно большой процент значений, которые являются "далеко" от большинства значений в столбце, издержки процесса секционирования данных увеличиваются и могут привести к большому большому объему для отслеживания. Примером такой ситуации являются значения даты и времени от далекого прошлого или будущего.
В обоих случаях либо исправьте данные, либо отфильтруйте ненужные записи в данных до приема или во время приема, чтобы сократить затраты на секционирование данных. Например, используйте политику обновления.