SE の雑記

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

SQL Server 2014 の遅延持続性による WRITELOG 事象への影響

without comments

SQL Server 2014 では 遅延持続性 (低速コミット)  の機能が追加されています。
トランザクションの持続性の制御

遅延持続性については全エディションで使用できる機能となっています。
SQL Server 2014 の各エディションがサポートする機能

SQL Server の通常の動作としては WAL (先行ログ書き込み) により、データファイルの書き込みより、ログレコードの書き込みが優先され、トランザクションの変更履歴の確定が優先されることになります。
トランザクションを完了するためには、ログレコードがログバッファからディスクに書き込まれデータが永続化される完全持続性が担保されることが必須となります。
# DDL 系の操作についてはコミット→ロールバックをした場合、ディスクには書き込まれない等の動きがあったはずでこの辺もなかなか奥が深いですが。あと 錦の鬼 って強そうですね。

SQL Server 2014 ではデータベースのオプションとして遅延持続性の設定が追加されました。
image

デフォルトの設定では [Disabled] (遅延持続性を無効にし、完全持続性 (従来までの動作) 使用する) が設定されており、[Allowed] [Forced] の設定を使用することができます。

[Disabled] の状態では、遅延持続性を使用することはできませんが、[Allowed] に設定することで利用を許可、[Forced] にすることで遅延持続性を強制することができます。

遅延持続性を有効にすることで、ログバッファー (メモリ) にログが書き込みが完了したタイミングでトランザクションを完了することができるようになります。

完全持続性の場合は、ログバッファーからログファイルに書き込みが終了し、変更内容が永続化されたタイミングでトランザクションが完了するためログファイルへのディスク I/O が発生し、この I/O がボトルネックになることがありました。

ログファイルの書き込み負荷を減らすための方法としては、ログファイルを格納しているディスクの本数を増やすのが一般的な方法でしたが、遅延持続性が実装されたことにより、データの永続性と引き換えにトランザクション実行時のログファイルの書き込みによる処理時間の遅延を解消することができるようになりました。

待ち事象としては WRITELOG 待ち事象が高い場合などに遅延持続性が効果的に働く可能性があります。

image
image

上記の画像は、上が完全持続性 / 下が遅延持続性を [Forced] で実行した際の WRITELOG 事象の待ち時間になります。
遅延持続性を設定した場合は、WRITELOG 事象を抑えることができるようになります。

データの永続化するタイミングとの引き換えでの設定とはなりますが、ログの書き込みのオーバーヘッドを減らすための手法として覚えておきたいですね。

sys.sp_flush_log を実行することで、ログをフラッシュすることができるので、遅延持続性を使用している場合の永続化のタイミングを意識した処理設計をするのを意識したいものです。

Written by Masayuki.Ozawa

6月 17th, 2014 at 6:14 pm

Posted in SQL Server

Tagged with ,

Leave a Reply