2016-07-26 6 views
0

私はこれを読んできましたが、明示的に列名を一覧表示する方が良いことを理解しました。Select * vsすべての列名を選択

のは、(私の本当の人生のシナリオに非常に近い)次のシナリオをふりましょう:

  1. 新しい列は、私はすべてのBLOBデータに

  2. を使用していない

  3. を追加することはありません私は実際にすべての列を返すようにしたいです

  4. 私は約1億4000万行のテーブルを持っています
  5. 私は実際に私はすべての結合と誰もが下記
  6. クエリは、私は、クエリを実行する方法を文字通り正確ではないだろう使用していないすべての1.4億の行が必要ですが、ちょうど私が引数
  7. のためにやるふりをすることはできません。 。

次のクエリの性能差はあります:

select every_column_name 
from table 

編集対

select * 
from table 

:私は、このトピックの万の質問があります理解しています。この特定のシナリオでは、パフォーマンスの違いはありますか? select *はまだ悪いですか両方のクエリが同じパフォーマンスを持っていますか?

explainを使用した結果に基づいて、この特定のケースでは違いはありません。

+1

特に「特別な」クエリでは、 'select * 'の使用には問題ありません。いくつかのリスクがありますが、あなたはそれらを理解しているようですので、あなたの特定の状況で最も効果的なものを判断することができます。 –

答えて

2

これは私のコメントの精緻化です。

select *をアドホッククエリとして使用することは間違いありません。それは非常に便利で一般的です。

問題は、同じクエリを時間の経過とともに実行する場合に発生します。特に、クエリがコンパイルされている場合、基礎となるテーブルを変更すると予期しない問題が発生する可能性があります。私は、基礎となる表の列タイプが変更されたときに、ビュー内のselect *によって引き起こされた問題(6:00 a.m.から始まる)をデバッグするのに約10時間を費やして思い出しました。コードは再コンパイルされず、データレコードのオフセットはオフになっていました。

この状況でも、強制的に再コンパイルすることで修正できます。そして、私は一般的に、特別なクエリでSELECT *を使用します。

質問には、クエリの速度を低下させるワイド列など、いくつかの要点が要約されています。

+0

"コードは再コンパイルされず、データレコード内のオフセットはオフです" ---コード列のインデックスには名前が使用されていませんでしたか?o_O – zerkms

+0

@zerkms。 。 。コードがコンパイルされると、列の位置はオフセットやその他の情報として格納されます。列の記号名は使用されません。 –

+0

どのようなプログラミング言語ですか? PSQL? – zerkms

0

パフォーマンスの違いはありません。 DBMSが2つのステートメントを分析するとき、同じクエリが生成されます。つまり、*はevery_column_nameのショートカットです。

関連する問題