Политика секционирования

Область применения: ✅Microsoft Fabric✅Azure Data Explorer

Политика секционирования определяет, следует ли секционировать экстенты (сегменты данных) для определенной таблицы или материализованного представления.

Политика активирует дополнительный фоновый процесс, который происходит после создания экстентов после приема данных. Этот процесс включает повторное получение данных из исходных экстентов и создание однородных экстентов, в которых все значения столбца, указанного в качестве ключа секции, находятся в одной секции.

Основная цель политики секционирования — повысить производительность запросов в определенных поддерживаемых сценариях.

Примечание.

По умолчанию, если политика секционирования данных не определена (является null), экстенты секционируются по времени создания (прием). В большинстве случаев не нужно задавать политику секционирования данных.

Поддерживаемые сценарии

Ниже приведены единственные сценарии, в которых рекомендуется задать политику секционирования данных. Во всех остальных сценариях установка политики не рекомендуется.

  • Частые фильтры на средней или высокой кратности string или guid столбце:
    • Например: мультитенантные решения или таблица метрик, в которой большинство или все запросы фильтруют по столбцу типа string или , напримерTenantId, или MetricIdguid.
    • Средняя кратность составляет не менее 10 000 различных значений.
    • Задайте для ключа string хэш-секции значение или guid столбец и задайте PartitionAssignmentMode для свойства значение uniform.
  • Частые агрегаты или соединения на высоком кратности string или guid столбце:
    • Например, данные Интернета вещей из множества различных датчиков или академических записей многих разных учащихся.
    • Высокая кратность составляет не менее 1000 000 различных значений, где распределение значений в столбце приблизительно равно.
    • В этом случае задайте для ключа хэш-секции столбец, который часто группируется по или присоединениюPartitionAssignmentMode, и задайте для свойства значение ByPartition.
  • Прием данных вне порядка:
    • Данные, используемые в таблицу, не могут быть упорядочены и секционированы в экстенты (сегменты) в соответствии с определенным datetime столбцом, который представляет время создания данных и обычно используется для фильтрации данных. Это может быть связано с обратным заполнением из разнородных исходных файлов, которые включают значения даты и времени в течение большого периода времени.
    • В этом случае задайте для столбца ключ секции с универсальным диапазоном datetime даты и времени.
    • Если необходимо, чтобы политики хранения и кэширования соответствовали значениям даты и времени в столбце, вместо выравнивания по времени приема задайте OverrideCreationTime для свойства значение true.

Внимание

  • Ограничения на количество таблиц с определенными политикой секционирования отсутствуют. Но каждая дополнительная таблица добавляет затраты на процесс секционирования фоновых данных. Установка политики для дополнительных таблиц приведет к использованию большего количества ресурсов и более высокой стоимости из-за базовых транзакций хранилища. Дополнительные сведения см. в разделе о емкости.
  • Не рекомендуется устанавливать политику секционирования, если сжатый размер данных на секцию должен быть меньше 1 ГБ.
  • Процесс секционирования приводит к артефактам остаточного хранилища для всех экстентов, замененных во время процесса секционирования и во время процесса слияния. Большинство артефактов остаточного хранилища, как ожидается, будут удалены во время автоматической очистки. Увеличение значения MaxPartitionCount свойства увеличивает количество артефактов остаточного хранилища и может снизить производительность очистки.
  • Перед применением политики секционирования в материализованном представлении просмотрите рекомендации по политике секционирования материализованных представлений.

Ключи секции

Поддерживаются следующие типы ключей секций.

Вид Тип столбца Свойства секционирования Значение секции
Hash string или guid Function, , MaxPartitionCountSeedPartitionAssignmentMode Function(ColumnName, , SeedMaxPartitionCount)
Универсальный диапазон datetime RangeSize, , ReferenceOverrideCreationTime bin_at(ColumnName, , ReferenceRangeSize)

Хэш-ключ секции

Если политика включает хэш-ключ секции, все однородные экстенты, принадлежащие одной секции, будут назначены одному узлу данных.

Примечание.

