SQL 超大規模資料庫效能疑難排解診斷
適用於:Azure SQL 資料庫
若要針對超大規模資料庫中的效能問題進行疑難解答,一般 SQL 效能微調方法 是任何效能調查的起點。 但考慮到超大規模資料庫的分散式架構,可能需要考慮其他的診斷資料。 本文描述超大規模資料庫特有的診斷資料。
降低日誌速率等待時間
Azure SQL Database 中的每個資料庫和彈性集區都會透過 記錄速率治理來管理記錄產生速率。 在超大規模資料庫中,不論計算大小為何,記錄速率治理限制都會設定為105 MB/秒。 此值會在 primary_max_log_rate
的 資料行中顯示。
有時,必須減少主計算副本上的日誌生成速率,以維持可復原性服務等級協議。 例如,當 日誌伺服器或其他計算副本 明顯落後於從日誌服務中套用新的日誌記錄時,就會發生這種情況。 如果沒有超大規模資料庫元件落後,記錄速率治理機制可讓記錄產生速率達到 100 MB/秒。 這是所有超大規模計算規模中有效的最大記錄產生速率。
注意
記錄產生速率為 150 MB/秒,可作為選擇加入預覽功能。 如需詳細資訊,以及選擇加入150 MB/秒,請參閱 部落格:2024年11月超大規模資料庫增強功能。
當記錄速率降低時,下列等候類型會出現在 sys.dm_os_wait_stats 中:
等候類型 | 原因 |
---|---|
RBIO_RG_STORAGE |
頁面伺服器延遲記錄耗用量 |
RBIO_RG_DESTAGE |
長期記錄記憶體延遲記錄耗用量 |
RBIO_RG_REPLICA |
HA 次要復本或具名復本延遲記錄耗用量 |
RBIO_RG_GEOREPLICA |
異地次要複本延遲記錄耗用量 |
RBIO_RG_DESTAGE |
記錄服務延遲的記錄耗用量 |
RBIO_RG_LOCALDESTAGE |
日誌服務的日誌消耗延遲 |
RBIO_RG_STORAGE_CHECKPOINT |
頁面伺服器的記錄消耗延遲是由於資料庫檢查點的速度變慢所導致。 |
RBIO_RG_MIGRATION_TARGET |
反向移轉期間非超大規模資料庫延遲記錄耗用量 |
sys.dm_hs_database_log_rate() 動態管理函數(DMF)提供其他詳細數據,以便幫助您瞭解記錄速度是否降低。 例如,它可以告訴您哪一個特定的次要複本節點在應用日誌記錄上較落後,還有尚未應用的交易日誌的總大小是多少。
頁面伺服器讀取
計算複本不會在本機快取資料庫的完整複本。 計算副本的本地數據會儲存在緩衝池(在記憶體中)和本地強韌緩衝池擴展(RBPEX)快取中,其中包含最常被存取的數據頁子集。 此本機 SSD 快取的大小會根據計算大小成比例設置。 另一方面,每個頁面伺服器都擁有一個完整的 SSD 快取,用於其所維護的資料庫部分。
在計算副本上進行讀取 IO 時,如果緩衝池或本機 SSD 快取中沒有找到數據,則會從對應的頁面伺服器提取請求的 記錄序列號 (LSN) 的頁面。 從頁面伺服器讀取是遠端的,而且比從本機 SSD 快取讀取的速度慢。 針對 I/O 相關的效能問題進行疑難解答時,我們必須能夠透過相對緩慢的頁面伺服器讀取來判斷有多少 IO 完成。
有幾個動態管理檢視 (DMV) 與擴充事件具有可指出從頁面伺服器遠端讀取之數目的資料行和欄位,可將此數目與總讀取數目加以比較。 查詢存放庫還會在查詢執行時間的統計數據中擷取頁面伺服器讀取次數。
- 執行 DMV 與目錄檢視中提供報表伺服器讀取的資料列:
- 頁面伺服器讀取欄位存在於下列擴充事件中:
sql_statement_completed
sp_statement_completed
sql_batch_completed
rpc_completed
scan_stopped
query_store_begin_persist_runtime_stat
query_store_execution_runtime_info
-
ActualPageServerReads
/ActualPageServerReadAheads
屬性出現在包含運行時間統計數據之計劃的查詢計劃 XML 中。 例如:<RunTimeCountersPerThread Thread="8" ActualRows="90466461" [...] ActualPageServerReads="0" ActualPageServerReadAheads="5687297" ActualLobPageServerReads="0" ActualLobPageServerReadAheads="0" />
提示
若要在 [查詢計劃屬性] 視窗中檢視這些屬性,則需要 SSMS 18.3 或更新版本。
虛擬檔案統計資料和 IO 計量
在 Azure SQL Database 中,sys.dm_io_virtual_file_stats() DMF 是監視資料庫 I/O 統計數據的其中一種方式,例如 IOPS、輸送量和延遲。 超大規模資料庫中的 I/O 特性因 分散式架構而有所不同。 在本節中,我們將重點放在此 DMF 中所見的讀寫輸入/輸出操作上。 在 Hyperscale 中,此 DMF 中可見的每個資料檔都對應至一個頁伺服器。 DMF 也會針對計算複本和交易日誌上的本機 SSD 快取提供 I/O 統計數據。
本機 SSD 快取使用量
由於本機 SSD 快取存在於資料庫引擎正在處理查詢的相同計算複本上,因此針對此快取的 I/O 比頁面伺服器快。 在超大規模資料庫或彈性集區中,sys.dm_io_virtual_file_stats()
具有一個專門報告本機 SSD 快取 I/O 統計數據的行。 此行在 database_id
和 file_id
列的值為 0
。 例如,下列查詢會傳回自資料庫啟動以來的本機 SSD 快取 I/O 統計數據。
SELECT *
FROM sys.dm_io_virtual_file_stats(0, NULL);
本機 SSD 快取的讀取次數與所有其他資料檔案的總讀取次數之比率,稱為本機 SSD 快取命中率。 此計量是由 SYS.DM_OS_PERFORMANCE_COUNTERS DMV 中提供的 RBPEX cache hit ratio
和 RBPEX cache hit ratio base
性能計數器所提供。
資料讀取
- 當資料庫引擎在計算複本上進行讀取操作時,這些讀取可能由本地 SSD 快取或頁面伺服器提供,也可能在讀取多個頁面時由兩者共同提供。
- 當計算複本從特定數據檔讀取某些頁面時,例如具有
file_id
1 的檔案,如果此數據只位於本機 SSD 快取中,則此讀取的所有 IO 都會計入file_id
0。 如果部分數據位於本機 SSD 快取中,而某些部分位於頁面伺服器上,則來自本機 SSD 快取的部分的 IO 被計入file_id
0,而來自頁面伺服器的部分則計入相應的檔案。 - 當計算複本向頁面伺服器要求特定 LSN 的頁面時,如果頁面伺服器尚未達到要求的 LSN,計算複本上的讀取操作會等到頁面伺服器趕上後才返回頁面。 對於計算副本上頁面伺服器的任何讀取操作,如果正在等候該 IO,則會看到
PAGEIOLATCH_*
等候類型。 在超大規模資料庫中,此等待時間包括頁面伺服器上的要求頁面趕上所需的 LSN 的時間,以及將頁面從頁面伺服器傳送到計算複本所需的時間。 - 大型讀取,例如預先讀取通常會使用 散佈收集讀取來完成。 這可讓讀取最多 4 MB 做為單一讀取 IO。 不過,當讀取的數據位於本機 SSD 快取中時,這些讀取會視為多個個別的 8 KB 讀取,因為緩衝池和本機 SSD 快取一律使用 8 KB 頁面。 因此,針對本機 SSD 快取看到的讀取 IO 數目可能會大於引擎所執行的實際 IO 數目。
資料寫入
- 主要計算複本不會直接寫入頁面伺服器, 相反地,日誌服務中的日誌紀錄會在對應的頁面伺服器上被回放。
- 計算副本上的寫入主要是寫入本機 SSD 快取(
file_id
0)。 對於大於 8 KB 的寫入,換句話說,使用收集寫入 完成的寫入,每個寫入作業都會轉譯成多個 8 KB 個別寫入本機 SSD 快取,因為緩衝池和本機 SSD 快取一律使用 8 KB 頁面。 因此,針對本機 SSD 快取看到的寫入 IO 數目可能會大於引擎所執行的實際 IO 數目。 - 除了與頁伺服器對應的
file_id
0 以外的數據檔案,其他的數據檔案可能也會顯示寫入。 在超大規模資料庫中,這些寫入是仿真的,因為計算複本永遠不會直接寫入頁面伺服器。 在計算複本上發生時,I/O 統計數據會被計入。file_id
0 以外的數據檔計算複本上看到的 IOPS、輸送量和延遲,不會反映頁面伺服器上所發生寫入的實際 I/O 統計數據。
記錄寫入
- 在主要計算複本上,記錄寫入會在
file_id
2 底下的sys.dm_io_virtual_file_stats()
中計算。 - 與 AlwaysOn 可用性群組不同,當在主要計算複本上的交易提交時,日誌記錄不會在次要複本上被確保耐久性。 在超大規模資料庫中,記錄會在記錄服務中強化,並以異步方式套用至次要複本。 因為日誌寫入實際上不會發生在次要複本上,所以在次要複本上
sys.dm_io_virtual_file_stats()
的任何日誌 I/O 計算不應被當作交易日誌 I/O 統計數據使用。
資源使用率統計資料中的資料 IO
在非超大規模資料庫中,相對於資源管控資料 IOPS 限制,針對資料檔案的讀取與寫入合併的 IOPS 會在 sys.dm_db_resource_stats 和 sys.resource_stats 檢視中的 avg_data_io_percent
資料行中報告。 彈性集區的對應 DMV 是 sys.dm_elastic_pool_resource_stats 和 sys.elastic_pool_resource_stats。 在資料庫和彈性集區的 Azure 監視器度量中,這些值以 數據 IO 百分比 的形式報告。
在超大規模資料庫中,這些欄位和指標會報告數據 IOPS 使用率,相對於僅計算複本上本機 SSD 存儲的限制,這包含在本機 SSD 快取和 tempdb
資料庫中的 I/O。 此資料行中的 100% 值表示資源控管會限制本機儲存體 IOPS。 如果這與效能問題相關,請微調工作負載以產生較少的 IO,或增加計算大小,以增加資源控管 最大數據 IOPS限制。 針對本機 SSD 快取讀取和寫入的資源控管,系統會計算個別的 8 KB IO,而不是資料庫引擎可能發出的較大 IO。
針對分頁伺服器的數據輸入輸出 (IO) 不會在資源使用檢視中或透過 Azure Monitor 度量報告,但如先前所述,會在 sys.dm_io_virtual_file_stats()
中報告。
相關內容
- 有關超大規模單一資料庫的虛擬核心資源限制,請參閱超大規模資料庫服務層虛擬核心限制
- 要監視 Azure SQL 資料庫,請啟用資料庫監看員
- 有關 Azure SQL Database 效能調整,請參閱 Azure SQL Database 中的查詢效能
- 有關使用查詢存放區進行效能微調,請參閱使用查詢存放區的效能監視
- 有關 DMV 監視指令碼,請參閱使用動態管理檢視監視效能 Azure SQL Database