SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

プランキャッシュの一部分のみをクリアする

leave a comment

QL Server のプランキャッシュですが、用途に応じてプランキャッシュが変わってきます。
パフォーマンスモニターで見えるものとしては、SQL Server の Plan Cache オブジェクト が該当し、Plan Cache のインスタントしては以下の種類があります。

  • Sql Plans :
  • Object Plans
  • Bound Trees
  • Extended Stored Procedures
  • Temporary Tables & Table Variables

アドホッククエリやパラメータ化されたクエリは Sqllans、ストアドプロシージャに関しては Object Plans に格納されています。

パラメータ化されたクエリを多用している場合は問題ないのですが、アドホッククエリを多用している場合は Sql Plans のサイズが肥大化することがあります。

プランキャッシュをクリアする方法としては、

があり、BOL ではプール名を指定してキャッシュをクリアする方法等が記載されています。

最近知ったのですが DBCC FREESYSTEMCACHE はプール名のほかに Plan Cache のインスタンスを指定することもできます。

具体的には以下のようなクエリですね。

DBCC FREESYSTEMCACHE (‘Sql Plans’)
DBCC FREESYSTEMCACHE (‘Object Plans’)
DBCC FREESYSTEMCACHE (‘Bound Trees’)
DBCC FREESYSTEMCACHE (‘Extended Stored Procedures’)
DBCC FREESYSTEMCACHE (‘Temporary Tables & Table Variables’)

 

アドホッククエリが多いシステムでは、定期的に Sql Plans をクリアすることでプランキャッシュの肥大化を抑えることができます。
ただし、Sql Plans にはパラメータ化されたクエリが含まれていますので、アドホッククエリとパラメータ化クエリを使用している場合には両方のクエリをクリアしてしまうという問題はありますが。
# アドホッククエリが大量に発行される場合は optimize for ad hoc workloads を有効にしスタブプランをキャッシュさせる方法もありますが。

プランキャッシュ周りの勉強が足りていないのでもう少しスキルを補填したいと思う今日この頃です。

Share

Written by Masayuki.Ozawa

1月 29th, 2013 at 11:13 am

Posted in SQL Server

Tagged with

Leave a Reply