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


13

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%以上を占有しています。これは、メモリ待機が時々発生するため、懸念事項です。さらに、週末にかけて、メモリ不足で待機時間が蓄積されるため、4時間続くルーチンDBCC CHECKDBを強制終了する必要がありました(PHYSICAL_ONLYをオンにするとエラーなしで即座に完了しました)。

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

メモリ消費グラフ メモリ消費量チャート

コメント/回答から更新

走るとき

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へのエンジンバージョンのアップグレードが利用可能です。自動マイナーバージョンアップグレードに設定されていますが、最新の状態に更新されていないようです。今週末に再起動してインストールし、役立つかどうかを確認します。

回答:


5

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

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

少し賢くなったメモリを使用するかどうかは時間が経てばわかりますが、少なくとも今は再び膨らみすぎた場合にリセットする方法があります。


1
それでも、SQLCPを頻繁にクリアせず、根本原因を突き止めることをお勧めします。
シャンキー

Entity Frameworkと、ほぼすべてのユーザーがほぼすべてのクエリを実行できるようにするカスタムレポート機能により、多くのアドホッククエリが作成されます。それらを単にパージする方法があったり、そもそもキャッシュされないように指示したりする方法があれば、それが役立つかもしれません。これまでのところ、SP1のインストール以降、プランキャッシュは約5.8GBで推移しています。
プロのサウンディング名

有効にしましたかOptimize for Ad-Hoc Workload。38Gと比較して、現在5 GIを取っている場合、これはワークロードを考慮することについて心配するものではないと考えています
-Shanky

はい、アドホックワークロード向けに最適化が設定されています(上記の質問を参照)
Professional Sounding Name

1
この同じ問題は13.0.4001.0でも見られました。procキャッシュをクリアするためにSQLをバウンスする必要がありました。何もコンパイルされていませんでしたが、procキャッシュは「スタック」しており、何を試みてもクリアされませんでした。SQLをバウンスしてから再び起こるのを見たことはありませんが、何らかのメモリリークやバグがあるのではないかと思います。
GoodwinSQL

3

必要条件

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)

制限/制限

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

ここで概要:

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

  • bulkadmin
  • dbcreator
  • diskadmin
  • securityadmin
  • serveradmin
  • sysadmin

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

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

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

その他の資料

ブレント・オザーは、「SQL Server RDS」という記事を書きました。

多くのDBCCコマンドはまったく機能せずDBCC DBINFODBCC LOGINFO明示的に拒否されました。しかし、私はDBCC FREEPROCCACHE自分が望むだけ頻繁に走ることができることを発見しました。

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

Amazonサポート

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


これに基づいて詳細を記載した質問を更新しました。思慮深く詳細な対応ありがとうございます。私はRDSの他の項目でパーミッションの問題に遭遇しましたが、これはサポートされるべきです。ここであまりアクティビティを受け取らない場合は、今日中にAmazonサポートに連絡します。RDSの問題というよりもSQL Serverの問題のように思えたので、この素晴らしいコミュニティと比較して、サポートの知識や具体性がどの程度かはわかりません!
プロのサウンディング名

1
フィードバックに感謝します。何も機能していないように見えるAmazonまたはMicrosoftのチケットを開くことをお勧めします。そして再び、それはバグまたは機能である可能性があります(...による制限)。
ジョン別名hot2use
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.