SELECTでワイルドカードを使ってはいけない、つまり
select * from ...
と書いてはいけない、必ず列名を列挙して
select a, b, c, d from ...
と書かなくてはならない、という常識があるそうですが、
ワイルドカードを使ってはならない理由を教えてください。
よろしくお願いします。
別にいけないという訳では無いと思いますが以下の点でそうしておいた方が、後々助かることが多いかと。
・後からカラムの追加削除があった際に結果レコードに対してインデックスでアクセスしていた場合列がずれる問題がおこるかも
・カラムが沢山(例えば100カラム)あるテーブルに対して必要なデータが数カラムだった場合、使わないカラムデータは捨てられるだけなのでメモリやネットワークの無駄
・テーブル定義を見なくてもプログラムソースを見るだけでもテーブル定義が把握しやすい
他にも有ると思いますが主なのはこんなとこではないでしょうか。
テーブルの定義が変わった場合、ストアドなど再コンパイラしないと エラーになる場合があります。
そういうのを回避するためにも *の使用は、控えたほうがいいでしょう。
結論から言うとパフォーマンス面の問題です。
ソースを見つけられなかったのですが、以前Oracleを触っていた時に調べた際には、
select句を実行する際、内部ではかなり大雑把に言うと以下のような流れになります。
select句を実行
→ 処理
→ 内部の一時テーブルに格納
→ fetchされる度に要求に従い返却
まず最初にネックになるのは、DBMSがシステム的に保有する一時テーブルに格納する
段階のパフォーマンスですね。次にfetchの要求があるたびに、DBからプログラム側へ
渡すデータ量(処理量)の違いでしょうか。
単純に利用しない項目も同時に処理することで全体的に処理しなければならない量が
増えることで、
・処理スピードの低下
・メモリやディスク(スワップ時など)の消費、
・トラフィック量の増加
といった結果になります。
PHP+Smartyで作ってると将来のメンテ工数を考えて、テンプレート側で自由に項目の
利用ができるように全部渡してしまうこともあるんですけどね。ホントは良くないと
知りつつ。
もう回答でちゃってるけど
本当、一番の理由はデバグしてるとき
どのテーブル見てるのか分かりやすくするため。
テーブル名かえることなんて多々あるし。
プログラムでもよくあるじゃん、マジックナンバーは使うなって。
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とかマッチングサイト構築しているときガンガン使ってるけどな。
コメント(0件)