Понимание выполнения задач обновления материализованных представлений

Сведения о запусках задач обновления MV помогают понять поведение обновления, диагностировать проблемы и мониторить производительность.

Обзор

При обновлении MV система создает запуск задачи (task run) с подробной информацией об операции обновления. Эти сведения сохраняются в объекте MVTaskRunExtraMessage и доступны через поле EXTRA_MESSAGE системного представления information_schema.task_runs.

Дополнительные сведения task run

В этом разделе описаны поля, доступные в MVTaskRunExtraMessage.

forceRefresh

  • Тип: Boolean

  • Описание: Признак принудительного обновления, обходящего обычные условия. Значение true возвращается при ручном полном принудительном обновлении через REFRESH MATERIALIZED VIEW ... FORCE.

partitionStart

  • Тип: String

  • Описание: Нижняя граница диапазона партиций для данного запуска обновления.

  • Формат: Значение ключа партиционирования (например, "2024-01-01" для партиций по датам)

  • Пример: При обновлении данных начиная с января 2024 значение будет "2024-01-01".

partitionEnd

  • Тип: String

  • Описание: Верхняя граница диапазона партиций для данного запуска обновления.

  • Формат: Значение ключа партиционирования (например, "2024-01-31" для партиций по датам)

  • Пример: При обновлении данных по январь 2024 значение будет "2024-01-31".

mvPartitionsToRefresh

  • Тип: Set of Strings

  • Описание: Список партиций MV, запланированных к обновлению в данном запуске. Помогает отследить, какие партиции MV будут изменены.

  • Ограничение размера: система автоматически усечет число элементов до max_mv_task_run_meta_message_values_length (по умолчанию 100), чтобы избежать избыточного хранения метаданных.

  • Пример: ["p20240101", "p20240102", "p20240103"]

  • Примечание: Речь идет о партициях самого MV, а не базовых таблиц.

refBasePartitionsToRefreshMap

  • Тип: Map of String to Set of Strings

  • Описание: Отображение базовых «reference»‑таблиц в набор их партиций, которые должны быть обновлены.

  • Использование: Значение формируется на этапе планирования задачи обновления MV и помогает понять, какие партиции базовых таблиц нужно сканировать.

  • Формат: {tableName -> Set<partitionName>}

  • Ограничение размера: автоматическое усечение до max_mv_task_run_meta_message_values_length.

  • Пример:

{
  "orders": ["p20240101", "p20240102"],
  "customers": ["p202401"]
}
  • Примечание: Это планируемый набор партиций до оптимизации.

basePartitionsToRefreshMap

  • Тип: Map of String to Set of Strings

  • Описание: Отображение базовых «reference»‑таблиц в набор их партиций, фактически обновленных при выполнении.

  • Использование: Значение устанавливается после фиксации карты версий MV; отражает реальные партиции, использованные оптимизатором.

  • Формат: {tableName -> Set<partitionName>}

  • Ограничение размера: автоматическое усечение до max_mv_task_run_meta_message_values_length.

  • Пример:

{
  "orders": ["p20240101", "p20240102"],
  "line_items": ["p20240101_batch1", "p20240101_batch2"]
}
  • Примечание: Это фактический набор после оптимизации и выполнения.

Различия между refBasePartitionsToRefreshMap и basePartitionsToRefreshMap:

  • refBasePartitionsToRefreshMap: запланированные партиции до оптимизации (обычно для основной reference‑таблицы)

  • basePartitionsToRefreshMap: фактические партиции после оптимизации (включая все таблицы и оптимизированные наборы)

nextPartitionStart

  • Тип: String

  • Описание: Нижняя граница диапазона партиций для следующего инкрементального обновления. Используется, когда одно обновление делится на несколько запусков из‑за лимитов ресурсов или объема данных.

  • Пример: Если текущий запуск обновил данные по "2024-01-15", значение может быть "2024-01-16".

nextPartitionEnd

  • Тип: String

  • Описание: Верхняя граница диапазона партиций для следующего инкрементального обновления.

  • Пример: "2024-01-31" для следующей порции партиций.

nextPartitionValues

  • Тип: String

  • Описание: Сериализованные значения партиций для следующего обновления (используется для list‑партиционирования или сложных схем).

  • Пример: "('US', 'ACTIVE'), ('UK', 'ACTIVE')" для многостолбцовых list‑партиций.

processStartTime

  • Тип: Integer (timestamp в миллисекундах)

  • Описание: Момент фактического старта обработки (без учета времени ожидания в очереди). Время обработки можно вычислить как Finish Time - Process Start Time.

  • Пример: 1704067200000 (2024‑01‑01 00:00:00 UTC)

executeOption

  • Тип: ExecuteOption

  • Описание: Параметры выполнения задачи.

  • Значение по умолчанию: Priority = LOWEST, isMergeRedundant = false

  • Поля:

    • priority: приоритет выполнения (HIGHEST=0, HIGH=32, NORMAL=64, LOW=96, LOWEST=127)

    • isMergeRedundant: объединять ли избыточные операции обновления

    • properties: дополнительные свойства Map<String, String>

planBuilderMessage

  • Тип: Map of String to String

  • Описание: Диагностические сообщения и метаданные планировщика запросов: сведения о планировании, решениях оптимизатора и потенциальных проблемах.

  • Ограничение размера: автоматическое усечение до max_mv_task_run_meta_message_values_length.

