共用方式為


SQL 超大規模資料庫效能疑難排解診斷

適用於:Azure SQL 資料庫

若要針對超大規模資料庫中的效能問題進行疑難解答,一般 SQL 效能微調方法 是任何效能調查的起點。 但考慮到超大規模資料庫的分散式架構,可能需要考慮其他的診斷資料。 本文描述超大規模資料庫特有的診斷資料。

降低日誌速率等待時間

Azure SQL Database 中的每個資料庫和彈性集區都會透過 記錄速率治理來管理記錄產生速率。 記錄速率限制會在sys.dm_user_db_resource_governance的欄位中primary_max_log_rate公開。

有時,必須降低主要計算複本上的記錄產生速率,才能維護可復原性服務等級協定 (SLA)。 例如,當 日誌伺服器或其他計算副本 明顯落後於從日誌服務中套用新的日誌記錄時,就會發生這種情況。 如果沒有超大規模資料庫元件落後,記錄速率治理機制可讓記錄產生速率達到每個資料庫的 150 MiB/秒,以供進階系列和進階系列記憶體優化硬體使用。 針對標準系列硬體,每個資料庫的記錄速率上限為100 MiB/秒。 針對彈性集區,進階系列和進階系列記憶體優化硬體的每個集區記錄速率上限為 150 MiB/秒,而其他硬體的每個集區則為 125 MiB/秒。

當記錄速率降低時,下列等候類型會出現在 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) 與擴充事件具有可指出從頁面伺服器遠端讀取之數目的資料行和欄位,可將此數目與總讀取數目加以比較。 查詢存放庫還會在查詢執行時間的統計數據中擷取頁面伺服器讀取次數。

  • 可報告頁面伺服器讀取狀態的資料行可在執行過程 DMVs 和目錄檢視中找到。

  • 頁面伺服器讀取欄位存在於下列擴充事件中:

    • 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 中所見的讀寫輸入/輸出操作上。

針對超大規模計算,sys.dm_io_virtual_file_stats() 中的相關資料如下:

  • 值符合 database_id 函式所傳回的值,且值不是 2 的file_id,會對應至頁面伺服器。 通常,每一列對應一個頁面伺服器。 不過,對於較大的檔案,會使用多個頁面伺服器。

    • 具有 2 的 file_id 列對應於交易日誌。
  • database_id 欄的值為 0 的資料列會對應至計算副本上的本機 SSD 快取。

本機 SSD 快取使用量

由於本機 SSD 快取存在於資料庫引擎正在處理查詢的相同計算複本上,因此針對此快取的 I/O 比頁面伺服器快。 在超大規模資料庫或彈性集區中, sys.dm_io_virtual_file_stats() 具有報告本機 SSD 快取 I/O 統計資料的特殊資料列。 這些資料列的database_id欄值為0。 例如,下列查詢會傳回自資料庫啟動以來的本機 SSD 快取 I/O 統計資料。

SELECT *
FROM sys.dm_io_virtual_file_stats(0, NULL);

本機SSD快取檔案的彙總讀取與所有其他資料檔案的彙總讀取的比率是本機SSD快取命中率。 此計量是由 RBPEX cache hit ratio DMV 中提供的 RBPEX cache hit ratio base 性能計數器所提供。

