追加コスト 0 で行う SQL Server のパフォーマンス改善・ボトルネック解消 その4 | 野良エンジニアの足跡

追加コスト 0 で行う SQL Server のパフォーマンス改善・ボトルネック解消 その4

こんにちは、nagino です。


このテーマも、なんだかんだでその 4 になりました。

が、一番の王道で基礎である手法について言及するのを、すっかり失念していました。


というわけで、今回の手法は、インデックスの再構築・再編成です。


インデックスは木構造をとることでデータアクセスの高速性を得られますが、実体はディスクに書かれたページ単位のデータです。

データの更新や挿入が行われてもデータの論理的な並び順は保証されますが、物理的な並び順は徐々に断片化していきますし、ページ分割によってページあたりのデータ量が少なくなることでディスクアクセスやキャッシュ量が増えて、パフォーマンスが劣化します。

そのため、定期的にインデックスのメンテナンスを行うことで、パフォーマンスの向上が期待できます。

できれば日次で実行しておきたいところです。


インデックスの再編成は、リーフページの物理的な並び順を論理的な並び順と一致させます。

そのためインデックススキャンのパフォーマンスの向上が期待できます。

オンラインで実行でき、また負荷もそれほどではないため、毎晩実行してしまうのも一手です。


インデックスの再構築は、インデックスを作り直します。

こちらはインデックスを使用したシークなどのパフォーマンスも向上しますので効果は大きいですが、代わりに負荷も大きいです。

そのため、システムの負荷が少ない日曜の日中などに行うなど、実行タイミングを考慮する必要があります。

ただ、小規模システムであれば、極端な話ですが日次で実行してしまうのもありです。


一応詳細については以下にまとまっています。

http://msdn.microsoft.com/ja-jp/library/ms189858.aspx


上記では一定の断片化が発生するまでは再構築しなくて良いとありますが、よくある(そして無茶苦茶な)「とにかく最速に」という要求であれば、日次で再構築してしまったほうが良かったりします。

その分、インデックスのメンテナンス中のパフォーマンスや使用制限を検討しないといけなくなりますが、データベースはデータの倉庫ですから、整理整頓しておくことで処理の高速化を図るということですね。