こんにちは、Habr! モニカ・ラスブンによる記事「VLFs-The Forgotten Foe」の翻訳を紹介します。
トランザクションログにある仮想ログファイル(VLF)の数を確認するのは何人ですか?
今、コンサルタントとして働いていると、データベース管理者はこれを無視することが多いと思います。 これは保守が容易な作業ではありませんが、多くの人はその方法を知りません。 このデータを保存すると、起動時だけでなく、挿入/更新/削除、およびバックアップ/復元操作中のパフォーマンスを向上させることができます。 SQL Serverは、適切なサイズのより少ない仮想ログファイルで最適に機能します。 これをサーバーに追加することを強くお勧めします。
VLFとは何ですか?
各トランザクションログは、仮想ログファイル(VLF)と呼ばれる小さなセグメントで構成されています。 新しいセグメントで成長イベントが発生するたびに、トランザクションログファイルの最後に仮想ログファイルが作成されます。 大量のVLFは速度を低下させる可能性があります。
VLFの成長の理由は何ですか?
トランザクションによりログファイルのサイズが強制的に大きくなるため、ログファイルのサイズが正しくない場合や自動拡張の設定により、多数のVLFが発生する可能性があります。 各イベントは、ログファイルにVLFを追加します。 組み合わせてイベントが頻繁に発生するほど、より多くのVLFがトランザクションログに記録されます。
例
デフォルトのログを1 MB増やすと、数千のVLFを取得し、ログを1 GB増やすことができます。 MSDNには、トランザクションログがどのように機能するかについての優れた説明がありますので、読むことをお勧めします。
ログファイルのVLFファイルの数を知るにはどうすればよいですか?
ログファイルに含まれるVLFの量を理解するのは非常に簡単です。 検索するデータベースのコンテキストにいることを確認してください。 私の場合、これはTEMPDBであり、DBCC LOGINFOコマンドを実行します。
USE tempdb DBCC LOGINFO
クエリは、このデータベース用に作成されたすべてのLSNのセットを返します。これらの行のCOUNTは、所有しているVLFの量です。
T-SQLでこれを理解する方法はたくさんありますので、覚えておいてください。 すべてのデータベースをロールスルーし、それぞれのレコードの数を示すものを作成します。 インターネットには多くの便利な例があります。
VLFの量は、理想的には100以下である必要があり、上記のすべてを考慮する必要があります。
*新しいDMV(
SQL Serverの動的管理ビューと関数を使用 )。VLF値sys.dm_db_log_stats(database_id)を取得するさらに簡単な方法を提供します。
SELECT name AS 'Database Name', total_vlf_count AS 'VLF count' FROM sys.databases AS s CROSS APPLY sys.dm_db_log_stats(s.database_id) WHERE total_vlf_count > 100;
修正方法
これらのトランザクションログファイルは、VLFが2つになるまで縮小し、現在のサイズに拡張する必要があります。
- DBCC SHRINKFILEを使用して縮小を実行する
SHRINKFILE (N'Log_Logical_Name_Here', 0, TRUNCATEONLY);
- 環境に適した増分でログを復元します。 ただし、ファイルが8 GBを超える場合は、ブロックサイズを8000 MBに増やすことをお勧めします。 増分の値は、自動的に低い値に設定されるはずです。 これらの値がどうあるべきかについて確立されたルールはありません。環境に最適なものを見つけるために多くの試行錯誤が必要になる場合があります。
USE[master] GO ALTER DATABASE[tempdb] MODIFY FILE(NAME = N 'tempdev', SIZE = 8192000 KB) GO
ご注意 ログの増加はパフォーマンスヒットにつながり、トランザクションをブロックする可能性があります;メンテナンス中にこれを行ってください。
それはとても簡単です、今あなたのファイルを見てみましょう。 あなたが見つけたものに驚くかもしれません。