適用於: SQL Server 2025 (17.x)
Azure SQL Database
可讀次要檔案的查詢儲存庫可在 SQL Server 2025(17.x)及 Azure SQL 資料庫中使用,而可讀次要檔案的持久統計功能則利用查詢商店為可讀次要檔案所建立的基礎設施。
SQL Server 2025(17.x)和 Azure SQL Database 預設開啟可 讀次要檔案的查詢儲存庫。
Background
在可讀取的次要複本上,當啟用 自動建立統計數據 選項時,也可以自動建立統計數據,但當實例重新啟動時,這些統計數據是暫時的,並消失。 當只讀資料庫或只讀快照集上的統計數據遺失或過時時,Database Engine 會在 中 tempdb建立和維護暫存統計數據。
當資料庫引擎建立暫存統計資料時,統計資料名稱會附加尾碼 _readonly_database_statistic ,以區分暫時統計資料與永久統計資料。 後綴 _readonly_database_statistic 會保留給 SQL Server 所產生的統計數據。 之所以採用這種方法,是因為處理針對可能要求主要複本上不存在之不同統計數據的可讀取次要複本執行的工作負載。
在次要複本上建立的暫存統計資料只有產生它們的複本才能看到。 主要複本不會直接存取這些暫存統計資料物件,而且只有在資料永久儲存後才會知道永久統計資料物件。 當暫時統計資料保存至主要複本時,它們會透過同步處理機制可供可用性群組中的所有複本使用。
持久性機制會使用 SQL Server 2022(16.x)中引進的可讀次要節點的查詢存放區。 統計資料資訊會傳送至主要複本,並保存為永久統計資料,然後同步處理回所有次要複本。 此過程會自動發生,無需人工幹預。
支援目錄視圖
為了支援比較次要和主要之間的統計資料建立或更新,並協助瞭解統計資料的建立位置,已將三個新資料行新增至 sys.stats 目錄檢視:
| 欄位名稱 | 數據類型 | Description |
|---|---|---|
replica_role_id |
tinyint |
1 = 主要、 2 = 次要、 3 = 地理次要、 4 = 地理 HA 次要 |
replica_role_desc |
nvarchar(60) | 主要、次要、地理次要、地理 HA 次要 |
replica_name |
sysname | 可用性群組中複本的實例名稱。
NULL 對於主要複本 |
這些資料行會在整個保存生命週期中追蹤統計資料的擁有權和來源。 當次要複本建立暫存統計資料並將其保存到主要複本時,replica_role_id 和 replica_name 資料行會識別原始複本。 如果這些永久統計資料稍後在主要複本上更新,則擁有權會轉移至主要複本,並反映在這些欄位中。
統計資料的持久性行為
當暫時統計資料從次要複本保存到主要複本時,會發生數個重要行為:次要複本上的暫存統計資料在持續性之後不會自動移除。 最初觸發建立這些臨時統計資料的查詢會繼續使用它們,直到查詢進行重新編譯或重新啟動複本為止。 這表示相同統計資料的臨時和永久版本可以暫時共存。
最佳化工具在決定是否使用統計資料時不會考慮複本擁有權。 它會根據直欄涵蓋面及選擇性估計值來評估所有可用的統計量。 維護複本資訊主要是為了追蹤和疑難排解目的。
當從臨時統計資料建立的永久統計資料變得過時時,會發生一個值得注意的案例。 如果在那些統計資料中的主要影響直欄上發生重大資料修改,則永久統計資料可能會被視為過時。 當次要複本上的查詢參考這些資料行時,次要複本會根據其資料檢視來更新統計資料,以反映已透過重做程序套用的修改。
簡而言之,持續性不會移除次要重新整理過時統計資料的能力;它只是新增了一種跨複本 共用 統計資料的機制。
Observability
延伸事件
persisted_stats_operation(作業通道)會針對 enqueued、dequeued、processed 和 failed 事件啟動。 這可以用來監視統計訊息是否無法持久化於主伺服器上,或有興趣觀察訊息處理功能。 暫存統計資料會保留 tempdb 在次要複本上,而背景處理程序會在主要複本和次要複本之間發生通訊問題時重試傳送訊息。
可記載至 ERRORLOG 的相關錯誤訊息範例
- 9131:SQL 啟動期間停用功能。
- 9136:資料表或索引已卸除/修改。
- 9137:自快照交易啟動以來,資料架構已變更;重新嘗試。
- 9139:統計資料太大,無法傳送至主要。
下列查詢可以提供對資料表的統計資料進行檢視的能力,包括從次要副本保存的統計資料:
SELECT sch.[name] AS SchemaName,
obj.[name] AS TableName,
s.[name] AS StatsName,
CASE WHEN s.stats_id >= 2 AND s.auto_created = 1 THEN 'AUTO_STATS'
WHEN s.stats_id >= 2 AND s.auto_created = 0 THEN 'USER_CREATED_STATS'
ELSE 'INDEX_STATS'
END AS type,
s.is_temporary,
CASE WHEN s.replica_name IS NULL
AND s.replica_role_desc = 'PRIMARY'
AND s.stats_id >= 2
AND s.auto_created = 1
THEN 'PRIMARY'
ELSE s.replica_name
END AS replica_name,
s.replica_role_id,
s.replica_role_desc
FROM sys.schemas AS sch
INNER JOIN sys.objects AS obj
ON sch.schema_id = obj.schema_id
INNER JOIN sys.stats AS s
ON obj.object_id = s.object_id
WHERE sch.[name] <> 'sys'
ORDER BY sch.[name], obj.[name], s.stats_id;
考慮事項
只要啟用自動 建立統計資料 選項,並且啟用了 READABLE_SECONDARY_TEMPORARY_STATS_AUTO_CREATE 和 READABLE_SECONDARY_TEMPORARY_STATS_AUTO_UPDATE 資料庫範圍的組態選項,就會預設啟用可讀取次要資料庫的持續統計資料功能,而這是預設組態。 沒有資料庫範圍的設定可開啟和關閉此功能。