根據預設,SQL Server 2014 的 Service Pack 1 和 SQL Server 2012 的 Service Pack 3 包含此修正程式,您不需要新增任何追蹤旗標即可啟用此修正程式。 若要在 [解決方案] 區段安裝其中一個累積更新後啟用修正程式,您必須將追蹤旗標 1236 新增至啟動參數來啟動 Microsoft SQL Server。
症狀
假設您在包含許多處理器的電腦上執行 Microsoft SQL Server 2014、SQL Server 2012、SQL Server 2008 或 SQL Server 2008 R2 執行個體。 當特定資料庫的鎖定數目 (資源類型 = 資料庫) 超過特定閾值時,您會遇到下列效能問題:
LOCK_HASH執行緒同步鎖定計數會出現較高的值。
注意:如需有關如何監視此執行緒同步鎖定的資訊,請參閱「詳細資訊」一節。
需要資料庫鎖定的查詢或作業需要很長的時間才能完成。 例如,您可能會注意到下列效能延遲:
- SQL Server 登入
- 連結伺服器查詢
- sp_reset_connection
- 交易
注意:若要在指定資料庫中尋找資源類型 = DATABASE) (鎖定清單,請參閱「詳細資訊」一節。 閾值會因環境而異。
解決方式
累積更新資訊
此問題已先在下列 SQL Server 累積更新中修正。
SQL Server 2008 R2 SP2 的累積更新 13 /zh-tw/help/2967540
適用於 SQL Server 2008 SP3 的累積更新 17 /zh-tw/help/2958696
SQL Server 2014 累積更新 1 /zh-tw/help/2931693
SQL Server 2012 SP1 的累積更新 9 /en-us/help/2931078
關於 SQL Server 的累積更新
SQL Server 的每個新累積更新都包含所有 Hotfix 和先前累積更新的所有安全性修正程式。 查看 SQL Server 的最新累積更新:
- 適用於 SQL Server 2008 R2 SP2 的最新累積更新
- SQL Server 2008 SP3 的最新累積更新
- 適用於 SQL Server 2014 的最新累積更新
- 適用於 SQL Server 2012 SP1 的最新累積更新
Hotfix 資訊
Microsoft 提供支援的 Hotfix。 不過,此 Hotfix 僅用來修正本文所述的問題。 僅將此 Hotfix 套用至發生此特定問題的系統。
如果 Hotfix 可供下載,本知識庫文章頂端有「Hotfix 可供下載」一節。 如果未顯示此區段,請提交要求給 Microsoft 客戶服務與支援以取得 Hotfix。
注意: 如果發生其他問題或需要進行任何疑難排解,您可能必須建立另外一個服務要求。 一般的支援費用將適用於不符合此特定 Hotfix 條件的其他支援問題和問題。 如需 Microsoft 客戶服務及支援服務的完整電話號碼清單,或建立個別的服務要求,請造訪下列 Microsoft 網站:
/contactus/?ws=support 注意:「Hotfix 下載可用」表單顯示 Hotfix 可用的語言。 如果您找不到您的語言,是因為該語言沒有 Hotfix。
狀態
Microsoft 已確認這是「適用對象」一節中列出的 Microsoft 產品中的問題。
更多資訊
當應用程式連線至 SQL Server 時,它會先建立資料庫內容。 預設情況下,連線將嘗試在 SH 模式下獲取資料庫鎖定。 當連線停止或資料庫內容在連線存留期內變更時,將會釋放 SH-DATABASE 鎖定。 如果您有許多使用相同資料庫內容的作用中連線,則該特定資料庫可以有許多 DATABASE 資源類型的鎖定。
在具有 16 個或更多 CPU 的電腦上,只有資料表物件使用分割鎖定配置。 不過,資料庫鎖定不會分割。 因此,資料庫鎖定數目越多,SQL Server 取得資料庫鎖定所花費的時間就越長。 大部分應用程式不會遇到此設計所造成的任何問題。 但是一旦數量超過某個閾值,就需要額外的工作和時間來獲得鎖。 雖然每個額外鎖定的成本僅為微秒,但總時間可能會快速增加,因為鎖定雜湊貯體會使用執行緒鎖定來保護。 這會導致額外的 CPU 週期,並等待其他背景工作角色取得鎖定。
此 Hotfix 會在啟動時啟用追蹤旗標 T1236 時引入資料庫鎖定分割。 分割 DATABASE 鎖定,讓鎖定清單的深度在每一個本機分割區中保持可管理。 這大幅最佳化了用來取得 DATABASE 鎖定的存取路徑。
若要監視LOCK_HASH執行緒同步鎖定,您可以使用下列查詢。設定 NOCOUNT 開啟
CREATE TABLE #spinlock_stats ([CaptureTime] datetime,[name] nvarchar (512) ,[collisions] bigint,
[spins] bigint,[spins_per_collision] real,[sleep_time] bigint,[backoffs] int)
DECLARE @counter int = 1
而 100 @counter<
BEGIN
插入至 #spinlock_stats 選取 GETDATE () as “CaptureTime” , * FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
WAITFOR DELAY '00:00:05'
設定 @counter +=1
END
從 #spinlock_stats [CaptureTime] 排序 *
DROP TABLE #spinlock_stats 如需有關診斷和解決 SQL Server 上的執行緒同步鎖定爭用的詳細資訊,請移至下列文件:
診斷和解決 SQL Server 上的執行緒同步鎖定爭用 注意 雖然本文件是針對 SQL Server 2008 R2 所寫,但資訊仍然適用於 SQL Server 2012。
參考資料
如需有關 SQL Server 2012 中追蹤旗標的詳細資訊,請前往下列 TechNet 網站:
SQL Server 2012 中追蹤旗標的相關資訊
如需有關如何尋找 [使用者] 中每個資料庫的資料庫鎖定數目的詳細資訊,請使用下列查詢來計算此值:select Resource_database_id、resource_type、request_mode、request_status,
count (*) 來自 sys.dm_tran_locks 的 'LockCount'
依 Resource_database_id、resource_type、request_mode request_status 分組