最近、ログドライブがいっぱいになるという警告を受けた後、tempdbログを誤ってほぼ0に縮小しました。遅くなると言われています。誰かがそれがなぜ遅くなるのかを説明できますか?
そのことを言った人に、少なくともパフォーマンスを低下させると思う理由を少なくとも聞くようにお願いします。
1つの理由は、TLOGが0に留まらないことです。TLOGは非常に小さくなったので、自動拡張が設定されていると思います。構成方法に応じて、毎回一定量、または毎回サイズのパーセンテージが増加します。したがって、トランザクションログを拡張する必要があるたびに、SQL Serverは処理を実行する必要があります。
主な理由は、以下の最初のリンクで詳しく説明されています。
トランザクションログの自動拡張メカニズムが作動すると、SQL Serveralwaysは、ファイルの最後に追加される新しいチャンクをゼロ初期化する必要があります。 SQL Serverインスタンスがインスタントファイル初期化の権限で実行されているかどうかは関係ありません。トランザクションログは常にゼロに初期化されています。
より意味のあるのは、このファイル専用のドライブを設定し、LOGファイルをドライブのサイズに設定することです。それが再び成長するだけであることがわかっているのに、サイズが同じままで、断片化を引き起こすなど、0に縮小するのはなぜですか?
tempdb
は、単純な復旧モデルを使用し、チェックポイントが発行されるたびにログをクリアします。これは、ログの使用率が70%に達すると自動的に発生し、tempdb
の場合、ダーティtempdb
ページがディスクに強制的に書き込まれることはありません。 Paul Randallのこの投稿を参照してください。 VLFは、チェックポイント中も可能であれば非アクティブになります。ログを圧縮すると、VLFが削除されます。
2つの既存の良い答えに追加するもう1つのポイント。
Tempdbの最適なサイズを決定したら、手動でそのサイズに設定する必要があります。システムにパッチを適用するときにSQLが毎月再起動するときにこれが行われない場合(毎月のパッチを適用すると想定)、システムはより小さいサイズにリセットされ、拡大する必要があるため、他の回答で述べたパフォーマンスの問題が発生します。
USE [master]
GO
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'temp2', SIZE = 2560000KB )
GO
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 2560000KB )
GO
また、適切な自動拡張設定が提供されていることを確認してください。 MB単位の値である必要があり、パーセンテージは使用しないでください。
トランザクションの結果としてファイルが大きくなると、ファイルが大きくなる間、そのトランザクションは一時停止されます。ファイルを使用する他のトランザクションも影響を受ける可能性があります。これは、ファイルを拡張することでファイルシステムに配置される負担に追加されますが、ファイルを分離することで解決する場合もあります。
特に、ログファイルは、使用する前に拡張してゼロにする必要があります。ただし、データファイルの即時ファイル初期化を有効にすることができます。
理想的には、tempdbを必要なサイズまで拡張し、そのままにしておく必要がありますが、エラーの原因となったトランザクションが拡張の原因である場合は、通常のサイズに縮小しても問題ありません。しかし、それを0に縮小することは、実行する最良のアクションではありませんでした。