クエリに SQL Server 2005 で TokenAndPermUserStore のキャッシュのサイズが大きくなるときに実行を終了するのには時間がかかり

Bug #: 429501 (SQLBUDT)

現象

Microsoft SQL Server 2005 では、以下の現象が発生する可能性があります。

  • 通常、高速に実行するクエリでは、実行を完了するのには長い時間がかかります。

  • SQL Server プロセスの CPU 使用率は、通常よりも。

  • アドホック クエリを実行すると、パフォーマンスの低下が発生した場合は、 sys.dm_exec_requestsまたはsys.dm_os_waiting_tasksの動的管理ビューからクエリを表示します。ただし、クエリは、任意のリソースの待機中には表示されません。

  • TokenAndPermUserStore キャッシュ ストアのサイズは、一定の割合で増加します。

  • 百の順序では、TokenAndPermUserStore のキャッシュ ストアのサイズ (mb 単位)。

  • いくつかの場合は、DBCC FREEPROCCACHE コマンドの実行は、一時的な救済を提供します。

TokenAndPermUserStore キャッシュのサイズを監視するには、次のようなクエリを使用できます。

SELECT SUM(single_pages_kb + multi_pages_kb) AS 
"CurrentSizeOfTokenCache(kb)"
FROM sys.dm_os_memory_clerks
WHERE name = 'TokenAndPermUserStore'

原因

TokenAndPermUserStore キャッシュ ストアでは、次のセキュリティ トークンの種類を保持します。

  • LoginToken

  • TokenPerm

  • UserToken

  • SecContextToken

  • TokenAccessResult。

TokenAccessResult エントリの別のクラスも存在します。65535 のクラスを持つ多くの TokenAccessResult エントリが表示されるため、この問題が発生します。


ランダムの動的なクエリの実行率が高いの SQL Server のインスタンスでは、 sys.dm_os_memory_cache_entriesビューで 65535 のクラスが含まれて TokenAccessResult のエントリの多くを確認します。65535 のクラスを持つ TokenAccessResult のエントリでは、特別なキャッシュ エントリを表します。これらのキャッシュ エントリは、クエリの累積的なアクセス許可のチェックに使用されます。たとえば、次のクエリを実行する可能性があります。

select * 
from t1 join t2 join t3

この例では、SQL Server は、このクエリの累積的なアクセス許可チェックを計算します。このチェックでは、t1、t2、t3 の選択をユーザーが持っているかどうかを決定します。これらの累積的なアクセス許可チェックの結果は、TokenAccessResult エントリに埋め込まれているし、65535 の ID を使用して TokenAndPermUserStore キャッシュ ストアに挿入されます。同じユーザーは、再利用したり、このクエリを複数回実行、SQL Server を再利用する TokenAccessResult キャッシュ エントリに 1 回。

このキャッシュ ストアが増大すると、再利用する既存のエントリを検索するのには時間が増加します。1 つのスレッドは、検索を実行できるように、このキャッシュへのアクセスが制御されます。この現象最終的に原因がクエリのパフォーマンスが低下して、複数の CPU 使用率が発生します。

解決策

Service Pack 情報

この問題を解決するには、SQL Server 2005 の最新の service pack を入手します。詳細については、次の文書番号をクリックして、マイクロソフト サポート技術情報の資料をご参照ください。

913089 SQL Server 2005 の最新の service pack の入手方法
この問題を解決するのには、SQL Server 2005 Service Pack 2 は、アクセス トークンのキャッシュの動作を変更します。既定では、特定のアドホック クエリを再度実行される場合のみ、アドホック クエリの TokenAccessResult セキュリティのキャッシュ エントリがキャッシュされます。

回避策

この問題を回避するには、次の方法の 1 つ以上を使用します。

  • アドホック クエリを明示的にパラメーター化します。

    注:

    • このメソッドでは、アドホック クエリとその計画を効果的に再利用することができます。

    • このメソッドを使用する場合、他のパラメーターとアドホック クエリを実行するたびに TokenAccessResult エントリを作成する必要はありません。

    • この方法では、TokenAndPermUserStore のキャッシュのサイズが妥当な範囲の下にあるままです。

  • ストアド プロシージャ内のアドホック クエリをラップし、アドホック クエリを直接実行するのではなくストアド プロシージャを使用します。


    注:

    • ストアド プロシージャで使用しているステートメントの実行プランがキャッシュされます。

    • ステートメントごとに TokenAccessResult エントリは、実行プランのエントリに関連付けられます。

    • この実行プランには、キャッシュにプロシージャが格納されている限り、ストアド プロシージャを実行するたびには効果的に TokenAccessResult エントリが再利用されます。したがって、TokenAccessResult の新しいエントリを作成する必要はないです。

  • FORCE_PARAMETERIZATION データベース ・ オプションを有効にします。

    注:

    • このメソッドでは、アドホック クエリとその計画を効果的に再利用することができます。

    • このメソッドを使用する場合、他のパラメーターとアドホック クエリを実行するたびに TokenAccessResult エントリを作成する必要はありません。

    • この方法では、TokenAndPermUserStore のキャッシュのサイズが妥当な範囲の下にあるままです。

  • ログインを実行するなどのさまざまなアドホック クエリ サーバーのシステム管理者のグループのメンバーを追加します。

    注:

    • TokenAccessResult のエントリは、sysadmin サーバー グループのメンバーではないログインによって、クエリが実行されたときにのみアドホック クエリに対して作成されます。

    • TokenAccessResult のエントリが作成されないために、この現象は管理しやすいサイズに TokenAndPermUserStore キャッシュのサイズを保持します。

  • TokenAndPermUserStore キャッシュからエントリをフラッシュします。

    注:

    • これを行うには、次のコマンドを実行します。

      DBCC FREESYSTEMCACHE (TokenAndPermUserStore)

    • 理想的には、問題を表示する開始時に、TokenAndPermUserStore ・ キャッシュ ・ サイズのしきい値を監視する実行してください。

    • 次の操作を実行するスケジュールされた SQL Server エージェント ジョブを作成することができます。

      • TokenAndPermUserStore キャッシュのサイズのサイズを確認してください。これを行うには、次のコマンドを実行します。

        SELECT SUM(single_pages_kb + multi_pages_kb) AS 
        "CurrentSizeOfTokenCache(kb)"
        FROM sys.dm_os_memory_clerks
        WHERE name = 'TokenAndPermUserStore'
      • キャッシュ ・ サイズが確認したしきい値よりも大きい場合は、次のコマンドを実行します。

        DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')

関連情報

詳細については、マイクロソフトサポート技術記事を表示する次の資料番号をクリックしてください。

933564の修正: SQL Server 2005 で USERSTORE_TOKENPERM のキャッシュ ストアのメモリの消費量が徐々 に増加が発生します。

SQL Server 2005 Service Pack 3 の TokenAndPermUserStore キャッシュ ストアのクォータをカスタマイズする方法を959823

ヘルプを表示

スキルを磨く
トレーニングの探索
新機能を最初に入手
Microsoft Insider に参加する

この情報は役に立ちましたか?

フィードバックをお送りいただきありがとうございます!

フィードバックをお寄せいただき、ありがとうございます。Office サポートの担当者におつなぎいたします。

×