SQL文を大文字にすると高速という都市伝説

Oracleでは内部的にSQLをすべて大文字で解析するので、SQL文に小文字があると無駄な変換が必要だから、全て大文字にするのが良い」
一度は耳にしたことがあるのではないでしょうか?
Oracleの人に聞いた訳ではないので内部処理の真偽の程(ひょっとしてマニュアルに記述があるのでしょうか)はわかりませんが、この手の話にいつも欠けているのはどの程度パフォーマンスに影響するかという話です。
周りの人でこの発言する人はベンチの結果を持ってきてはくれませんが、「これくらいの長さのSQL文ならいいけど、長いSQLの時は気をつけて」など、如何にも差が明確にあるように初心者に教えています。
この大文字解析説が仮に本当であっても、最近のプログラミングはスペックに対して僅かな負荷を考えるより、保守に優れた可読性の高いコーディングを行う傾向にあります。そうでなければオブジェクト指向といった方法論は無駄が多いと切って捨てられます。
こう言っているだけでは既出の人と変わりませんので、Oracle8iとOracle9iでベンチをとってみました。

SELECT
TO_NUMBER(TO_CHAR(SYSDATE,'DD')),
TO_NUMBER(TO_CHAR(SYSDATE,'DD')),
.
.
.
FROM DUAL;

ある程度の時間が掛からないと差分がわからないので関数(関数の呼出コストは調査できていませんので、これも都市伝説かもしれません)を使っています。実際にはSELECTとFROMの間に数100行同じ記述を書きましたので、約10KB(1万文字程度)のSQL文にしています。現場レベルでもそこそこ長いSQLと言っても良いレベルだと思います。
これを全て小文字、全て大文字で比較します。時間の測定は簡易的ですが

SET TIMING ON

をセッションに設定して行いました。
結果なのですが、どちらも

経過: 00:00:13.26

となりました。どちらもSQLキャッシュのない状態です。どこまで大きなSQLになれば差が出るのかわかりませんが、私としてはこの時点で既に気にするレベルではないと感じます。
特筆すべきは「SQL文の大文字小文字でパフォーマンスが変わる」ことではなく、上記のSQLでも2回目の実行結果は

経過: 00:00:00.02

と大幅に速くなる点です。これはSQLのキャッシュにより構文解析がスキップされるためです。チューニングの解説によくありますが、SQL文の大文字や小文字が区別されたり、PL*SQL上で変数を利用すると駄目だったり注意が必要です。繰り返し実行されるSQLだが動的な生成箇所がある場合はバインド変数を利用して同一(大文字小文字も全く同じ)のSQLを発行する必要がありますが、その効果はかなり期待できるものです。
簡単に出来るからといって、どの程度効果があるかわからないような「おまじない」をプログラムするのは賛成できません。特にそのまま思い込んでしまいがちな初心者に言うのは止した方がよいのではないでしょうか。(根拠が希薄なので初心者相手にしか言わないともとれますが)

コメントする

メールアドレスが公開されることはありません。