2008年4月17日木曜日

データが「ある」ということ

データベース屋さんとしては正規化を行って適切な粒度で細分化されたテーブル構造を正とするのが、嫌な言葉だけど「一般的」なんだよね。
もちろんここにはちゃんとした理由もある。

一つは「異常データを排除する」というため。もう一つは「レスポンス向上」のため。

データの排除についてはそれほど異論はないと思うんだけど、恐らくはもう一つの「レスポンス向上」についてが、変に思うところだと思う。
SqlServerも含めて殆どのRDB系DBMSはインデックスの構築の仕方がレスポンスに直結してくるんだよね。インデックスを利用できないような抽出条件(部分一致検索とか、値がNullという条件とか)をなくすことが、そのままレスポンス向上につながるので、システムの動作速度の大半は実はここで決まってしまうんだよね。

そしてインデックスというのは、参照するのは早いけど更新するのは遅い、という性質を持っているんだ。簡単に言うとSELECTするのは早いけどINSERTやUPDATEは遅い、というところで。

ここで最初の話に戻るけど、なぜ正規化したほうがレスポンスの向上が見込めるかと言うとこの条件指定に関連してくるわけだ。
WHEREが適切に動くようなインデックスを構築する場合だと、参照はそれで済んだとしても更新の際には主キー+インデックスの更新も必要になる。でも正規化して「データが存在すること」が条件になるようにできていれば、殆どはクラスタインデックス(主キー)の更新だけで済むようになるということなんだよね。以前に1つのテーブルに10以上のインデックスを構築したテーブルに対しての更新処理を行ったことがあるんだけど、それはもうなんじゃこりゃ的なトロさだったね(w
インデックスはずして更新するとエライ速度が変わるという。
なのでインデックスでどうこうするのではなく、テーブルにデータが存在することで条件指定を兼ねるよう正規化して設計することが後々で重要なんですなぁ。

0 件のコメント:

コメントを投稿