- PR -

SQLServerのSQL「SELECT * FROM 〜」でレスポンスは低下するのか

投稿者投稿内容
ハルシオン
常連さん
会議室デビュー日: 2005/03/29
投稿数: 24
投稿日時: 2006-05-26 11:10
お世話になっております。

今日はSQLの基本的な記述方法について皆様のご意見を伺わせてください。
現在SQLServer2000、VB6.0でアプリケーション開発を行っております。

私の先輩にはSQLに色々と詳しい(というか自分流哲学がある)人がいて、
その先輩に、SQLについて、
『「SELECT * FROM テーブル名」の記述方法はレスポンスが悪くなるから使用すべきではない。
 列名を全て記述するべきだ』
と指摘されてしまいました。
本来なら先輩本人からその理由を述べていただくのが筋なのでしょうが
『自分で調べろ!』
と一蹴されてしまいました。

確かに可読性という面では「SELECT * FROM 〜」は使用するべきでなないかもしれませんが
レスポンスとなると、本当に先輩が正しいのか、疑問を感じております。

2パターンのSQLを作成し、SQLServerの実行プランのコストを見てみましたが
2つのクエリコストは同一でした。
(1000件のデータから全データを取得する方法で調査しました。)
色々と調べてはみましたが、現在行き止まりの状況です。

果たして、「SELECT * FROM 〜」の記述方法と、「SELECT 以下に全ての列名を列挙する」記述方法
とでレスポンスの違いは本当に現れるのでしょうか?
もしくは、SQLServerでこのようにパフォーマンスの比較を行う際に、良い方法がありましたら
ぜひご教示ください。

宜しくお願い致します。
Penguin
会議室デビュー日: 2006/03/01
投稿数: 13
投稿日時: 2006-05-26 11:32
「select *」でも「select 全ての列名」でも全ての列を選択することには変わりがないので、同じでは?
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-05-26 11:43
単純に「SELECT * FROM …だから悪い」という話ではありません。

例えばTABLE1(A, B, C, D, E)という表があったとして、
これに対するSELECTを「SELECT * FROM TABLE1」と書こうが
「SELECT A,B,C,D,E FROM TABLE1」と書こうが、この場合は
取得するデータ量は同じなのでレスポンスも似たような
ものになります。
(オプティマイザの示す実行プランもほぼ同等になるでしょう)

しかし、出力データとして必要なのはA列だけ、といった場合
「SELECT * FROM TABLE1」と「SELECT A FROM TABLE1」では
(大量のデータを扱う場合は特に)レスポンスに差が出ます。
先輩はこのへんを気にされていると思います。

レスポンス以外の話としては、メンテナンス性の問題なんかもありますが割愛。
ina
ベテラン
会議室デビュー日: 2005/04/14
投稿数: 58
投稿日時: 2006-05-26 11:47
私が思うに、先輩は
「アプリの処理に不要なカラムまで取得するから遅くなる」
って言いたいのでは無いかと。

【追記】
かぶってしまった.....

[ メッセージ編集済み 編集者: ina 編集日時 2006-05-26 11:48 ]
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-05-26 11:47
こんにちは。

WHERE句が絡んできたりすると違いが出てくるんでしょうね。

OracleとSQL Server、チューニングの違いを知る
http://www.atmarkit.co.jp/fdb/rensai/rdbmsarc05/rdbmsarc05_1.html#3

10 Things You Shouldn't Do with SQL Server
http://www.dotnetjunkies.com/Article/86F0988E-FED4-414F-BA2E-D01D953C11BE.dcik
ここの [6. Abuse SELECT *] に無駄な列をフェッチするなという旨の記述があります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-26 11:53
引用:

ハルシオンさんの書き込み (2006-05-26 11:10) より:

列名を全て記述するべきだ


この "全て" が、どういう意味の "すべて" かに因りますね。
全列抽出するという前提であれば、'レスポンスは' 変わらないでしょう。

2, 3 列しか必要でない場面で、余計な列を取り出すなという意味であればわかります。
パフォーマンスも保守性も悪くなります。

引用:

果たして、「SELECT * FROM 〜」の記述方法と、「SELECT 以下に全ての列名を列挙する」記述方法とでレスポンスの違いは本当に現れるのでしょうか?


"全て" が、こちらの意味であると確認されましたか?
この点が微妙なので、回答する側も意見が入り混じってますね。

引用:

確かに可読性という面では「SELECT * FROM 〜」は使用するべきでなないかもしれませんが


可読性というより保守性じゃないんですか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-05-26 11:57
WHERE句があれば取得列とインデックスの有無で実行プランが大きく
変わります。データ抽出速度も違いますし、データ取得そのものについても
直接アクセスしないでカバリングインデックスで済む場合があります。
まいるどきゃっと
大ベテラン
会議室デビュー日: 2004/08/12
投稿数: 135
お住まい・勤務地: 群馬
投稿日時: 2006-05-26 12:04
皆さんが指摘している通りで、「列名を全て」の意味をもう一度その先輩に聞いてみたほうがいいと思います。

どちらにせよ、保守性やパフォーマンス等、いろいろな意味で「SELECT * FROM テーブル名」を使うことはありえないと思っていたほうがいいでしょう。

スキルアップ/キャリアアップ(JOB@IT)