SQLServerのインデックスとは ~ その2 効果的なインデックスの作り方① 検索条件に注目!

DB

データベースのインデックスを勉強してみよう。ということで、前回はインデックスについて簡単に触れてみました。

今回からは2回に渡ってインデックスの作り方を確認していきます。
1回目はインデックスを作る際に「検索条件に注目してみよう!」ということで進めていきます。

おさらい

前回の記事で、データベースのインデックスとは、
 「テーブルの中の列に対して、列の値を持つ行の場所情報を保持したもの」
 「テーブルからデータを検索する際に効果を発揮する」
と説明しました。
では、実際にインデックスを作成しよう。と考えた場合、どのようなインデックスを作成すると良いでしょうか?

それは、
 「よく使われるようにインデックスを作成する」
もしくは、
 「検索効率がUPするようにインデックスを作成する」
ということになります。
※別の観点も当然ありますが、インデックスを使ってみるという観点では、直感的でわかりやすいのではないでしょうか

「よく使われるようにインデックスを作成する」

例えば、あるECサイトを運営していて、集客を分析する場合を考えてみます。
これまでの購入者名簿は入手しているとして、その中からどのような項目や条件に着目して情報を得たいでしょうか?

  • 購入者の居住地別に傾向を知りたいので、居住地別に仕訳したい
  • 購入者の年代別に傾向を知りたいので、年代別に仕訳したい
  • 月別の売上傾向を知りたいので、購入月別に仕訳したい

色々とあるでしょう。もし戦略的に地域をターゲットとしている場合、購入者名簿の居住地欄に着目することが多くなるでしょう。例えばこんな風にです。

  • 「xx県居住の購入者のリストを作成したい」
  • 「九州地区の購入者のリストを作成したい」

その場合、購入者名簿を居住地別にグループ分けして、対象の購入者を探す場合に高頻度で使用することになります。別に性別別にグループ分けした結果があっても、居住地別の方がよく使われることでしょう。

データベースのインデックスも同様です。データを取得する際によく使われるようにインデックスを作成することで結果的に検索効率がUPし、インデックスの効果が得られます。

「検索速度がUPするようにインデックスを作成する」

もっと直接的に、検索速度がUPするように狙ってインデックスを作成することもあります。使用頻度は多くないけど、半年に1回は行うような棚卸し作業で、1日掛かっている作業を半日で終わらせることができるようなインデックスを作成する。といった具合です。

検索条件に注目するとは?

今回インデックスを作成する際のポイントとしている、「検索条件に注目する」というのは、「よく使われるようにインデックスを作成する」という観点でのポイントという色合いが強いものとなります。業務システムでよくある機能として、情報の検索・一覧表示というものがあります。扱いたい情報に対して、検索条件を指定して条件に合致した情報をUI上に表示する。というものです。普段使うアプリでも検索機能は一般的なので馴染みがあると思います。

ここで、検索条件に指定されている項目というのは、当たり前ですが条件を指定するとその項目を対象に指定された条件で情報が検索されます。ということは、扱われる情報側から見れば、
 「検索条件に設定された項目で検索される可能性が高い」
と言えます。ですから、
 「検索条件が指定された場合に使用されるインデックスを作成すると効果的」
ということになります。

では、実際にインデックスを作成してみて、その効果を確認してみましょう。

実践 ~ インデックスを作成してみる

今回インデックスの効果を試してみるテーブルは、メンバーデータが格納されているメンバーテーブル(物理名:T_MEMBER)で、以下のカラムが存在しています。

  • メンバーID
  • 氏名
  • 居住地
  • 性別
  • 年齢
  • 生年月日

「居住地」と「年齢」が検索条件に指定されるとして、この2項目それぞれにインデックスを作成します。

CREATE INDEX IDX1_AREA ON dbo.T_MEMBER (AREA);
CREATE INDEX IDX2_AGE ON dbo.T_MEMBER (AGE);

さて、効果はあるのでしょうか?以下について実行プランを比較してみましょう。

  • インデックスなし、「居住地」条件指定
  • インデックスなし、「年齢」条件指定
  • インデックスあり、「居住地」条件指定
  • インデックスあり、「年齢」条件指定
インデックスなし

インデックスがない状態での実行プランは以下となりました。

インデックスなし、「居住地」条件指定
インデックスなし、「年齢」条件指定
インデックスあり

さぁ、インデックスを作成した状態での検索結果です~。

インデックスあり、「居住地」条件指定
インデックスあり、「年齢」条件指定

実行結果より、インデックスが使用されて検索にかかるコストが少なくなっていることがわかります。

まとめ

今回はどのようにインデックスを作成すればよいか?について、「検索条件に注目」する観点でその効果を確認しました。実際にインデックスを有効に活用するためには、まだまだ知っておかなければならない点があるのですが、それは中級者以上のレベルです。ですから私も含めたインデックス初心者はインデックスの効果が確認できたということで今回を終えましょう(笑)
次回は、検索条件以外にもインデックス作成を検討するポイントについて考えていきます。
※中級者レベル以上の話も、将来的にやっていきますので、まだまだお付き合いくださいね。

コメント

タイトルとURLをコピーしました