web-dev-qa-db-ja.com

DBCC FREEPROCCACHEもDBCC FREESYSTEMCACHE( 'SQL Plans')もCACHESTORE_SQLCPメモリを解放するために何もしません

CACHESTORE_SQLCP SQLプランは、数日後に> 38 GBを消費します。

「アドホックワークロード用に最適化」オプションをオンにして実行しています。 (Entity Frameworkとカスタムレポートは多くのアドホックを作成します!)

マルチAZミラーリングを使用したAWS RDS上のSQL Server 2016 SE 3.00.2164.0.v1

私が走ると:

_DBCC FREESYSTEMCACHE('SQL Plans');
_

または

_DBCC FREEPROCCACHE
_

または

_DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL
_

または

_DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;
_

それはそれをクリアしていないようです:

_SELECT TOP 1 type, name, pages_kb FROM sys.dm_os_memory_clerks ORDER BY pages_kb  desc

type                name        pages_kb
CACHESTORE_SQLCP    SQL Plans   38321048
_

クエリストアを有効にして実行していたのですが、クエリストアを無効にして、それが何かを妨げているかどうかを確認しました。

本当に変なのも

_SELECT COUNT(*) FROM sys.dm_exec_cached_plans
_

1〜3程度(現在実行中のクエリしか表示されないように見えます)、すべてのメモリは予約されていますが、何も消去しようとする前でも、何が欠けていますか?

CACHESTORE_SQLCPが使用可能なすべてのメモリの60%以上を占めています。これは、時々発生するメモリ待機があるため、問題になります。さらに、メモリ不足のため待機がスタックされていたため(PHYSICAL_ONLYをオンにしてエラーなしで即座に完了したため)、週末に4時間続くルーチンDBCC CHECKDBを強制終了する必要がありました。

このメモリを再利用する方法はありますか(毎晩の再起動以外!)?

Memory Consumption GraphMemory Consumption Chart

コメント/回答から更新

私が走るとき

_SELECT * FROM sys.fn_my_permissions(NULL,NULL)
_

私は得る

_entity_name subentity_name  permission_name
server      CONNECT SQL
server      CREATE ANY DATABASE
server      ALTER ANY LOGIN
server      ALTER ANY LINKED SERVER
server      ALTER ANY CONNECTION
server      ALTER TRACE
server      VIEW ANY DATABASE
server      VIEW ANY DEFINITION
server      VIEW SERVER STATE
server      ALTER SERVER STATE
server      CREATE SERVER ROLE
server      ALTER ANY SERVER ROLE
_

必要な_ALTER SERVER STATE_権限が含まれています。

_DBCC FREEPROCCACHE_の出力は

DBCCの実行が完了しました。 DBCCがエラーメッセージを出力した場合は、システム管理者に連絡してください。

これが標準メッセージです。 RDSがサポートしていない他のDBCC関数は、アクセス許可に関するエラーメッセージを表示します。

(1日後、それを再度実行した後も、SQLプランは38,321,280 kbです)

コメント/回答から更新

_SELECT pool_id, name, cache_memory_kb, compile_memory_kb FROM sys.dm_resource_governor_resource_pools
_

出力:

_pool_id name    cache_memory_kb  compile_memory_kb
1   internal    38368408         1168080
_

DBCC FREEPROCCACHE ('internal')は何も異なることはありません

更新

SQLエラーログは毎回次のログを記録します。

_2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'SQL Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Bound Trees' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.
_

更新

RDSでは、13.00.2164.0.v1から13.00.4422.0.v1へのエンジンバージョンのアップグレードが利用可能です。自動マイナーバージョンアップグレードに設定されていますが、最新に更新されているようには見えません。今週末、再起動してインストールし、効果があるかどうかを確認します。

13.00.4422.0.v1(SQL Server 2016 SP1)にアップグレードして再起動しました。

これまでのところ、DBCC FREESYSTEMCACHE('SQL Plans');コマンドを使用してSQLプランのメモリをクリアできます。

メモリが少し賢く使用されているかどうかを確認する時が来ますが、少なくとも今度は、肥大化した場合にリセットする方法があります。

必要条件

DBCC FREEPROCCACHEまたはDBCC FREESYSTEMCACHEを実行するには、アカウントに権限ALTER SERVER STATEが必要です。

参考文献

リソースガバナー

AWS RDSはリソースガバナー設定を許可しますか?はいの場合、構文は次のとおりです。

DBCC FREEPROCCACHE ('<pool_name>'). 

次のプールがあるかどうかを確認します。

SELECT * FROM sys.dm_resource_governor_resource_pools

権限の確認

次のコマンドを実行して、これらの権限があるかどうかを確認します。

SELECT * FROM sys.fn_my_permissions(NULL,NULL)

制限/制限

記事 Amazon RDS上のMicrosoft SQL Server の章に記載されているように、AWS RDSインスタンスの管理者に付与されるアクセス許可にはいくつかの制限があります Microsoft SQL Serverのセキュリティ

ここで概要:

次のサーバーレベルのロールは、現在Amazon RDSでは使用できません。

  • bulkadmin
  • dbcreator
  • diskadmin
  • securityadmin
  • serveradmin
  • システム管理者

次のサーバーレベルの権限は、SQL Server DBインスタンスでは使用できません。

  • 管理者の一括操作
  • 資格情報を変更
  • イベント通知の変更
  • イベントセッションの変更
  • 任意のサーバー監査を変更
  • リソースを変更
  • ALTER SETTINGS(DBパラメーターグループAPIを使用してパラメーターを変更できます。詳細については、「DBパラメーターグループの操作」を参照してください。
  • サーバーの認証
  • CONTROL_SERVER
  • DDLイベント通知の作成
  • エンドポイントを作成
  • トレースイベント通知の作成
  • 外部アクセスアセンブリ
  • SHUTDOWN(代わりにRDS再起動オプションを使用できます)
  • UNSAFEアセンブリ
  • ALTER ANY AVAILABILITY GROUP(SQL Server 2012のみ)
  • 可用性グループの作成(SQL Server 2012のみ)

これらの制限/制限は、ドキュメントの公開後に変更された可能性があります。

その他の資料

ブレントオザーは記事「 SQL Server RDS 」を書いており、彼は次のように述べています...

多くのDBCCコマンドはまったく機能しません– DBCC DBINFOおよびDBCC LOGINFOは明示的に拒否されました。しかし、私はDBCC FREEPROCCACHEを好きなだけ実行できることを発見しました。

これらの制限は時間の経過とともに変化する可能性があることに注意してください–新しい機能は定期的に追加されます。

Amazonサポート

アカウントに必要な権限があり、キャッシュを解放できない場合は、Amazonでサポートチケットを開くことができます。

3