WHERE "X" IS NOT NULL

パフォーマンスチューニングに関する記事を見ていると、「not is nullでの検索にはインデックスが使われないので使用しない」というものがあった。あー、結構使っているなぁ。そういえば、以前にそのような記述を見たこともあるような気がしてきた。
対処法としては「論理的にあり得ない値を設定する」とあったが、「reference制約」のついたカラムでは結構困る。参照される側*1にダミーのデータでも入れろということであろうか。それはそれで色々と問題が出てきそうな気がするのだが。
これが「リレーショナル・データベースにおけるjoinのコストの問題」というものか。データベース設計の際に「異常なまでに正規化にこだわった」のがjoinが多くなった原因だが。まぁ、個人的ポリシーなので仕方がない・・・。

*1:参照する、参照されるという記述は日本語だと結構曖昧で困ることがある。「AがBを参照する」場合に、Aを「参照するテーブル」としBを「参照されるテーブル」と呼ぶ場合と、Bを「(Aが)参照するテーブル」と呼ぶ場合がある。むかしデータベースの解説書を読んでいて混乱したことがある。今回は前者の呼び方。