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’) |
アドホッククエリが多いシステムでは、定期的に Sql Plans をクリアすることでプランキャッシュの肥大化を抑えることができます。
ただし、Sql Plans にはパラメータ化されたクエリが含まれていますので、アドホッククエリとパラメータ化クエリを使用している場合には両方のクエリをクリアしてしまうという問題はありますが。
# アドホッククエリが大量に発行される場合は optimize for ad hoc workloads を有効にしスタブプランをキャッシュさせる方法もありますが。
プランキャッシュ周りの勉強が足りていないのでもう少しスキルを補填したいと思う今日この頃です。