2019年3月13日水曜日

tempdbがSHRINKFILEで圧縮できない

SQL Server2014 StandardEditionにて確認

SHRINKFILEでファイルを圧縮する際に、tempdbが圧縮できなかったケースがあったので覚書

temdbを圧縮するコマンドはこんな感じ。


DBCC SHRINKFILE(tempdb, 0)

ただ、今回は以下のようなエラーが出ました。

DBCC SHRINKFILE ページ N:Nは、作業テーブル ページなので移動できませんでした。
このエラーメッセージで検索してもあまり情報がありません。
で、英文では以下のようなメッセージのようです。

Page N:N could not be moved because it is a work table page.

こちらのメッセージで調べると、クエリプランを再作成が必要だそうです。


DBCC FREEPROCCACHE


を行うことで、一時テーブルのキャッシュがクリアされて圧縮可能となりました。
ただ、FREEPROCCACHEはそれなりにコストがかかる作業かなと思うので、


DBCC FREESYSTEMCACHE (‘Temporary Tables & Table Variables’)


などの方が良いかもしれません。(未調査です)


ちなみに、今回のようにtempdbの圧縮が失敗すると、tempdbの初期サイズが書き換わってしまうそうです。
tempdbが肥大化していた場合、次回のSQLServerの起動に悪影響を与えることもあるそうなので、注意したほうが良さそうです。

【参考URL】
TempDB を圧縮する場合の注意点について