根據健康檢查結果最佳化 Lakehouse 資料表

適用於:✅Microsoft Fabric 中的 SQL 分析端點

在這個教學中,你將學習如何建立 Microsoft Fabric 管線來執行智慧型資料表維護。

此解決方案呼叫 sys.sp_get_table_health_metrics Lakehouse SQL 分析端點的 T-SQL 儲存程序,評估結果,僅在資料表真正需要維護時執行 OPTIMIZE 。 這種「檢查後行動」模式避免了對健康資料表不必要的計算支出,同時確保退化的資料表能自動維護。

為什麼維護是必要的

Lakehouse 資料表隨時間累積過多小型 Parquet 檔案,這會影響 SQL 分析端點的查詢效能。

此流程不會在不考慮資料表狀態的情況下,按照固定排程執行 OPTIMIZE,而是會先判斷:先檢查資料表的健康狀況,只有在偵測到異常時才觸發最佳化。

先決條件

開始之前,請確定您擁有:

解決方案結構

完工的管線結構如下:

  1. 腳本活動:針對目標資料表執行 sp_get_table_health_metrics ,並以結構化輸出回傳資料表健康度指標。
  2. 如果條件活動:直接讀取 PotentialAnomalyType 腳本輸出,並檢查是否大於零。 欲了解更多相關 PotentialAnomalyType資訊,請參閱 潛在異常類型代碼
  3. Notebook 活動(在 True 分支內):在 Spark Notebook 中對資料表執行 OPTIMIZE

完成本教學後,你將擁有一個可從管線取得參數,並在觸發時對資料表進行最佳化的筆記本。

步驟一:建立優化筆記本

Notebook 會從管線接收目標 Lakehouse、結構描述和資料表名稱作為參數,然後使用 Spark SQL 執行 OPTIMIZE

  1. 在你的 Fabric 工作區,選擇 + 新項目>筆記本
  2. 把筆記本命名 為 Optimize-Table
  3. 位置 下,選取儲存您勾選之資料表的 Lakehouse。 這個練習使用名為 SalesDataLakehouse 的 Lakehouse。
  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 分析端點和 Warehouse 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 儲存格,以便其他使用者能妥善記錄筆記本。 你最終完成的筆記本應該大致如下:

    一張名為「當健康檢查顯示需要時優化 Lakehouse 表格」的 Fabric 筆記本截圖,裡面有兩個 PySpark 儲存格:一個設定管線提供的 lakehouse、schema 和 table 參數,另一個則執行 OPTIMIZE 指令以指定 Lakehouse 資料表。

Note

此範例以已啟用結構描述的 Lakehouse 為例。 如果你不使用 Lakehouse 的結構描述,請相應調整 full_name 上的三部分名稱。

步驟二:建立管線

  1. 在您的 Fabric 工作區中,選取 + 新增項目>管線

  2. 將管線命名為 Check-and-Optimize-Table

  3. 選擇管線畫布背景,然後開啟 參數 標籤。新增三個參數:

    名稱 類型 預設值
    lakehouse_name String SalesDataLakehouse
    schema_name String dbo
    table_name String FactSales

步驟 3:新增腳本活動

腳本活動會在 SQL 分析端點執行 sys.sp_get_table_health_metrics 並擷取結果。

Important

請使用 Script 活動,不要使用 儲存程序 活動。 只有腳本活動會將結果集以結構化的 JSON 輸出形式公開,讓下游活動能夠解析。

  1. 活動 索引標籤中,選取 指令碼,將其加入畫布。
  2. 將其命名為 「檢查資料表健康狀態」
  3. 設定 標籤中:
    • 連線:選擇 Lakehouse 的 SQL 分析端點。 如果沒有列出,請在下拉選單底部選擇「 全部瀏覽 」,然後找到你 Lakehouse 的 SQL 分析端點。

    • 腳本類型:選擇 查詢

    • 腳本:選擇 「新增動態內容 」並輸入以下表達式:

      @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 條件活動

If Condition 活動會直接從 Script 活動輸出讀取 PotentialAnomalyType,並根據其結果進行判斷。 請使用下列步驟:

  1. 活動 索引標籤中,選取 If 條件,將活動新增至畫布。

  2. 叫它 檢查異常

  3. 檢查資料表健康狀態檢查異常畫一個成功(綠色)箭頭。

  4. If Condition 活動的 Activities 標籤中,將表達式設為:

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

此表達式會讀取由 sys.sp_get_table_health_metrics 傳回的第一列,將 PotentialAnomalyType 轉型為整數,並在該值大於零時評估為 true,這表示在目標資料表中偵測到異常。

步驟 5:新增 Notebook 活動(True 分支)

選取 If Condition 活動後,選取 True 旁的 編輯(鉛筆圖示)。 畫布會切換到一個限定於 True 分支的子畫布。

  1. 筆記本 活動拖曳到 True 子畫布上。

  2. 叫它 RUN OPTIMIZE

  3. 在 [設定] 索引標籤中:

    • 筆記本:選擇你在步驟 1 中建立的 Optimize-Table 筆記本。

    • 展開 基底參數,然後新增三列:

      名稱 類型 價值
      lakehouse_name String @pipeline().parameters.lakehouse_name
      schema_name String @pipeline().parameters.schema_name
      table_name String @pipeline().parameters.table_name

三個名稱欄位的值必須與筆記本參數格中的變數名稱 完全一致。

Note

你可以讓 虛假活動 保持空白。 If Condition 活動將空白的 False 分支視為不執行任何操作,並將該管線報告為成功。

您完成的管線應如下所示:

Fabric 資料管線的截圖,裡面有 Check Table Health 腳本活動連接到 Check Anomaly 條件活動。真實分支執行 OPTIMIZE 筆記本活動,而假分支則沒有活動。

步驟六:驗證並執行

  1. 在管線工具列選擇 「驗證 」以檢查設定錯誤。

  2. 選取 執行,即可手動執行管線。

  3. 監看執行情況並確認:

    1. 檢查資料表狀態:在此活動執行時,檢查其輸出內容。 你應該會看到來自 sys.sp_get_table_health_metrics 預存程序的 JSON 格式輸出。
    2. 檢查異常:透過直接從指令碼輸出讀取 PotentialAnomalyType 來正確評估。
    3. 執行 OPTIMIZE(僅在 PotentialAnomalyType > 0 時):如果 Check Anomaly 活動評估結果為 True,請檢視 Run OPTIMIZE 活動的輸入,確認其使用的參數是否正確(Lakehouse 名稱、結構描述和資料表名稱),並檢查輸出,以查看來自 OPTIMIZE 作業的訊息。

清理資源

如果你只為這個教學建立資源,且不再需要,請從工作區刪除以下項目:

  • 檢查與優化表流程。
  • Optimize-Table 筆記本。