業務でOracleデータベースを使う必要があり、しばらくOracleを試用していたのですが、Oracleには特有のクセがあることがわかりました。
そこで、Oracleデータベースの特性にあったSQLコーディング規約を採用することにしました。
SQLコーディング規約(Oracle)
結論としては、フューチャー株式会社様のSQLコーディング規約(Oracle)を、ベースコーディング規約として採用することにしました。
一部をカスタマイズして採用しようと考えております。
SQL中のインデントは、Javaコーディング規約にあわせて半角スペースではなくタブ文字とする。
プログラミング言語でJavaを使う予定はないため、ここは半角スペースに読み替えます。
横は80文字を目安に改行する
「80文字は短くないか?」と最初思ったのですが、長いSQLを抑制する効果もありそうな気がしてきたため、取り急ぎそのままにしました。。
外来語に関しては、原語の短縮形を使用する。短縮形が存在しない場合には、母音を抜かして表記する。
これは採用しないことにし、短縮形の利用は必要最小限にしました。
検索条件で=(等号)を使用できる場合は必ず使用する
A=1 or A=2とする方がA>0 and A<3などと記述するのよりパフォーマンス上優位な場合が多い。
これは A にインデックスがある場合、=であれば、インデックスが有効に使われるためである。
恥ずかしながら、ANDよりORのほうがパフォーマンスが良くなるパターンはあまり考えたことなかったです。
自分の場合、あくまでこのパターンでは A IN (1, 2)
と書くかもしれない?
SELECT FOR UPDATEはNO WAITまたは「WAIT秒数指定」を必ず付ける。
NO WAITは厳しすぎるので、ある程度のWAIT秒数は許容したいと考えます。
予約語以外に対しても、予約語と同様に大文字を使用する。(例 : オブジェクト名、カラム名 等)
個人的には、予約語以外も大文字という規約が、本規約最大の特徴なのではないかと思いました。 大文字を使えば、Oracleのカラム名・テーブル名ダブルクオーテーション問題が軽減できそうです。
CREATE TABLE my_table( col1 number, col2 number ) -- you can SELECT * FROM my_table SELECT * FROM MY_TABLE SELECT * FROM My_Table SELECT * FROM "MY_TABLE" -- but something like SELECT * FROM "my_table" -- will fail.
ORMは自動でテーブル名をダブルクオートで括ったりするのですが、テーブル名が小文字だと will fail パターンにハマります。 私も見事にハマったのですが、これはOracle特有の挙動なのかもしれません。
あとがき
まだ私はOracle見習い程度のレベル感なのですが、ORACLE MASTER資格に興味が出てきました。
Oracleの特性にもっと詳しくなりたいのであれば、資格勉強で体系的に学んでみるのはありかもしれません。