SQLer 生島勘富 のブログ

RDB・SQLの話題を中心に情報発信をしています。

データ量とインデックスについて

 新人研修の季節ですね。
 以前、インデックスについてカラオケ本をイメージして考えましょうと書きましたが、新人研修などでは、あまり難しいことを考えずイメージを持つことが非常に重要です。
 是非、新人研修の前後で読んでいただければと思います。
 もちろん、カラオケ本とRDBMSのインデックスのアルゴリズムはまったく違いますが、あくまでイメージなので、揚げ足取りは勘弁してくださいね。

 かなり前のことになりますが、カラオケ本の続きです。

パフォーマンスについて

 ・売上データが入った1000万件のテーブルAがあり、2011年5月17日のデータはAテーブルは1000件入っています。
 ・売上データが入った10万件のテーブルBがあり、2011年5月17日のデータはBテーブルは5000件入っています。

 それぞれのテーブルについて2011年5月17日の集計処理を行うとすると、インデックスがあるのとないのでは、パフォーマンスは逆になります。

 つまり、日付にインデックスがある場合、テーブルAの方が処理時間が短くなり、日付にインデックスがない場合はテーブルAの処理時間はかなり遅くなります。

 当たり前の話ですが、ピンと来ない人は今度は電話帳を想像してみましょう。カラオケ本もインデックスなら、電話帳もインデックスです。

 若い人は知らないかもしれませんが、昔は、一般家庭であっても家の固定電話の電話番号は電話帳に載っていました。市区町村単位に電話帳が存在して電電公社(NTT)が固定電話を持っている家庭に配っていたのです。
 更には、電電公社(NTT)に行けば日本全国の電話帳が置いてあったりしました。

 では、全国の数百冊の電話帳から、大阪市に住む「生島」という苗字の人を全部抜き出す作業をイメージしてみてください。次に、家にある電話帳で「田中」という苗字の人を全部抜き出す作業を想像してみてください。

 どちらが大変ですか?

 日本全国の電話帳が書庫に全部そろっていても、大阪市の電話帳を見つけた後は、自宅にある電話帳を持ってきた後の作業と同じです。つまり、電話帳が使える、RDBMSで言えば、インデックスが使えるなら全体の大きさはそんなに関係ないのです。

 ところが電話帳がなければ全部のデータを1件ずつ調べていく必要がありますから、全国電話化入者の中から「大阪市に住む生島という苗字の人」を全部抜き出す作業は途方もないほど大変です。

 RDBMSでもほぼ同じです。

 もし、ヒットする件数が少ないのにパフォーマンスが悪いときは、適切なインデックスがなかったり使えてない可能性が高いです。ヒットする件数が少なくて遅いときは、チューニングポイントがたくさんあり、特にインデックスを少し見直せばパフォーマンスは大きく改善する可能性が高いです。


 ただし、非常に大きなシステムでは、特にインデックスがメモリーに載る大きさであるかどうかが問題です。メモリーに載る大きさでない場合は、パーティション・テーブルなどを利用することになるのですが、その大きさになるまではインデックスが正しく使えているならば、テーブルの件数にかかわらずヒットする件数がパフォーマンスに影響する件数になります。

 テーブルが大きいとき勘違いする人がいるのですが、勘違いしないように気をつけましょう。

関西DB勉強会「DecoBoco」第4回

 関西DB勉強会「DecoBoco」第4回でお話させていただきます。
    日時:2011/05/20 19:00 〜 21:00
    参加申し込みはこちらから http://atnd.org/events/14380