Query-Performance

是否可以在只讀可用性組輔助上使用未送出的讀取隔離級別?

  • February 1, 2022

我們在 SQL 2019 企業版中使用可用性組。我們正在使用企業功能允許 AG 輔助節點處於只讀模式,然後通過使用ApplicationIntent=ReadOnly參數連接到偵聽器來對輔助節點執行報告查詢。

出於鎖定和性能原因,我們有一些Read Uncommitted在主伺服器上使用隔離級別執行的查詢。

似乎在輔助節點上,所有隔離級別都轉換為 RCSI,而不管指定的鎖定/隔離級別如何——大概是因為沒有可能阻止 AG 同步的鎖是必不可少的。

是否可以在輔助節點上以未送出的讀取方式執行查詢,這可能還可以確保沒有鎖定,但是,在某些情況下可以執行得更好,或者對於只讀輔助節點上的查詢,它總是必須是 RCSI?

bzzt

Read Uncommitted/NOLOCK並不意味著您的查詢不佔用鎖,這意味著您的查詢忽略其他查詢佔用的鎖。這些提示確實應該被稱為 NORESPECT。目前的命名非常具有誤導性。它們使您可以返回臟讀。

此隔離級別下的查詢仍將採用模式穩定性鎖,就像任何其他讀取查詢一樣。

一個更簡潔的實現是 RCSI,它為您提供目前被修改查詢鎖定的行的最後一個已知良好版本,而不是可能從它們的執行中數據返回數據。

為了回答您的問題,通常本地查詢提示將覆蓋數據庫級別的設置,例如Read Committed Snapshot IsolationSnapshot Isolation。但即使是查詢級別的鎖定提示也會被針對可讀輔助節點的查詢忽略:

將只讀工作負載解除安裝到 Always On 可用性組的輔助副本

對輔助數據庫執行的所有查詢都會自動映射到快照隔離事務級別,即使顯式設置了其他事務隔離級別也是如此。此外,所有鎖定提示都將被忽略。這消除了讀取器/寫入器的爭用。

如果您已經在使用這些行版本控制隔離級別中的一個或兩個,那麼在邊緣情況之外應該沒有任何理由使用未送出讀/NOLOCK。

引用自:https://dba.stackexchange.com/questions/306861