2006年08月05日

【SQL Server】なんでクエリの応答結果に差が出るのか【MySQL】

MySQL5.0で開発してたのですが、データウェアハウスとの連携ができるのがSQL ServerでちょうどSQL Server2000があるからこっちでやろうって話しになってSQL Server2000を弄ってます。

短いデータベースキャリアの中でこんだけごちゃごちゃと弄り倒したのも始めてであればこれだけクエリで悩んだのも始めてです。

さて、そんな私に訪れた次なる難関はMySQLで動いていたクエリがSQL Serverだと上手く動かないというないようです。
ようはSELECTした結果、読めるレコード数に差が出るというお話です。

それではその問題に取り組んだ時のメモです。


■問題について
同一のクエリを実行したにも関わらず MySQL で実行したクエリの結果と SQL Server2000 での結果で差が出てしまった。

WHERE句で内部結合した簡単なクエリで結果が違うため非常に困ってしまったのですが、差が出てしまったのではどうしようもないので原因を調査するしかありません。
ちなみに24万件ほどのテーブルで全結果を返す MySQL に対して半分ほどの件数
しか返さない SQL Server2000 という結果でした。
個人的には SQL Server2000 の挙動の方が納得いかないのですが。


■検証用のデータ
検証するためのテーブルを準備する。
なんだかんだと言っても検証用のテーブルでは現象が起きませんでした。

やはり元データを眺めるしかないのか・・・。件数多いんだよなぁ・・・。
といじけながら確認していく事に。
そうするとWHERE句で日付型の比較を行っていたのですが、これを外すとうまくいきます。

そこでデータの範囲を絞って日付を調べて見るとNULL値が入る箇所があったの
で更にそこの範囲で色々と試してみました。
そうするとNULL値を評価するときに MySQL と差が出る事が分かってきました。


■NULL値
SQL Server(少なくとも2000)においてNULL値をきちんと考慮した式じゃないとうまく演算結果が得られないようです。
これは日付型に限った話ではないようです。
「A=B」とやったときに両方ともNULLであったとしても同一とは評価されず、FALSEとなるようです。
MySQL では「NULL=NULLはTRUE」と評価されるので問題なかったのですが、SQL Server2000 ではFALSEと評価されるようです。

MySQL の方が正しいのか SQL Server2000 の方が正しいのかは分からないですが厳密にNULLを扱わなければならないのは面倒ですね。
ちなみに SQL Server2000 できちんと動いたクエリを MySQL で動かしてもきちんと動きました。
それだけにNULL値の厳密さに意味があるのか?と思ったりしましたけどね。
厳密に扱わないといけない場面はどのくらいあるのか知りたいものです。



というわけで「SQL Server ではNULL値は特別な意味を持つから気をつけろ」ということでした。



これで経験したRDBMSがOracle、MySQL、SQL Server2000と幅が広がりました。
後はIBMのDB2とPostgreSQLやれば立派な経歴に見えますかね?
でも・・・
・インデックスのメンテナンスやったことない
・トリガを仕込んだ事ない
・ストアードプロシージャを組んだ事ない
・バキューム設定した事ない
・データのストア/リストアをやった事ない
・レプリケーション設定した事ない

などなど、精通して使ってはいないんですよねぇ。
この辺はキャリア積んだ人と一緒に働くのが手っ取り早いんですけどねぇ。
posted by ケイ at 01:45| Comment(0) | TrackBack(0) | プログラム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/21941769
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。