Понимание выполнения задач обновления материализованных представлений¶
Сведения о запусках задач обновления 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 и базовыми таблицами.Убедитесь, что партиции базовых таблиц соответствуют ожидаемым диапазонам обновления.
Устранение неполадок¶
Проблема: обновление занимает слишком много времени¶
Проверьте:
processStartTime— существенное расхождение с временем создания означает ожидание в очереди.basePartitionsToRefreshMap— большое значение указывает на избыточное число сканируемых партиций.adaptivePartitionRefreshNumber— возможно, стоит настроить нагрузку.
Проблема: обновлены неожиданные партиции¶
Проверьте:
forceRefresh— приtrueвыполнено принудительное полное обновление.refBasePartitionsToRefreshMap— показывает запланированные партиции.basePartitionsToRefreshMap— показывает фактические партиции после оптимизации.Сравните карты, чтобы увидеть изменения плана оптимизатором.
Проблема: обновление «застряло» в нескольких итерациях¶
Проверьте:
nextPartitionStartиnextPartitionEnd— указывают на незавершенное состояние.adaptivePartitionRefreshNumber— возможно, требуется настройка.Увеличьте размер батча или уменьшите гранулярность партиционирования.