.net column

.NET開発者のためのブログメディア
データベースの整理

SQL Serverの断片化したインデックスを再構築する方法

2020年07月30日

システムの開発現場では、データベースを導入して運用を行うことがほとんどです。開発時に様々なケースを想定してデータベースを設計しても、本稼働後に仕様変更や追加対応で使い方が変わることは十分にあり得ます。データベースの使い方が変わるとパフォーマンスに影響が出る可能性もあります。その対策として今回は、インデックスを再構築する方法を解説します。

SE
データベースでの処理がリリース当時よりも遅くなっている気がします……データが増えているから遅くなることは普通なのでしょうか?
PL
インデックスの「断片化」が発生している恐れがありますね。そのまま放置するのは良くないですよ。インデックスの再構築をなるべく早く行いましょう!

実行環境
・Microsoft SQL Server 2018

インデックスの断片化とは

毎日稼働しているシステムは、日々テーブルにデータがため込まれていきます。トランザクションテーブルのように最終行にデータが追加されるテーブルもあれば、マスタテーブルのように行の途中にデータを追加、またはインデックスのキー値を変更するテーブルも存在します。

テーブルによっては、データの物理的な順序や論理的な順序がバラバラになることがあり、このことを「断片化」と呼びます。

断片化の状況は、断片化率を見ることで確認可能です。
以下のT-SQLを実行してみましょう。

実行結果
断片化率を調べる

ここでは以下の項目を重点的に確認しましょう。

    • ・index_level

0がリーフレベル、1が中間レベル、2がルートとなります。

    • ・avg_fragmentation_in_percent

各レベルにおける断片化率です。高いほど断片化が進行していることを意味します。

    • ・page_count

各レベルにおけるページ数です。断片化が進行していると、本来必要なページ数よりも多くなります。

    • ・avg_page_space_used_in_percent

各レベルにおける、各ページにどれだけレコードが詰まっているかを示す値です。100%に近いほど読み取り性能が良いことを意味します。

SQL Serverでは、断片化が発生するとデータベースのパフォーマンスは悪くなります。断片化を避けるために行うべきことは、インデックスの再構築もしくは再構成です。

再構築と再構成の違いとは

以下でインデックスの再構築と再構成について、それぞれの概要を紹介します。

再構築

  • ・ひとつのトランザクションでインデックスを再作成します
  • ・キャンセルすると処理はすべてロールバックされます
  • ・インデックスにロックがかかるので、処理中は利用できません

再構成

  • ・処理単位ごと(処理単位はページ)にトランザクションが分割されます
  • ・キャンセルしても途中までの処理は保存されます
  • ・処理中でもインデックスを利用することはできます

インデックスを再構築する方法

SQL Serverではインデックスを再構築する方法が2つあります。

インデックス指定で再構築

インデックスを再構築する命令にALTER INDEX ~ REBUILDが準備されています。
ここではPK_Table_1を再構築してみます。

テーブルごと再構築

あるテーブルのインデックスをまとめて再構築する場合は、ALTER INDEX ALL ~ REBUILDを活用します。インデックスが複数あってもすべて再構築してくれます。

SE
インデックスの再構築って大切なことなのですね。SQL Serverでデータを管理するには断片化の知識が必要なことも分かりました!
PL
最初はデータベースを組み立てるだけで精一杯でしょうが、優れたエンジニアになるためには、こういった断片化などの知識が必要不可欠です。断片化を素早く解消して顧客の信頼を勝ち取りましょう!

データベースのインデックスは常に最適化しましょう

断片化と聞くとすごく難しい印象を受ける方も多いのではないでしょうか。しかし、ここで紹介したように断片化が発生した際は、インデックスを再構築するだけでシステムのパフォーマンスを向上させることが可能です。
データベースの稼働が遅くなると、ユーザーのストレスがたまり、システムの信頼度が低下することにつながります。断片化をなるべく避けるべく、インデックスを再構築する方法は覚えておくことをおすすめします。

>>>SQL Serverの案件を探すならFEnet .NET Navi


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)