SQLの書き方
大文字小文字
スペース有無、大文字・小文字の違いは異なるSQL文と解釈されてしまう。
その結果、無駄な解析処理が走ってしまうので、可能な限りSQL文は一か所に集約すべき。
列名の明示的な指定
列の並び順の変更や追加の可能性がある為、全列にデータ挿入する場合でも列を明示的に指定する。
レコードの検索時は処理時間増大を抑える為、必要な列だけを指定する。
ORDER BY句では、カラム番号ではなく対象カラム名を明示的に指定する。
日付フォーマット
日付フォーマットのデフォルト (NLS_DATE_FORMAT)は変更される可能性があるので、
明示的に日付フォーマットを指定する。TO_DATE( '19900101', 'YYYYMMDD' )
ANDやOR条件の複数指定
AND句はボトムアップ(ANDリストの最後から順) 絞込みが効くAND句はWHERE句の最後
OR句トップダウン(ORリストの最初から順) 絞込みが効くOR句はWHERE句の最初
レコードの存在チェック
副問い合わせ処理でNOT IN句を用いると内部処理が発生する為、NOT EXISTS句を使用する。
テーブルの結合
複数テーブルの結合を行うSQL文は、レコード件数の少ないテーブルをFROM句の最後に指定する。
カウント
全件数の調査時、COUNTはnullレコードがカウントされない為、COUNT(*)を使用する。
インデックス
・条件指定にNULLを用いると、インデックスは使用されずに必ず全表検索となる。
ビットマップインデックスであれば、NULL値を条件にできる。
・条件指定にNOT EQUAL(!=)を使用すると、インデックス検索を行なわない。
ビットマップインデックスであれば、NOT EQUALを条件にできる。
・インデックスのキー列のLIKE句において、以下の検索条件ではインデックスが使用されない。
・後方一致 : LIKE '%c'
・中間一致 : LIKE '%c%'
前方一致(LIKE 'c%')は、インデックスが使用される。
・ORDER BYでインデックスを使用するためには、以下2条件を満たす必要がある。
・ORDER BY句を構成する全列が同じ順序で1つのインデックスに含まれる。
・ORDER BY句を構成する全列がテーブル定義時にNOT NULL制約を有する。
暗黙のソート処理
以下のSQL文は暗黙的にソート処理が行われる。
Oracle任せになってしまうので、ORDER BYは書くべき。
・DISTINCT
・GROUP BY
・INTERSECT
・MINUS
・UNION
ヒント句
ヒント句を記述する際は、SELECT, DELETE, UPDATE, INSERTの各キーワードの後に
/*+ ヒント句 */の形式で記述し改行する。