MYSQL(というよりSQL文?)で、SELECT や FROM などのコマンドを

大文字で記述すると、処理スピードが上がると聞きました。

以前それをプログラマに教えたところ、SELECTを用いて2万件ほどデータを
検索したときの速度が確かに高速になり、プログラマも、確かに処理があがった!と
cmd 画面を見ながら喜んでました。

多少知識がついてきた今考えてみると、キャッシュとかだったんじゃないかな~と
思っているのですが、実際どうなんですかね?
数万件のデータ数だと違ってくるとか・・・

回答の条件
  • 1人1回まで
  • 登録:2008/06/13 10:49:21
  • 終了:2008/06/13 19:22:43

回答(4件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402008/06/13 11:23:22

ポイント36pt

どの RDBMS でもそうだけど、SQL はあくまでユーザーが使う言語で

それを構文解析して自身の扱いやすいように変換してから実行される。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 5.2 SELECT ステートメントおよびその他のクエリの最適化

場合によってはこの時点で SQL 文のチューニングすら行われる。


だから、メジャーな RDBMS で

大文字で記述すると、処理スピードが上がると聞きました。

ということは処理上非常に考えにくい。


ただ、構文解析処理自体はそれなりにコストのかかる処理なので、

データ数が影響することは無いが、SQL 文の発行回数によっては若干の

違いが出る可能性が無いわけではない。

ただ、100万回クエリを投げて数秒違いが出るとかそういうレベルだと思うけど。


検索したときの速度が確かに高速になり、プログラマも、確かに処理があがった!と

cmd 画面を見ながら喜んでました。

MySQL にはクエリキャッシュという機能があり、同一クエリに対しては即時応答できる。

2回目以降の検索速度が上がったのであればそれは MySQL の仕様。

実際どういう状況でどんなクエリを投げたのかわからないけど。

id:yossui_coll

ありがとうございます。

状況としては約2万件の会員データの中から、ある条件の会員を検索する

という感じでした。大文字処理で4、5倍の差がでた記憶がありますが、

同じ条件での検索だったので、まさしくキャッシュだったのですね。

プログラマー4人もいたんですけどね。。

2008/06/13 13:24:37
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012008/06/13 11:39:53

ポイント36pt

MySQL、PostgreSQL、ORACLE、Accessなどは

テーブルやインデックスなどの現状を表す統計情報を保持していて

オプティマイザと呼ばれるプログラムが「SQL文」と「統計情報」をもとに

「どうすれば短時間で処理できるか?」の解析を行い

解析の結果、一番短時間であると考えられる方法にあわせて

「SQL文」を「内部実行形式」に変換し、実行プログラムに引き継ぎます。


内部実行形式に変換された後ならばSQLコマンドの大文字小文字は既に関係の無い話ですし

SQLの予約語が大文字だから小文字だからといった事くらいで

オプティマイザでの解析に大幅な違いが現れるとは考えられず

お考えのようにキャッシュ的なものが有効に使えた可能性は高いものと推測します。


SQLの予約語は慣例的に大文字で書く事が多く、それに慣れている人も多いので

統一という意味で大文字をお勧めしたいです。

id:yossui_coll

ありがとうございます。

僕はあまりSQLで何かするような機会はないのですが、

HTMLやCSSなども記述ルールを統一すると効率が上がりやすいように、

SQL文も予約語が大文字であれば、見た目的にもわかりやすくなりますしね。

勉強になりました。

2008/06/13 13:28:32
id:techmedia-think No.3

techmedia-think回答回数46ベストアンサー獲得回数132008/06/13 12:07:59

ポイント35pt

MySQLには当てはまらないかもしれませんが、Oracleの場合は、基本的にSQLは大文字で管理されるため、小文字でSQLを記載していても、Oracleにより小文字→大文字の変換をします。そのため、最初から大文字で記載していれば余計な変換が発生しないので、パフォーマンスは向上します。

id:yossui_coll

ありがとうございます。

なるほど、Oracleがそういう仕様だったんですね。

今回の件は、実はあるプログラムの学校の講師の方から

聞いていたんですが、勘違いしていたのかもしれません。

2008/06/13 13:31:28
id:matsu-boolean No.4

matsu-boolean回答回数43ベストアンサー獲得回数72008/06/13 12:42:20

ポイント36pt

 基本的に 「""」 など(MySQLの場合は 「``」)で括られない識別子は大文字(MySQLの場合は小文字)へ変換されます。なので、厳密に言えばはじめから大文字(MySQLの場合は小文字)で書いておけば、変換の負荷は下がります。

 …とは言ってもほぼ誤差だと考えてください。今日のCPUで文字列の大文字小文字変換のCPU負荷など高々知れています。昔確認したときに速度が上がったのはご想像通り、キャッシュなどだったのではないでしょうか。

 ただし、DBによっては、大文字小文字も含めて一字一句同じSQLが発行された場合は構文解析を省略できるので、プロジェクト内で、大文字なり小文字なり、SQL記述のルールを定めておくと良いかもしれません。あと、条件句を「EMP_CODE='000001'」のように文字列として生成せず、「EMP_CODE=:EMP_CODE」のようにSQLパラメータを使うことで、構文解析を省略できる可能性が高くなります。(これはORACLEの場合ですが他のDBでも事情は似たようなものだと思います)

 ご参考になれば幸いです。

id:yossui_coll

ありがとうございます。

現在のCPUなら特に問題なし、こだわるなら書いていただいた

やり方もあるということですね。

勉強になります。

2008/06/13 19:21:39

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません