共用方式為


用於可讀次要資料庫的查詢存放區

適用於: SQL Server 2025 (17.x) Azure SQL Database

可讀取的次要複本的查詢存放區可針對在次要複本上運行的工作負載啟用查詢存放區洞察。 啟用時,次要複本會將查詢執行資訊 (例如執行階段和等候統計資料) 串流至主要複本,其中資料會保存在查詢存放區中,並在所有複本中可見。

平台支援

目前,可讀次要檔案的查詢儲存庫功能已在 SQL Server 2025(17.x)的生產環境中可用並支援,Azure SQL 資料庫中也已支援。 從 SQL Server 2025(17.x)開始,在 Azure SQL 資料庫中,預設啟用可讀次要檔案的查詢儲存。

在 SQL Server 2022(16.x)中,可讀次要檔案的查詢儲存仍處於預覽階段,因此在生產環境中不支援,且預設是停用的。 僅在 SQL Server 2022(16.x)中為可讀取次要副本啟用查詢儲存,必須在主要副本和所有可讀取次要副本上啟用追蹤旗標 12606。 追蹤旗標 12606 不適用於基於 SQL Server 2022(16.x)的生產部署。 如需詳細資訊,請參閱 SQL Server 2022 版本資訊。 在 SQL Server 2025(17.x)中,可讀取次要節點的查詢存放區預設為啟用

Azure SQL 資料庫中,所有資料庫在 支援的服務層級及高可用性情境 下會自動註冊並啟用,以支援可讀次要副本的查詢儲存庫功能。 目前,Azure SQL 資料庫 Hyperscale 不支援此功能。

目前,這項功能在 Microsoft Fabric 的 Azure SQL 管理實例或 SQL 資料庫中並不支援。

支援的高可用性情境

  • 在使用 SQL Server 2025(17.x)實例的可讀次要資料庫的查詢存放區之前,必須先設定 Always On 可用性群組

  • 針對 Azure SQL 資料庫,可讀取次要資料庫的查詢存放區支援下列服務層級:

    • 具有 作用中異地複寫 的一般用途 (沒有內建的高可用性複本,需要異地複寫設定才能取得次要支援)
    • 進階(包括內建的高可用複本,也支援即時異地複寫)
    • 商業營運關鍵(包括內建的高可用性複本,也支援主動地理複寫)

為可讀取的次要複本啟用查詢存放區

如果查詢存放區尚未啟用,並在主要復本上處於 READ_WRITE 模式,您必須先啟用它,才能繼續。 針對主要複本上的每個所需資料庫執行下列指令碼:

ALTER DATABASE [Database_Name]
    SET QUERY_STORE = ON(OPERATION_MODE = READ_WRITE);

若要在所有可讀取的次要資料庫上啟用查詢存放區,請連線到主要複本,並針對要登記使用此功能的每個資料庫執行下列腳本。

ALTER DATABASE [Database_Name]
    FOR SECONDARY
    SET QUERY_STORE = ON
    (OPERATION_MODE = READ_WRITE);

啟用次要複本的自動計劃更正

適用於:SQL Server 2022 (16.x) 和更新版本、Azure SQL 資料庫。

啟用次要複本的查詢存放區之後,您可以選擇性地啟用自動微調,以允許自動計劃更正功能強制次要複本上的計劃。 這可讓查詢最佳化工具自動識別並修正次要複本上的執行計劃迴歸所造成的查詢效能問題。

若要啟用次要複本的自動計劃更正,請連線到主要複本,並針對每個所需的資料庫執行下列指令碼:

ALTER DATABASE [Database_Name]
FOR SECONDARY
SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN = ON);

停用次要複本的查詢存放區

若要在所有次要複本上停用次要複本的查詢存放區功能,請連線到 master 複本上的 primary 資料庫,並針對每個所需的資料庫執行下列腳本:

ALTER DATABASE [Database_Name]
    FOR SECONDARY
    SET QUERY_STORE = ON
    (OPERATION_MODE = READ_ONLY);

驗證查詢存放區是否已在次要複本上啟用

你可以透過連接到次要副本上的資料庫並執行以下 T-SQL 語法,來驗證 secondary 副本是否已啟用查詢儲存功能。

SELECT desired_state_desc,
       actual_state_desc,
       readonly_reason
FROM sys.database_query_store_options;

查詢 sys.database_query_store_options 目錄檢視的結果應該指出查詢存放區的實際狀態是 READ_CAPTURE_SECONDARY,且 readonly_reason8

desired_state_desc actual_state_desc readonly_reason
READ_CAPTURE_SECONDARY READ_CAPTURE_SECONDARY 8

備註

術語

