既定では、SQL Server 2014 の Service Pack 1 と SQL Server 2012 の Service Pack 3 にはこの修正プログラムが含まれており、修正を有効にするためにトレース フラグを追加する必要はありません。 [解決策] セクションの累積的な更新プログラムの 1 つをインストールした後で修正を有効にするには、スタートアップ パラメーターにトレース フラグ 1236 を追加して Microsoft SQL Serverを開始する必要があります。
現象
多数のプロセッサを含むコンピューターで、Microsoft SQL Server 2014、SQL Server 2012、SQL Server 2008、または SQL Server 2008 R2 のインスタンスを実行することを想定しています。 特定のデータベースのロックの数 (リソースの種類 = DATABASE) が特定のしきい値を超えると、次のパフォーマンスの問題が発生します。
昇格された値は、LOCK_HASHスピンロック数に対して発生します。
注 このスピンロックを監視する方法については、「詳細情報」セクションを参照してください。
データベース ロックを必要とするクエリまたは操作は、完了するまでに長い時間がかかります。 たとえば、次のパフォーマンスの遅延が発生する場合があります。
- ログインのSQL Server
- リンク サーバー クエリ
- sp_reset_connection
- 取引
注 特定のデータベース上のロックの一覧 (リソースの種類 = DATABASE) を見つけるには、「詳細情報」セクションを参照してください。 しきい値は環境によって異なります。
解決策
累積的な更新プログラムの情報
この問題は、SQL Serverの次の累積的な更新プログラムで最初に修正されました。
SQL Server 2008 R2 SP2 /en-us/help/2967540 の累積的な更新プログラム 13
SQL Server 2008 SP3 /en-us/help/2958696 の累積的な更新プログラム 17
SQL Server 2014 /en-us/help/2931693 の累積的な更新プログラム 1
SQL Server 2012 SP1 /en-us/help/2931078 の累積的な更新プログラム 9
SQL Server 用の累積的な更新プログラムについて
SQL Serverの各新しい累積的な更新プログラムには、すべての修正プログラムと、以前の累積的な更新プログラムに含まれていたすべてのセキュリティ修正プログラムが含まれています。 SQL Serverの最新の累積的な更新プログラムを確認してください。
- SQL Server 2008 R2 SP2 の最新の累積的な更新プログラム
- SQL Server 2008 SP3 の最新の累積的な更新プログラム
- SQL Server 2014 の最新の累積的な更新プログラム
- SQL Server 2012 SP1 の最新の累積的な更新プログラム
修正プログラムの情報
マイクロソフトでは、この問題を修正する修正プログラムを提供しています。 ただし、この修正プログラムは、ここで説明する問題のみを修正することを目的としたものです。 この修正プログラムは、ここで説明する問題が発生しているシステムにのみ適用してください。
修正プログラムがダウンロード可能な場合は、このサポート技術情報の記事の上部に 「修正プログラムのダウンロード」セクションがあります。 このセクションが表示されていない場合は、Microsoft カスタマー サービス & サポート にリクエストを送信し、修正プログラムを入手してください。
注 追加の問題が発生した場合、またはトラブルシューティングが必要な場合は、別のサービス要求を作成する必要がある場合があります。 通常のサポート コストは、この特定の修正プログラムに該当しない追加のサポートの質問や問題に適用されます。 マイクロソフト カスタマー サービス サポートの電話番号一覧を参照、または別のサービス リクエストを作成するには、次のマイクロソフト Web サイトを参照してください。
http://support.microsoft.com/contactus/?ws=support メモ "修正プログラムのダウンロードが可能" フォームには、修正プログラムが利用可能な言語が表示されます。 使用している言語が表示されない場合は、その言語の修正プログラムが存在しないことになります。
状態
Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。
追加情報
アプリケーションがSQL Serverへの接続を確立すると、最初にデータベース コンテキストが確立されます。 既定では、接続は SH モードで DATABASE ロックを取得しようとします。 接続が停止するか、接続の有効期間中にデータベース コンテキストが変更されると、SH-DATABASE ロックが解放されます。 同じデータベース コンテキストを使用するアクティブな接続が多数ある場合は、その特定のデータベースに対して DATABASE リソースの種類の多くのロックを設定できます。
16 個以上の CPU を持つコンピューターでは、テーブル オブジェクトのみがパーティション ロック スキームを使用します。 ただし、データベース ロックはパーティション分割されません。 そのため、データベース ロックの数が多いほど、SQL Serverがデータベースのロックを取得するのにかかる時間が長くなります。 ほとんどのアプリケーションでは、この設計によって発生する問題は発生しません。 ただし、数が特定のしきい値を超えるとすぐに、ロックを取得するために追加の作業時間と時間が必要になります。 コストは追加のロックごとにわずかマイクロ秒ですが、ロック ハッシュ バケットはスピンロックを使用して保護されるため、合計時間が短縮される可能性があります。 これにより、追加の CPU サイクルが発生し、追加のワーカーがロックを取得するまで待機します。
この修正プログラムでは、起動時にトレース フラグ T1236 が有効になっている場合に、DATABASE ロック パーティション分割が導入されます。 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
WHILE @counter< 100
BEGIN
INSERT INTO #spinlock_stats SELECT GETDATE() を "CaptureTime" として 、* FROM sys.dm_os_spinlock_stats WHERE [name] = 'LOCK_HASH'
WAITFOR DELAY '00:00:05'
SET @counter +=1
End
SELECT * FROM #spinlock_stats ORDER BY [CaptureTime]
DROP TABLE #spinlock_stats SQL Serverでのスピンロック競合の診断と解決の詳細については、次のドキュメントを参照してください。
SQL Serverでのスピンロックの競合の診断と解決 注 このドキュメントは、SQL Server 2008 R2 用に記述されていますが、この情報は引き続き SQL Server 2012 に適用されます。
参考資料
SQL Server 2012 のトレース フラグの詳細については、次の TechNet Web サイトを参照してください。
SQL Server 2012 のトレース フラグに関する情報
データベースごとにユーザーのデータベース ロックの数を検索する方法の詳細については、次のクエリを使用して、この値を計算します。Resource_database_id、resource_type、request_mode、request_status、
count (*) 'LockCount' from sys.dm_tran_locks
グループ化:Resource_database_id、resource_type、request_mode、request_status