2009-09-16 32 views
2

誰かがより良い練習とは何かを教えてもらえますか?選択したクエリに対して、必要なすべてのIDまたはIDを返す必要がありますか?*テーブルから選択するか、テーブルからID、フィールド1、フィールド2、フィールド3を選択します。

効率?スケーラビリティ?など

おかげ

ENV:SQL Server 2008の、VS2008(VB)

+0

重複: //stackoverflow.com/questions/65512/which-is-fasterbest-select-or-select-column1-colum2-column3-etc –

+0

@Jay:あなたができるからといって、あなたがするべきではない... ... –

+0

ありますnathanが投稿したdupの素晴らしい答え。これは、「パフォーマンスが良い」理由を挙げているしばしば以下の答えになります。 – akf

答えて

9

、必ず明示的に列を列挙する。どのプロダクションコードでもselect *を使用しないでください。

一見一見理解できるかもしれない状況でも、意図しない結果が生じることがあります。たとえば、テーブルのレイアウトを反映するビューがあるときにはselect *と考えるかもしれませんが、ビューを再生成せずに基になるテーブルを変更すると奇妙なことが起こる可能性があります。

質問を入力して実行しない限り、select *から離れてください。

1

あなたは、ほとんどの場合、列を指定する必要がありますが、これは将来の変更やメンテナンスのために最も適しています。また、データを少なくしてパフォーマンスを向上させます。

3

誰かがより良いプラクティスにチャイムすることができますか?選択したクエリに対して、必要なすべてのIDまたはIDを返す必要がありますか?

カラムに名前を付けます。

これはベストプラクティスであるだけでなく、パフォーマンスを向上させることができます。

は、2つのクエリを想像:

SELECT * 
FROM mytable 
WHERE column1 = @somevalue 

SELECT id, column1 
FROM mytable 
WHERE column1 = @somevalue 

idは、クラスタ化された主キーであるとcolumn1上のインデックスがあります。

私はあなたのクライアントコードが可変数の列を正しく処理していると仮定しています。 e。テーブルレイアウトの変更でコードが破損することはありません。これは非常に強い仮定ですが、それを作ろうとします。

mytableidcolumn1のみの場合、クエリは同じです。

column2mytableに追加するとどうなりますか?

2番目のクエリ(名前付き列を使用)はインデックスを使用しますが、最初のクエリではcolumn2も選択する必要があります(SQL Serverは無視されません)。

これにより、プランにClustered Table Seekが追加され、クエリのパフォーマンスが悪化します。

0

クライアントコードの列名を決して参照しない限り、名前付き列を使用する必要があります。

+0

パフォーマンスと保守性にはまだ影響があります。また、スキーマ変更のために「列3」が変更された場合はどうなりますか? – gbn

+0

私が想定しているシナリオは、実際に返されたすべての列を反復処理し、それらを例えばそれ以上の処理を行わないHTMLテーブル。 I.とにかくすべての列が必要な場合に、行方不明またはデータ型の変更があった場合にコードが壊れないようにするには、おそらくSELECT *が使えます。 –

+0

ええ、これも私も思ったことですが、名前付きフィールドに傾けて練習する必要があると思います。 –

1

SELECT * FROM our_table上で明示的に名前を付ける列を好む理由は明示的に プロジェクトは、私たちの意図より はっきりとそう貢献を表現するには、列に名前を付ける

  1. です 自己文書化コード。
  2. 将来誰かが 以上の列をテーブルに追加します。 SELECT *を使用すると、これらの列は自動的に にドラッグされます。 がコードを破ったり、 (特にLOB が含まれている場合)になる可能性があります。
0

私は「決して」または「常に」は、どちらか一方を使用するように指示するつもりはありません。それから始まるアドバイスはリテラルにはなりません。

あなたは小さなデータセットで作業している場合は、フィールドのすべてを指定しようとしている場合は特に、フィールドのリストで*を交換するような愚かな「最適化」を使用して主張しないでください。

読み取り可能で簡単にSQLコードを保守することは、保存されたCPUサイクルを数回、またはメモリ使用量やネットワークトラフィックを2キロバイト減らすだけの価値があります。

2

決して常にSQLで何かをすることを伝える誰に耳を傾ける - 代わりに、常にSELECT *が害を行うことができ、SQL :)以下の例で

で何かをしないようにあなたを伝える誰を警戒すると属性のcommalistが既に「内側」SCOPで指定された


例1

:読みやすさとコードの保守(DRYとすべてのことを)に関して間違いなく利益を有しますE:

SELECT * 
    FROM (
     SELECT col1, col2, col3, col4, col5 
      FROM T1 
     ) AS DT1; 

例2

CTEのテーブル値コンストラクタを使用して、1つが強制される(例えばSQL Serverで)VALUES句をテーブル式(SELECT..FROM)にラップします。

WITH T1 
    AS 
    (
     SELECT * 
     FROM (
       VALUES (1, 1, 1, 2, 1), 
        (1, 1, 2, 1, 1), 
        (1, 2, 1, 1, 1) 
      ) AS T (col1, col2, col3, col4, col5) 
    ) 
SELECT ... 

OKので、この最後のものはstrawmanのビットですが、あらゆる機会でcommalistsを使用すると、エラーの原因となったとデバッグを困難にしていることを考慮します。httpの

WITH T2 (author_name, book_title, ISBN) 
    AS 
    (
     SELECT book_title, ISBN, author_name 
     FROM (
       VALUES ('9780321189561', 'C. J. Date', 'An Introduction to Database Systems') 
      ) AS T (ISBN, author_name, book_title) 
    ) 
SELECT * 
    FROM T2; 
関連する問題