資料讀取

  • 當資料庫引擎在計算複本上進行讀取操作時,這些讀取可能由本地 SSD 快取或頁面伺服器提供,也可能在讀取多個頁面時由兩者共同提供。

  • 當計算複本從特定資料檔案讀取某些頁面時 (例如,具有 file_id 1 的檔案),如果此資料僅位於本機 SSD 快取中,則此讀取的所有 IO 都會根據本機 SSD 快取檔案 ( database_id 其中為 0) 計算。 如果該資料的某些部分位於本機 SSD 快取中,而部分位於頁面伺服器上,則 IO 會部分計入本機 SSD 快取檔案,並部分計入對應至頁面伺服器的資料檔案。

  • 當計算節點副本向頁面服務器請求特定 LSN 的頁面時,若頁面服務器尚未達到所請求的 LSN,計算節點副本的讀取操作會等待,直到頁面服務器達到要求的 LSN,然後再返回頁面。 對於從計算複本上的頁面伺服器讀取的任何數據,如果它正在等候該 IO,您會看到 PAGEIOLATCH_* 等候類型。 在超大規模資料庫中,此等待時間包括頁面伺服器上的要求頁面趕上所需的 LSN 的時間,以及將頁面從頁面伺服器傳送到計算複本所需的時間。

  • 大型讀取,例如預先讀取通常會使用 散佈收集讀取來完成。 這可讓讀取最多 4 MB 做為單一讀取 IO。 不過,當讀取的數據位於本機 SSD 快取中時,這些讀取會視為多個個別的 8 KB 讀取,因為緩衝池和本機 SSD 快取一律使用 8 KB 頁面。 因此,針對本機 SSD 快取看到的讀取 IO 數目可能會大於引擎所執行的實際 IO 數目。

資料寫入

  • 主要計算複本不會直接寫入頁面伺服器。 相反地,日誌服務中的日誌紀錄會在對應的頁面伺服器上被回放。

  • 計算副本上的寫入主要是寫入本機 SSD 快取(database_id 0)。 對於大於 8 KB 的寫入,換句話說,使用收集寫入 完成的寫入,每個寫入作業都會轉譯成多個 8 KB 個別寫入本機 SSD 快取,因為緩衝池和本機 SSD 快取一律使用 8 KB 頁面。 因此,針對本機 SSD 快取看到的寫入 IO 數目可能會大於引擎所執行的實際 IO 數目。

  • 除了與頁伺服器對應的 database_id 0 以外的數據檔案,其他的數據檔案可能也會顯示寫入。 在超大規模資料庫中,這些寫入是仿真的,因為計算複本永遠不會直接寫入頁面伺服器。 在計算複本上發生時,I/O 統計數據會被計入。 計算複本上顯示的寫入 IOPS、輸送量和延遲,對於 0 以外的 database_id 資料檔案,不會反映頁面伺服器上發生的寫入的實際 I/O 統計資料。

記錄寫入

  • 在主要計算複本上,記錄寫入會計入 sys.dm_io_virtual_file_stats() 2 以下 file_id

  • 不同於可用性群組,當交易在主要計算複本上提交時,日誌記錄不會在次要複本上持久化。 在超大規模資料庫中,記錄會在記錄服務中強化,並以異步方式套用至次要複本。 因為日誌寫入實際上不會發生在次要複本上,所以在次要複本上 sys.dm_io_virtual_file_stats() 的任何日誌 I/O 計算不應被當作交易日誌 I/O 統計數據使用。

資源使用率統計資料中的資料 IO

在非超大規模資料庫中,合併讀取和寫入 IOPS 相對於 資源控管 資料 IO 限制的資料檔案,其資料會在 avg_data_io_percent 欄中於 sys.dm_db_resource_statssys.resource_stats 檢視中報告。 彈性集區的對應 DMV 是 sys.dm_elastic_pool_resource_statssys.elastic_pool_resource_stats。 在資料庫和彈性集區的 Azure 監視器度量中,這些值以 數據 IO 百分比 的形式報告。

在超大規模資料庫中,這些資料行和計量會報告相對於計算複本上本機 SSD 儲存體限制的資料 IO 使用率,其中包括針對本機 SSD 快取和 tempdb 資料庫的 I/O。 此資料行中的 100% 值表示資源控管會限制本機儲存體 IOPS。 如果這與效能問題相關,請微調工作負載以產生較少的 IO,或增加計算大小,以增加資源控管 最大數據 IOPS限制。 針對本機 SSD 快取讀取和寫入的資源控管、系統會計算個別 8 KB IO、而不是資料庫引擎可能發出的較大 IO。

針對頁面伺服器的資料 IO,不會在資源使用率視圖中報告,也不會透過 Azure 監視器的計量報告,但會如先前所述報告於sys.dm_io_virtual_file_stats()