JOINでパフォーマンスが下がるという幻想

テーブル結合でパフォーマンス低下って、あんまり経験ないんだけど…。

はてなブックマーク - これは・・・ - 予定は未定Blog版

なんてはてブコメントが付いていたけど、正規化されてて、きちんとしたインデックスが張られてるならJOINでパフォーマンス低下するようなことはそうそうないでしょうね。


問題は、正規化されていない巨大な「横持ち」のテーブルとかの場合。
正規化してはいけない、っていうのがRDBMS使う意味をなくしているんだけど、正規化してはいけないことによって生じる弊害がまさに「JOINでパフォーマンスが低下する」原因になるものばかり、ということで、そういう状況にない限りJOINによるパフォーマンス低下という状況には陥らないんじゃないかなぁ。

  • 第1正規化がされていないと・・・
    • カンマ区切りやスペース区切りでひとつの「セル」に押し込む必要があり、カラムのサイズが大きくなりやすい
    • WHERE句やON句等で文字列操作やLIKE演算子の使用が必要になり、パフォーマンス劣化の原因となる
  • 第2、第3正規化がされていないと・・・
    • 1つのテーブル内での重複が多くある状態なので、行のサイズが大きくなりやすい
    • マスタ系のデータの更新・削除が大変、対象が多い

今まで出会った中で一番最悪なテーブルは、カラム数が300近くあって、そのほとんどがNULLという、すさまじいものだった。
こんな状態だと、そりゃまぁJOINはしたくないよなぁ、ということで、

結合によるパフォーマンスダウンを恐れている。正規化してはいけないなら、ある意味妥当かもしれないが・・・

これは・・・ - ぐるぐる〜

につながるわけです。


追記:
「JOIN 非正規化」で検索してみたら正規化と非正規化の応答速度実証実験なんてものを見つけた。詳細は読んでないけど。