Операция секционирования данных добавляет значительную нагрузку обработки. Рекомендуется применять хэш-ключ секции к таблице только в следующих условиях:

  • Если большинство запросов используют фильтры равенства (==,). in()
  • Большинство запросов агрегируют или объединяются в определенном столбце типа или который имеет большое измерение (кратность 10 млн или выше), например или user_IDdevice_ID.guid string
  • Шаблон использования секционированных таблиц находится в высокой нагрузке запросов параллелизма, например в приложениях мониторинга или мониторинга.
  • Функция хэш-модулирования используется для секционирования данных.
  • Данные в однородных (секционированных) экстентах упорядочивается ключом хэш-секции.
    • Не нужно включать хэш-ключ секции в политику порядка строк, если он определен в таблице.
  • Ожидается, что запросы, использующие стратегию перетасовки, и в которой shuffle key используется joinsummarize хэш-ключ секции таблицы или 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 секционирования ключей с одним из следующих вариантов:
      • Один хэш-ключ секции.
      • Один ключ секции datetime с универсальным диапазоном.
      • Один хэш-ключ секции и один ключ секции даты и времени единого диапазона.
    • Каждый ключ секции имеет следующие свойства:
      • ColumnName: string — имя столбца, по которому будут секционированы данные.
      • Kind: string — тип секционирования данных для применения (Hash или UniformRange).
      • Properties: property bag — определяет параметры, в соответствии с которым выполняется секционирование.
  • EffectiveDateTime:

    • Дата и время в формате UTC, с которого действует политика.
    • Это необязательное свойство. Если он не указан, политика вступит в силу для приема данных после применения политики.

Внимание

  • Вы можете задать значение datetime в прошлом и секционирование уже приема данных. Однако эта практика может значительно увеличить ресурсы, используемые в процессе секционирования.
  • В большинстве случаев рекомендуется использовать только новые секционированные данные и избегать секционирования больших объемов исторических данных.
  • Если вы решили секционировать исторические данные, рассмотрите возможность постепенного выполнения этого действия, задав значение EffectiveDateTime на предыдущие datetime шаги до нескольких дней при каждом изменении политики.

Пример секционирования данных

Объект политики секционирования данных с двумя ключами секционирования.

  1. Хэш-ключ секции по имени столбца stringс типизированным именем tenant_id.
    • Он использует хэш-функцию, присвоив MaxPartitionCount рекомендуемое значение 128и значение по умолчанию Seed 1.XxHash64
  2. Универсальный ключ секции диапазона дат и времени по столбцу 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"

  • Чтобы избежать использования слишком большого количества ресурсов, эти динамические увеличение ограничивается. Вам может потребоваться постепенно и линейно увеличить их за пределами крышки, если они используются полностью.
    • Если увеличение емкости приводит к значительному увеличению использования ресурсов кластера, можно увеличить масштаб кластера /вручную или включить автомасштабирование. ::: moniker-end

Ограничения

  • Попытки секционировать данные в базе данных, которая уже имеет более 5 000 000 экстентов, будет регулироваться.
    • В таких случаях EffectiveDateTime свойство секционирования политик таблиц в базе данных будет автоматически отложено на несколько часов, чтобы можно было повторно оценить конфигурацию и политики.

Выбросы в секционированных столбцах

  • Следующие ситуации могут способствовать несбалансированному распределению данных между узлами и снижению производительности запросов:
    • Если хэш-ключ секции содержит значения, которые гораздо чаще, чем другие, например пустую строку или универсальное значение (например null , или N/A).
    • Значения представляют сущность (например tenant_id, более распространенную в наборе данных).
  • Если ключ секции даты и времени в едином диапазоне имеет достаточно большой процент значений, которые являются "далеко" от большинства значений в столбце, издержки процесса секционирования данных увеличиваются и могут привести к большому большому объему для отслеживания. Примером такой ситуации являются значения даты и времени от далекого прошлого или будущего.

В обоих случаях либо исправьте данные, либо отфильтруйте ненужные записи в данных до приема или во время приема, чтобы сократить затраты на секционирование данных. Например, используйте политику обновления.