複本集定義為資料庫的讀/寫複本 (主要) 和一或多個唯讀複本 (次要) 視為邏輯單元。 在此上下文中,角色 是指特定副本的角色。 當複本作為主要角色運行時,讀取/寫入複本可以執行資料修改和讀取活動。 當複本設定為只執行唯讀活動時,它會以輔助角色(輔助、地理輔助、地理高可用性輔助)提供服務。 角色可以透過計劃內或非計劃性容錯移轉事件來變更,發生這種情況時,主要角色可以變成次要角色,反之亦然。

目前支援的角色包括:

  • Primary
  • Secondary
  • 地理次級
  • Geo HA 備援
  • 具名複本

運作方式

儲存的查詢資料可以基於角色基礎作為工作負載進行分析。 可讀次要副本的查詢存放區可讓您監視可能針對次要複本執行的任何獨特的唯讀工作負載的效能。 資料會在角色層級彙總。 例如,SQL Server 分散式可用性群組 設定可能包含:

  • 一個主要複本,可用性群組 1 (AG1) 的一部分

  • 兩個本機次要複本,也是 AG1 的一部分

  • 另一個位置中的一個遠端主要複本,屬於個別可用性群組 (AG2) 的一部分。 在 SQL Server 術語中,它通常也稱為全域轉寄站,不過,可讀取次要檔案的查詢存放區功能會辨識它並將其參考為 Geo secondary 複本,假設它是地理上分散的次要複本。

如果 AG1 和 AG2 設定為當唯讀工作負載在 AG1 的任何次要複本上執行時允許唯讀連線,則查詢存放區執行統計數據會被傳送到 AG1 的主要複本,彙總後保存為由 secondary 角色生成的資料,然後再將此資料回傳給所有次要複本,包括 AG2 中的全球轉送器。 當在 AG2 的主要節點上執行獨立工作負載時,其資料會傳回至 AG1 的主要複本,並保存為從 Geo secondary 職能產生的資料。

從可觀察性的觀點來看, sys.query_store_runtime_stats 系統型錄視圖已延伸,以協助識別執行統計資料的來源角色。 此檢視與 sys.query_store_replicas 系統目錄檢視之間有關聯性,可提供更容易理解的角色名稱。 在 SQL Server 中,欄位 replica_nameNULL。 不過,如果有命名的副本存在且用於唯讀工作負載,該 replica_name 欄位會被填入超大規模服務層級。

一個可以用來整體分析過去 8 小時內前 50 個查詢(這些查詢從所有副本消耗 CPU 資源)的 T-SQL 查詢範例如下:

-- Top 50 queries by CPU across all replicas in the last 8 hours
DECLARE @hours AS INT = 8;

SELECT TOP 50 qsq.query_id,
              qsp.plan_id,
              CASE qrs.replica_group_id WHEN 1 THEN 'PRIMARY' WHEN 2 THEN 'SECONDARY' WHEN 3 THEN 'GEO SECONDARY' WHEN 4 THEN 'GEO HA SECONDARY' ELSE CONCAT('NAMED REPLICA_', qrs.replica_group_id) END AS replica_type,
              qsq.query_hash,
              qsp.query_plan_hash,
              SUM(qrs.count_executions) AS sum_executions,
              SUM(qrs.count_executions * qrs.avg_logical_io_reads) AS total_logical_reads,
              SUM(qrs.count_executions * qrs.avg_cpu_time / 1000.0) AS total_cpu_ms,
              AVG(qrs.avg_logical_io_reads) AS avg_logical_io_reads,
              AVG(qrs.avg_cpu_time / 1000.0) AS avg_cpu_ms,
              ROUND(TRY_CAST (SUM(qrs.avg_duration * qrs.count_executions) AS FLOAT) / NULLIF (SUM(qrs.count_executions), 0) * 0.001, 2) AS avg_duration_ms,
              COUNT(DISTINCT qsp.plan_id) AS number_of_distinct_plans,
              qsqt.query_sql_text
FROM sys.query_store_runtime_stats_interval AS qsrsi
     INNER JOIN sys.query_store_runtime_stats AS qrs
         ON qrs.runtime_stats_interval_id = qsrsi.runtime_stats_interval_id
     INNER JOIN sys.query_store_plan AS qsp
         ON qsp.plan_id = qrs.plan_id
     INNER JOIN sys.query_store_query AS qsq
         ON qsq.query_id = qsp.query_id
     INNER JOIN sys.query_store_query_text AS qsqt
         ON qsq.query_text_id = qsqt.query_text_id
WHERE qsrsi.start_time >= DATEADD(HOUR, -@hours, GETUTCDATE())
GROUP BY qsq.query_id, qsq.query_hash, qsp.query_plan_hash, qsp.plan_id, qrs.replica_group_id, qsqt.query_sql_text
ORDER BY SUM(qrs.count_executions * qrs.avg_cpu_time / 1000.0) DESC, AVG(qrs.avg_cpu_time / 1000.0) DESC;

