もう一つSQL

昨日、ひどいSQLの話をしたけど、

あれはOracleのバグかなければパフォーマンスにたいした影響は無し。

なので、今日はもう一つひどかった例にいってみる。

 select count(*) from aaa

 where (:1=1 and :1=status) or (:1<>1 and :1<>status)

…まず、書き方から非常にわかりにくかった。

多分、プログラム側からの視点でデータを見るから

変数=statusって書き方なんでしょうね。

SQLの内容は変数が1ならstatusが1のカウントを取るし、

1以外であればstatusが1以外の全てのカウントを取るという処理。

昨日と同じく、変数チェックはAPでやって、

DBには単純な処理をさせるべきですね。

更に今回は昨日のSQLと違い、

orを使ってるためパフォーマンスは劣化します。

インデックスやレコード数などの状況によっては相当な差が出ます。

常識的な作りならAP側で引数が1かどうかをチェックして

where status=1もしくはstatus<>1の2つのSQLどちらを使うか

判断させるべきですね。

外注さんなんかに頼むと、

WASでいろいろ作りこむのが面倒だからって

パフォーマンスを完全に無視したこういうSQLを作ってきたりします。

レコード数が増えた時の運用など考えなければ

DB側に処理させるのが開発は楽ですからね。

気をつけましょー。