Quantcast
Channel: Shiitake's tumblr.
Viewing all articles
Browse latest Browse all 46471

"なぜNULLがそんなに悪いのか  NULL が悪いとされる理由は、一般的に以下の5点によります。 SQL の作成にあたり、人間の直観に反する3値論理を考慮せねばならない。 IS NULL、IS..."

$
0
0

なぜNULLがそんなに悪いのか

 NULL が悪いとされる理由は、一般的に以下の5点によります。
  1. SQL の作成にあたり、人間の直観に反する3値論理を考慮せねばならない。
  2. IS NULL、IS NOT NULL を指定する場合、インデックスが参照されないためパフォーマンスが悪い。
  3. 四則演算または SQL 関数の引数に NULL が含まれると「NULL の伝播」が起こる
  4. SQL の結果を受け取るホスト言語において、NULL の組み込み方が標準化されていない。
  5. 通常の列の値と違って、NULL は行のどこかに余分なビットを持つことで実装されている。そのため記憶領域を圧迫したり、検索パフォーマンスを悪化させる。
 1.の理由は、私が思うに NULL を排除すべき最大の理由ですが、既に「3値論理」で 述べたのでここでは繰り返しません。(時折、NULL をガンガンに許可しながら SQL が2値論理で動作すると盲信している迷惑な輩の存在を耳にしますが、言語道断です。) また2.は、パフォーマンス・チューニングの際に気をつけるポイントして良く知られているものです。3.について、例えば四則演算の対象に NULL が含まれた場合、

  1 + NULL = NULL
  2 - NULL = NULL
  3 * NULL = NULL
  4 / NULL = NULL
  NULL / 0 = NULL

 というように、演算結果も問答無用で NULL に化けてしまいます。最後の例から分かるように、0除算の場合ですらエラーになりません。 SQL 関数の多くも、NULL に対しては NULL を返す仕様になっています。この現象を「NULL は伝播する(NULLs propagate)」と言います。propagate という単語は、「(雑草が)はびこる」のように負のニュアンスを持って使われることもあり、NULL の厄介者ぶりを表すにはぴったりの表現です。
 意外と知られていない、あるいは注意を払われていないのが、4.と5.の理由ではないでしょうか。正直、この2点については、ホスト言語やDBMSの実 装次第というところもあり、今後解消されていく可能性は大いにあります。しかしホスト言語が関係モデルにおける NULL をサポートしていない現時点では、やはり大きな問題です。Oracle では空文字と NULL は区別されないが Visual Basic では区別されるという現状がまかり通っている以上、NULL 排除の十分な理由となります。”

- NULL撲滅委員会

Viewing all articles
Browse latest Browse all 46471

Trending Articles