May 04, 2008
気軽に書いてたけど、これちゃんと書いておかないとマズイか。
F's Garage:どのレベルのフレームワークが一番良いのか。
に書いた以下の部分。
確かにJavaBeansは面倒だけど、ハッシュで取り回す型のない言語は、DBのスキーマの変更は強いし。(え、select * from を使うなって?)
select * を推奨せず、カラム名を指定すべきという話についての考察がありました。
眠る開発屋blog » SELECT文でアスタリスクを使うな論、とか
列名指定のほうが必要な分だけデータを送らず転送量が減るので、または解析のパフォーマンスが上がるのでよい、みたいな話があるが、そんなに変わるの? いや、経験的にはあんまり変わらん気が。 ってか、もしMySQLであれば、クエリーキャッシュがあるので、なるべく同じ記述のSQL文を発行したほうがいい。 そもそもアプリケーションキャッシュ使えよ!とか。 となると最大公約数的な「SELECT * FROM ~」になるんじゃないのかな、という気がする。
特にrailsだなんだと言ってる文脈においては、select * fromなんてカスみたいなものかと。
そもそもWEBの場合は、眠る開発屋blog さんが引用されている先のOracleのQ&Aサイトに書いてある、「面倒でも何十個も列名を書いているのでしょうか?」などというJOINそのものがパフォーマンス上厳しいケースがある。
WEBでのDBの使われ方って、どちらかというと高速でスレッドセーフなストレージだから、そんな複雑なJOINを使うケースは部分的に限られる。
どうしても複雑になる部分は、大体キャッシュ化すべきデータであることが多いから、select * fromと書くことに多少なりともコストがかかったとしても、気にするレベルではない。
それより細かく指定して結果的にJavaと同じメンテ性になったんじゃLLを使ってる意味がないというもの。
更に、先ほどのOracleのQ&Aにおいても、そんなことよりインデックスを使わないでテーブルを見に行くようなSQLになっちゃダメよ、とか、像とアリの歩行速度の違いを語るような話になってたり。
やってはいけないのは「インデックスを使わなかったりfile sortが発生しているSQL」であって、それさえ解決されてれば、後はLLを選択する範囲での富豪的プログラムの要素に含めてしまって良いと思うので、基本的には「select * from 」を使います。
カラム名が被ってるようなテーブルの連結では指定しますけど、それはそっちの方が純粋に適切だと言うケースの場合でしょう。
## そりゃPVの桁が変われば違うんでしょうが、その場合は、重箱の隅的な最適化案のの一つとしてあげられることかもしれませんが、これを最初から予見すべしってのは反対。それでメンテナンス性を下げるならLLそのものの選択が間違いだと思うし。