データベースのパフォーマンスを高める統計情報

はじめに
ITとは「情報技術」のことを指します。IT関連のあらゆるテクノロジーは、情報つまりは”データ”を、より効果的に扱うための手段だと言えます。
それだけに、データはシステムの中心にある最も重要な存在だといっても過言ではありません。そして、そのデータを管理し、活用するための土台となるのがデータベース(DB)です。
この記事は、データベースについて学んだことを、自分なりに整理した備忘録です。
同じように勉強している方の参考にもなれば嬉しいです。
統計情報とは
統計情報は、テーブルのデータ件数や、列に含まれる値の種類・分布などをまとめた情報です。
イメージとしては、カーナビを思い浮かべてもらうとわかりやすいと思います。カーナビは、地図や混雑状況、工事の有無などの情報をもとに、目的地までの複数の行き方から適切なルートを選びます。データベースでもこれと同じようなことを行っていて、DBMSが統計情報をもとに、SQLをどのような方法で実行すると効率がよいかを判断しています。

「インデックス」がデータを効率よく探すための仕組みなのに対し、「統計情報」は効率のよい探し方を選ぶための判断材料です。
SQLが実行されるまでの流れ
SQLを送信すると、DBMSの内部では、大まかに次の流れで処理が進みます。

ユーザーやアプリケーションがSQLを送信する
「パーサ」がSQLの文法が正しいかを確認し、正しければ次の処理に渡す
「オプティマイザ」が「カタログマネージャ」の管理する統計情報等を参照する
「オプティマイザ」が最適な処理方法を選んで「実行計画」を作る
「実行計画」に従ってデータの取得や更新などを行う
統計情報を収集するときのポイント
カーナビの地図情報が古いと適切なルートを選びにくくなるように、統計情報が古いままだと、DBMSが実際のデータに合わない実行計画を選んでしまうことがあります。そのため、データの変化に合わせて統計情報を収集し、更新することが大切です。
収集するタイミング
大量のデータを追加・変更・削除した後は、なるべく早く収集します。ただ、収集にも時間や負荷がかかるため、夜間など利用の少ない時間帯に実施することが推奨されます。
収集する対象
毎回すべてを対象にするのではなく、データが大きく変わったテーブルなどに対象を絞ることで、収集にかかる負荷を抑えられます。
その他のチューニング方法
インデックスや統計情報のほかにも、データベースのパフォーマンスを改善する方法があります。
パーティション
パーティションは、列の値などを基準に、1つのテーブルのデータを複数の領域に分けて保存する仕組みです。例えば、注文データを注文日の月ごとに分けることができます。

検索条件から対象の領域を絞り込めれば、関係のない領域を読み取らずに済み、処理の効率化を期待できます。
ヒント句
ヒント句は、使用するインデックスやテーブルの結合方法などについて、SQLを書く側からオプティマイザに指示を与えるためのものです。
ただ、標準SQLの機能ではなく、書き方や対応する内容はDBMSによって異なります。多用するとメンテナンスが大変になる恐れがあるため、基本的な見直しで改善しない場合の最後の手段として考えます。
さいごに
今回は『達人に学ぶDB設計徹底指南書』を参考に、データベースのパフォーマンスに関わる統計情報についてざっくりまとめました。
やっぱりパフォーマンスの調整の話になってくると、個人的には結構イメージしにくい領域だなと感じます。ただ、DBMSが内部で何をしているかを理解するうえでも、知っておくべき内容だったと思います。
次回は特に決めていませんが、また気が向いたら、データベースについて学んだことをまとめていきたいと思います。



