SQLについて質問です。

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

回答の条件
  • 1人2回まで
  • 登録:2009/01/06 18:48:52
  • 終了:2009/01/13 18:50:02

回答(6件)

id:y-kawaz No.2

y-kawaz回答回数1419ベストアンサー獲得回数2252009/01/06 18:58:27

ポイント19pt

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

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

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

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

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

id:taknt No.3

きゃづみぃ回答回数13481ベストアンサー獲得回数11982009/01/06 19:21:20

ポイント18pt

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

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

id:munyaX No.4

munyaX回答回数120ベストアンサー獲得回数242009/01/06 19:22:39

ポイント18pt

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


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

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


 select句を実行

  → 処理

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

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


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

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

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


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

増えることで、

 ・処理スピードの低下

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

 ・トラフィック量の増加

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



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

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

知りつつ。

id:chibitomo No.5

chibitomo回答回数98ベストアンサー獲得回数32009/01/06 21:05:29

ポイント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

hijk05回答回数1307ベストアンサー獲得回数232009/01/08 23:23:23

ポイント18pt

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

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

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

トラックバック

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

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

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