refreshMode

  • Тип: String

  • Описание: Режим обновления в данном запуске.

  • Допустимые значения:

    • "COMPLETE": полное обновление

    • "PARTIAL": частичное обновление отдельных партиций

    • "FORCE": принудительное обновление, игнорируя проверки устаревания

    • "" (пусто): по умолчанию/не указано

adaptivePartitionRefreshNumber

  • Тип: Integer

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

  • Значение по умолчанию: -1 (адаптивное обновление не задано)

  • Пример: 10 — обновлять по 10 партиций за итерацию.

Детали запросов к запускам задач

Информацию о запусках задач обновления MV можно получить из information_schema.task_runs:

SELECT 
    TASK_NAME,
    CREATE_TIME,
    FINISH_TIME,
    STATE,
    EXTRA_MESSAGE
FROM information_schema.task_runs
WHERE TASK_NAME LIKE 'mv-%'
ORDER BY CREATE_TIME DESC
LIMIT 10;

Колонка EXTRA_MESSAGE содержит JSON‑представление MVTaskRunExtraMessage.

JSON удобно распарсить для читабельности:

SELECT 
    TASK_NAME,
    CREATE_TIME,
    get_json_string(EXTRA_MESSAGE, '$.refreshMode') AS refresh_mode,
    get_json_string(EXTRA_MESSAGE, '$.forceRefresh') AS force_refresh,
    get_json_string(EXTRA_MESSAGE, '$.mvPartitionsToRefresh') AS mv_partitions,
    get_json_int(EXTRA_MESSAGE, '$.processStartTime') AS process_start_ms,
    get_json_int(EXTRA_MESSAGE, '$.adaptivePartitionRefreshNumber') AS adaptive_batch_size
FROM information_schema.task_runs
WHERE TASK_NAME = 'mv-12345'
ORDER BY CREATE_TIME DESC;

Понимание производительности обновления

Расчет времени обработки

SELECT 
    TASK_NAME,
    FINISH_TIME,
    get_json_bigint(EXTRA_MESSAGE, '$.processStartTime') AS process_start_time,
    (unix_timestamp(FINISH_TIME) * 1000 - 
     get_json_bigint(EXTRA_MESSAGE, '$.processStartTime')) / 1000 AS processing_seconds
FROM information_schema.task_runs
WHERE TASK_NAME LIKE 'mv-%' AND STATE = 'SUCCESS';

Анализ шаблонов обновления партиций

SELECT 
    TASK_NAME,
    CREATE_TIME,
    get_json_string(EXTRA_MESSAGE, '$.partitionStart') AS start_partition,
    get_json_string(EXTRA_MESSAGE, '$.partitionEnd') AS end_partition,
    get_json_string(EXTRA_MESSAGE, '$.nextPartitionStart') AS next_start,
    get_json_string(EXTRA_MESSAGE, '$.nextPartitionEnd') AS next_end
FROM information_schema.task_runs
WHERE TASK_NAME = 'mv-12345'
ORDER BY CREATE_TIME DESC;

Конфигурационные параметры

max_mv_task_run_meta_message_values_length

  • Тип: Integer

  • По умолчанию: 100

  • Область: конфигурация FE

  • Описание: Максимум элементов, сохраняемых в наборах/мапах для предотвращения разрастания метаданных. Ограничивает размер mvPartitionsToRefresh, refBasePartitionsToRefreshMap, basePartitionsToRefreshMap и planBuilderMessage.

Рекомендации

Мониторинг производительности обновления

  • Сравнивайте processStartTime и время завершения для выявления задержек очереди.

  • Используйте adaptivePartitionRefreshNumber для подбора размера батчей.

Отладка неудачных обновлений

  • Изучайте planBuilderMessage на предмет проблем оптимизатора.

  • Сравнивайте refBasePartitionsToRefreshMap и basePartitionsToRefreshMap, чтобы выявить проблемы «прореживания» партиций.

Оптимизация инкрементальных обновлений

  • Следите за nextPartitionStart и nextPartitionEnd, чтобы понимать многоитерационные обновления.

  • При необходимости увеличивайте размер батча или снижайте гранулярность партиций.

Понимание покрытия партиций

  • Сравнивайте mvPartitionsToRefresh и basePartitionsToRefreshMap, чтобы проверить соответствие между MV и базовыми таблицами.

  • Убедитесь, что партиции базовых таблиц соответствуют ожидаемым диапазонам обновления.

Устранение неполадок

Проблема: обновление занимает слишком много времени

Проверьте:

  1. processStartTime — существенное расхождение с временем создания означает ожидание в очереди.

  2. basePartitionsToRefreshMap — большое значение указывает на избыточное число сканируемых партиций.

  3. adaptivePartitionRefreshNumber — возможно, стоит настроить нагрузку.

Проблема: обновлены неожиданные партиции

Проверьте:

  1. forceRefresh — при true выполнено принудительное полное обновление.

  2. refBasePartitionsToRefreshMap — показывает запланированные партиции.

  3. basePartitionsToRefreshMap — показывает фактические партиции после оптимизации.

  4. Сравните карты, чтобы увидеть изменения плана оптимизатором.

Проблема: обновление «застряло» в нескольких итерациях

Проверьте:

  1. nextPartitionStart и nextPartitionEnd — указывают на незавершенное состояние.

  2. adaptivePartitionRefreshNumber — возможно, требуется настройка.

  3. Увеличьте размер батча или уменьшите гранулярность партиционирования.

См. также