SQLについて質問です。

SELECTでワイルドカードを使ってはいけない、つまり
select * from ...
と書いてはいけない、必ず列名を列挙して
select a, b, c, d from ...
と書かなくてはならない、という常識があるそうですが、
ワイルドカードを使ってはならない理由を教えてください。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/01/13 18:50:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:y-kawaz No.2

回答回数1422ベストアンサー獲得回数226

ポイント19pt

別にいけないという訳では無いと思いますが以下の点でそうしておいた方が、後々助かることが多いかと。

・後からカラムの追加削除があった際に結果レコードに対してインデックスでアクセスしていた場合列がずれる問題がおこるかも

・カラムが沢山(例えば100カラム)あるテーブルに対して必要なデータが数カラムだった場合、使わないカラムデータは捨てられるだけなのでメモリやネットワークの無駄

・テーブル定義を見なくてもプログラムソースを見るだけでもテーブル定義が把握しやすい

他にも有ると思いますが主なのはこんなとこではないでしょうか。

id:taknt No.3

回答回数13539ベストアンサー獲得回数1198

ポイント18pt

テーブルの定義が変わった場合、ストアドなど再コンパイラしないと エラーになる場合があります。

そういうのを回避するためにも *の使用は、控えたほうがいいでしょう。

id:munyaX No.4

回答回数120ベストアンサー獲得回数24

ポイント18pt

結論から言うとパフォーマンス面の問題です。


ソースを見つけられなかったのですが、以前Oracleを触っていた時に調べた際には、

select句を実行する際、内部ではかなり大雑把に言うと以下のような流れになります。


 select句を実行

  → 処理

   → 内部の一時テーブルに格納

    → fetchされる度に要求に従い返却


まず最初にネックになるのは、DBMSがシステム的に保有する一時テーブルに格納する

段階のパフォーマンスですね。次にfetchの要求があるたびに、DBからプログラム側へ

渡すデータ量(処理量)の違いでしょうか。


単純に利用しない項目も同時に処理することで全体的に処理しなければならない量が

増えることで、

 ・処理スピードの低下

 ・メモリやディスク(スワップ時など)の消費、

 ・トラフィック量の増加

といった結果になります。



PHP+Smartyで作ってると将来のメンテ工数を考えて、テンプレート側で自由に項目の

利用ができるように全部渡してしまうこともあるんですけどね。ホントは良くないと

知りつつ。

id:chibitomo No.5

回答回数98ベストアンサー獲得回数3

ポイント18pt

もう回答でちゃってるけど

本当、一番の理由はデバグしてるとき

どのテーブル見てるのか分かりやすくするため。

テーブル名かえることなんて多々あるし。

プログラムでもよくあるじゃん、マジックナンバーは使うなって。

http://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%A...(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0)

あと超多アクセスあるDBだと全部のテーブルselectさせるとDBの負荷を極力避けるため。

インデックス振ってあるテーブルのみならなおさら。塵も積もればMYSQL。

でも仕事でくそ安いCMSとかマッチングサイト構築しているときガンガン使ってるけどな。

id:hijk05 No.6

回答回数1307ベストアンサー獲得回数23

ポイント18pt

Oracleの常識で、Mysqlとかではまた違ったと思いますよ。

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

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

トラックバック

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

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

回答リクエストを送信したユーザーはいません