使用結果集快取的效能調校

Tip

Microsoft Fabric Data Warehouse 是一個企業規模的關聯式倉庫,建立在資料湖基礎上,具備未來準備架構、內建 AI 及新功能。 如果你是資料倉儲新手,建議先從Fabric Data Warehouse開始。 現有的 專用 SQL 工作負載可升級至 Fabric,以取得資料科學、即時分析與報告等多項新功能。

啟用結果集快取時,專用的 SQL 池會自動將查詢結果快取到使用者資料庫,供重複使用。 這使得後續的查詢執行能直接從持久快取取得結果,因此無需重新計算。 結果集快取提升查詢效能並減少計算資源使用。 此外,使用快取結果集的查詢不使用任何並發時隙,因此不計入現有的並發限制。 為了安全起見,使用者只有在擁有與快取結果使用者相同的資料存取權限時,才能存取快取結果。 結果集快取在資料庫與工作階段層級預設為 OFF。

備註

不應將結果集快取與 DECRYPTBYKEY 搭配使用。 如果必須使用此密碼編譯函數,請確定您在執行時已停用結果集快取 (在工作階段層級資料庫層級)。

按鍵指令

啟用/停用使用者資料庫的結果集快取

為工作階段開啟/關閉結果集快取

檢查快取結果集的大小

清理快取

未快取的內容

一旦資料庫開啟結果集快取,所有查詢的結果都會被快取,直到快取滿為止,以下查詢除外:

  • 即使基底資料表的資料或查詢沒有變動,含有內建函式或執行時表達式的查詢仍然是非確定性的。 例如,DateTime.Now(), GetDate()。
  • 使用使用者定義函式的查詢
  • 使用具有列級安全性的資料表查詢
  • 傳回資料列大小大於 64KB 的查詢
  • 傳回大量資料的查詢 (>10GB)

備註

  • 某些非確定性函式與執行時表達式在對相同資料進行重複查詢時,可能具有確定性。 例如,ROW_NUMBER()。
  • 如果查詢結果集的列序對你的應用程式邏輯很重要,請在查詢中使用 ORDER BY。
  • 如果 ORDER BY 欄位中的資料不唯一,則對於 ORDER BY 欄位中值相同的資料,無論是否啟用或停用結果集快取,都無法保證列序。

這很重要

建立結果集快取及從快取資料的操作,會在專用 SQL 池的控制節點上進行。 當啟用結果集快取時,執行回傳大型結果集(例如 >1GB)的查詢,可能會導致控制節點大幅限速,並使整個實例的查詢回應變慢。 這些查詢通常會在資料探索或 ETL 作業期間使用。 若要避免對控制節點造成壓力並導致效能問題,使用者應該先關閉資料庫的結果集快取,再執行這些類型的查詢。

執行此查詢以計算針對查詢的結果集快取操作所耗費的時間。

SELECT step_index, operation_type, location_type, status, total_elapsed_time, command
FROM sys.dm_pdw_request_steps
WHERE request_id  = <'request_id'>;

這裡有一個在關閉結果集快取時執行的查詢範例輸出。

截圖顯示查詢結果,包括位置類型和指令。

這裡有一個啟用結果集快取時執行的查詢範例輸出。

螢幕擷取畫面顯示查詢結果,並特別標示選取的命令 * from [D W ResultCache D b] dot d b o。

當快取結果被使用時

如果符合下列所有需求,查詢會重複使用快取的結果集:

  • 執行查詢的使用者可以存取查詢中所有的資料表。
  • 新查詢與先前產生結果集快取的查詢完全吻合。
  • 快取結果集產生的表格中沒有資料或結構變更。

執行此命令以檢查查詢是以結果快取命中還是未命中執行。 result_cache_hit欄回傳 1 表示快取命中,0 表示快取未命中,負值則表示未使用結果集快取的原因。 詳情請查 sys.dm_pdw_exec_requests

SELECT request_id, command, result_cache_hit FROM sys.dm_pdw_exec_requests
WHERE request_id = <'Your_Query_Request_ID'>

管理已快取的結果

結果集快取的最大容量為每個資料庫 1 TB。 當底層查詢資料變更時,快取結果會自動失效。

專用 SQL 集區會依照下列排程自動管理快取驅逐:

  • 若結果集未被使用或已失效,將每 48 小時更新一次。
  • 當結果集快取接近最大大小時。

使用者可透過以下選項之一手動清空整個結果集快取:

  • 為資料庫關閉結果集快取功能
  • 連接資料庫時執行 DBCC DROPRESULTSETCACHE

暫停資料庫不會清空快取的結果集。

下一步

更多開發建議,請參閱 開發概覽