使用結果集快取進行效能微調

啟用結果集快取時,專用 SQL 集區會在使用者資料庫中自動快取查詢結果,以供重複使用。 這可讓後續的查詢執行直接從永續性快取取得結果,因此不需要重新計算。 結果集快取可改善查詢效能,並減少計算資源使用量。 此外,使用快取結果集的查詢不會使用任何並行位置,因此不會計入現有的並行限制。 基於安全性,如果使用者與建立快取結果的使用者具有相同的資料存取權限,則只能存取快取的結果。 在資料庫和工作階段層級中,結果集快取預設為關閉。

注意

不應將結果集快取與 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'>;

以下是在已停用結果集快取情況下所執行查詢的範例輸出。

Screenshot shows query results, including location type and command.

以下是在已啟用結果集快取情況下所執行查詢的範例輸出。

Screenshot shows query results with the command selected * from [D W ResultCache D b] dot d b o called out.

使用快取的結果時

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

  • 執行查詢的使用者可以存取查詢中所參考所有資料表。
  • 新查詢與產生結果集快取的上一個查詢完全相符。
  • 產生快取結果集的來源資料表中沒有資料或結構描述變更。

執行此命令來檢查所執行查詢的結果快取是否有命中。 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

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

下一步

如需更多開發秘訣,請參閱開發概觀