Оптимизируйте таблицы Lakehouse на основе результатов проверок работоспособности

Область применения:✅ конечная точка аналитики SQL в Microsoft Fabric

В этом руководстве описано, как создать конвейер Microsoft Fabric для выполнения интеллектуального обслуживания таблиц.

Это решение вызывает хранимую процедуру T-SQL sys.sp_get_table_health_metrics в конечной точке SQL-аналитики Lakehouse, оценивает результат и запускает OPTIMIZE только тогда, когда таблица действительно требует обслуживания. Этот шаблон «сначала проверка, затем действие» предотвращает ненужный расход вычислительных ресурсов на исправные таблицы, обеспечивая при этом автоматическое обслуживание таблиц, состояние которых ухудшилось.

Почему требуется обслуживание

Таблицы Lakehouse могут накапливать слишком много небольших файлов Parquet с течением времени, что повредит производительность запросов в конечной точке аналитики SQL.

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

Необходимые условия

Прежде чем начать, убедитесь, что у вас есть:

  • Рабочая область Microsoft Fabric с разрешениями участника или более высокого уровня.
  • Lakehouse в этой рабочей области, содержащий хотя бы одну таблицу Delta, которую вы хотите отслеживать. В этом руководстве используется Lakehouse с именем SalesDataLakehouse.
  • Знакомство с конвейерами данных Fabric.
  • Знакомство с записными книжками Fabric.

Структура решения

Завершенный конвейер имеет эту структуру:

  1. Действие скрипта: выполняет sp_get_table_health_metrics для целевой таблицы и возвращает метрики состояния таблицы в виде структурированного вывода.
  2. Операция If Condition: считывает PotentialAnomalyType непосредственно из вывода скрипта и проверяет, больше ли оно нуля. Дополнительные сведения о PotentialAnomalyTypeкодах типов аномалий см. в разделе "Потенциальные коды типов аномалий".
  3. Действие записной книжки (внутри ветви True): запускает OPTIMIZE для таблицы из записной книжки Spark.

К концу этого руководства у вас будет блокнот, который получает параметры из конвейера и оптимизирует таблицу при запуске.

Шаг 1. Создание записной книжки оптимизации

Блокнот получает из конвейера целевой Lakehouse, схему и имя таблицы в качестве параметров, а затем выполняет OPTIMIZE с помощью Spark SQL.

  1. В рабочей области Fabric выберите + Создать элемент>Записная книжка.
  2. Назовите блокнот Optimize-Table.
  3. В разделе "Расположение" выберите Lakehouse, где хранятся проверяемые таблицы. В этом упражнении используется Lakehouse с именем SalesDataLakehouse.
  4. Нажмите кнопку "Создать".

Добавление ячейки параметра

Первая ячейка определяет переменные, которые конвейер переопределяет во время выполнения.

  1. В первой ячейке введите следующие параметры. Значения не важны, и конвейер переопределяет их во время выполнения.

    # Parameters 
    lakehouse_name = "<LakehouseName>"
    schema_name    = "<SchemaName>"
    table_name     = "<TableName>"
    

    Important

    Как параметризация работает в записных книжках Fabric: во время выполнения Fabric внедряет новую ячейку сразу после того, как ячейка параметра переназначает эти переменные со значениями, передаваемыми конвейером. Значения, заданные здесь, лишь инициализируют переменные и улучшают читаемость.

  2. Выберите меню ячеек (...) >Переключите ячейку параметра , чтобы пометить эту ячейку как ячейку параметра.

Добавление ячейки OPTIMIZE

Эта OPTIMIZE команда — это команда Spark SQL, а не команда T-SQL. Его необходимо запустить в средах Spark, таких как записные книжки, определения заданий Spark или интерфейс обслуживания Lakehouse. Конечная точка аналитики SQL и редактор SQL-запросов хранилища не поддерживают эту команду напрямую.

  1. Во второй ячейке введите:

    full_name = f"{lakehouse_name}.{schema_name}.{table_name}"
    print(f"Optimizing {full_name} ...")
    
    result = spark.sql(f"OPTIMIZE {full_name}")
    result.show(truncate=False)
    
  2. Добавьте ячейки Markdown, чтобы правильно документировать записную книжку для других пользователей. Завершенная записная книжка должна выглядеть примерно так:

    Снимок экрана: блокнот Fabric с названием

Note

В этом примере рассматривается Lakehouse с включенными схемами. Измените трехкомпонентное имя full_name соответствующим образом, если вы не используете схемы Lakehouse.

Шаг 2. Создание конвейера

  1. В рабочей области Fabric выберите +Создать> элементов.

  2. Назовите конвейер Check-and-Optimize-Table.

  3. Выберите фон холста конвейера и откройте вкладку "Параметры ". Добавьте три параметра:

    Name Type Значение по умолчанию
    lakehouse_name String SalesDataLakehouse
    schema_name String dbo
    table_name String FactSales

Шаг 3. Добавление действия скрипта

Действие скрипта выполняется sys.sp_get_table_health_metrics в конечной точке аналитики SQL и записывает результат.

