もう一つ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側に処理させるのが開発は楽ですからね。
気をつけましょー。