SQL Server Management Studio (SSMS) 21 和更新版本中的查詢存放區報表提供複本下拉式選單,用於檢視各種複本集/角色的查詢存放區資料的方法。 此外,在物件總管檢視中,查詢儲存節點會反映查詢儲存目前的狀態(即READ_CAPTURE_SECONDARY),如果連接到可讀的次要副本。

Azure SQL 資料庫的可讀性次要複本遙測查詢存儲區

適用於:Azure SQL Database

透過 Azure 診斷設定串流 Query Store 執行階段統計資料 時,會包含兩個資料行,以協助識別遙測資料的來源副本:

  • is_primary_b:布林值,指出資料是源自主要複本 (true) 還是次要複本 (false)
  • replica_group_id:對應至複本角色的整數

這些資料行對於在分析跨複本集的工作負載時消除指標和效能資料的歧義至關重要。 設定診斷選項將查詢存放區執行階段統計資料串流至 Log Analytics、事件中樞或 Azure 儲存體時,請確保您的查詢和儀表板考量到這些資料行,以正確依複本角色區隔資料。 如需設定診斷設定和可用計量的詳細資訊,請參閱 Azure 監視器中的診斷設定

這很重要

Azure SQL 資料庫的查詢效能洞察(QPIdoes not )目前支援此 replica_group_id 概念。 儀表板中顯示的資料會匯總所有複製品的執行時間與等待統計資料。

可讀取次要數據的查詢存放區效能考慮

次要復本用來將查詢資訊傳回主要複本的通道,與用來讓次要複本保持最新狀態的通道相同。 channel 在這裡是什麼意思?

在可用性群組 (HADR) 組態中,複本會使用專用傳輸層彼此同步,該傳輸層會在主要複本和次要複本之間傳送記錄區塊、通知和狀態訊息。 這可確保資料一致性和備援準備。

啟用可讀取次要檔的查詢存放區時,它不會建立個別的網路端點。 相反地,它會在現有傳輸層上建立新的邏輯通訊路徑:

  • 針對 Azure SQL 資料庫 (非超大規模)、Azure SQL 受控執行個體和 SQL Server,這會使用高可用性和災害復原 (HADR) Always On 傳輸層。

  • Azure SQL 資料庫超大規模則使用另一種傳輸層,稱為遠端 Blob I/O 傳輸層。 遠端 Blob I/O 傳輸層是計算節點與日誌服務/分頁伺服器之間的通訊通道。 遠端 Blob I/O 傳輸層提供可靠且加密的通道,用於移動日誌記錄與資料頁。

透過相同的加密會話,此路徑將多工處理 Query Store 的執行數據(查詢文本、計劃、運行時統計/等待統計)以及一般的日誌記錄流量。 此功能有自己的擷取和接收佇列,可以透過從任何複本的視角查詢sys.database_query_store_internal_state來檢視這些佇列:

SELECT pending_message_count,
       messaging_memory_used_mb
FROM sys.database_query_store_internal_state;

次要資料庫的資料會保存在主要資料庫上的相同查詢存放區資料表中,這可能會增加儲存體需求。 在負載過重的情況下,您可能會觀察到傳輸通道上的延遲或背壓。 套用至主要查詢存放庫的相同臨時查詢擷取限制也適用於次要資料庫。 如需管理查詢存放區大小和擷取原則的詳細資訊和指引,請參閱 在 查詢存放區中保留最相關的資料

否定查詢識別碼/方案識別碼可見度

負識別碼表示在持久化到主伺服器之前,次級查詢/計劃的記憶體中的臨時佔位符。

在查詢存放區資料從可讀取的次要副本持久化到主伺服器之前,查詢和計劃可能會在查詢存放區的本機記憶體中被指派暫時識別碼 - MEMORYCLERK_QUERYDISKSTORE_HASHMAP。 查詢和計劃識別碼可以顯示為負數字,而且是預留位置,直到主要副本指派授權識別碼為止,這會在查詢存放區判斷查詢符合設定的 擷取模式需求之後發生。 如果有自訂 擷取原則 在執行中,您可以查詢 sys.database_query_store_options 系統型錄視圖以檢閱必須符合的要求。

SELECT query_capture_mode_desc,
       capture_policy_execution_count,
       capture_policy_total_compile_cpu_time_ms,
       capture_policy_total_execution_cpu_time_ms
FROM sys.database_query_store_options;

一旦查詢指定為已擷取,就可以保存其執行時期/等待統計資料和計劃,並將本端暫存 ID 取代為正 ID。 這也可讓您使用計劃強制或提示功能。