Important

Используйте действие скрипта , а не действие хранимой процедуры . Только действие «Скрипт» представляет результирующий набор в виде структурированного вывода JSON, который могут разбирать последующие действия.

  1. На вкладке "Действия" выберите "Скрипт" , чтобы добавить его на холст.
  2. Назовите его Check Table Health.
  3. На вкладке "Параметры" :
    • Подключение: Выберите конечную точку SQL-аналитики для вашего Lakehouse. Если его нет в списке, выберите Просмотреть все внизу раскрывающегося списка, а затем найдите конечную точку SQL-аналитики Lakehouse.

    • Тип скрипта: выбор запроса.

    • Скрипт: выберите "Добавить динамическое содержимое " и введите следующее выражение:

      @concat('EXEC sys.sp_get_table_health_metrics ''',
              pipeline().parameters.schema_name, '.',
              pipeline().parameters.table_name, '''')
      

Это выражение создает команду SQL, которая выполняет хранимую процедуру для целевой таблицы, например: EXEC sys.sp_get_table_health_metrics 'dbo.FactSales'

Проверка выходных данных скрипта

Запустите конвейер один раз и проверьте выходные данные действия скрипта . Вы видите объект JSON, аналогичный следующему:

{
  "resultSetCount": 1,
  "resultSets": [
    {
      "rowCount": 1,
      "rows": [
        {
          "PotentialAnomalyType": 3,
          "PotentialAnomalyDescription": "Too many small files...",
          "FileCount": 2688,
          "...": "..."
        }
      ]
    }
  ]
}

Important

Фактический результат может отличаться в зависимости от состояния таблицы. Важно то, что он возвращает столбцы, доступные через sys.sp_get_table_health_metrics.

Шаг 4: Добавьте действие "If Condition"

Действие «Условие If» считывает PotentialAnomalyType непосредственно из выходных данных действия Скрипт и принимает решение на основе полученного результата. Выполните следующие действия.

  1. На вкладке "Действия" выберите "Если условие ", чтобы добавить действие на холст.

  2. Назовите это Проверка аномалии.

  3. Нарисуйте стрелку «Успех» (зеленая) от Проверить состояние таблицы к Проверить аномалию.

  4. На вкладке Действия действия If Condition задайте для параметра Выражение значение:

    @greater(int(activity('Check Table Health').output.resultSets[0].rows[0]['PotentialAnomalyType']), 0)
    

Это выражение считывает первую строку, возвращаемую sys.sp_get_table_health_metrics, приводит PotentialAnomalyType к целому числу и принимает значение true, когда значение больше нуля, что указывает на обнаружение аномалии в целевой таблице.

Шаг 5: Добавьте действие «Notebook» (ветвь True)

Когда выбрано действие «Если условие», нажмите «Изменить» (значок карандаша) рядом с True. Холст переключается на вложенный холст в контексте ветви True.

  1. Перетащите действие Notebook на вложенный холст True.

  2. Присвойт ей имя run OPTIMIZE.

  3. На вкладке Параметры сделайте следующее:

    • Записная книжка: выберите записную книжку Optimize-Table , созданную на шаге 1.

    • Разверните базовые параметры, а затем добавьте три строки:

      Name Type Value
      lakehouse_name String @pipeline().parameters.lakehouse_name
      schema_name String @pipeline().parameters.schema_name
      table_name String @pipeline().parameters.table_name

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

Note

Вы можете оставить действия false пустыми. Действие «Условие If» рассматривает пустую ветвь False как отсутствие действий и помечает конвейер как успешно выполненный.

Завершенный конвейер должен выглядеть следующим образом:

Снимок экрана конвейера данных Fabric с операцией скрипта Check Table Health, подключенной к условной операции Check Anomaly. Ветвь true запускает операцию записной книжки OPTIMIZE, а ветвь false не содержит операций.

Шаг 6. Проверка и запуск

  1. Выберите "Проверить" на панели инструментов конвейера, чтобы проверить наличие ошибок конфигурации.

  2. Выберите Run, чтобы вручную выполнить пайплайн.

  3. Следите за выполнением и подтверждайте:

    1. Проверьте состояние таблицы: изучите выходные данные этого действия при его выполнении. Выходные данные хранимой sys.sp_get_table_health_metrics процедуры должны отображаться в формате JSON.
    2. Проверка аномалии: корректно выполняется, считывая PotentialAnomalyType непосредственно из вывода скрипта.
    3. Запустите OPTIMIZE (только если PotentialAnomalyType > 0): если действие Check Anomaly возвращает значение True, просмотрите входные данные для действия Run OPTIMIZE, чтобы убедиться, что используются правильные параметры (имя Lakehouse, схема и имя таблицы), и проверьте выходные данные, чтобы просмотреть сообщения операции OPTIMIZE.

Очистите ресурсы

Если вы создали ресурсы только для этого руководства и больше не нужны им, удалите следующие элементы из рабочей области:

  • Конвейер Check-and-Optimize-Table.
  • Блокнот Optimize-Table.