誰かがより良い練習とは何かを教えてもらえますか?選択したクエリに対して、必要なすべてのIDまたはIDを返す必要がありますか?*テーブルから選択するか、テーブルからID、フィールド1、フィールド2、フィールド3を選択します。
効率?スケーラビリティ?など
おかげ
ENV:SQL Server 2008の、VS2008(VB)
誰かがより良い練習とは何かを教えてもらえますか?選択したクエリに対して、必要なすべてのIDまたはIDを返す必要がありますか?*テーブルから選択するか、テーブルからID、フィールド1、フィールド2、フィールド3を選択します。
効率?スケーラビリティ?など
おかげ
ENV:SQL Server 2008の、VS2008(VB)
select * from table1の代わりにtableのselect col1、col2、col3を使用します。これには、こことここで述べたように、多くの利点があります。
も参照してください: http://weblogs.sqlteam.com/jeffs/jeffs/archive/2007/07/26/60271.aspx
Is there a difference between Select * and Select [list each col]
、必ず明示的に列を列挙する。どのプロダクションコードでもselect *
を使用しないでください。
一見一見理解できるかもしれない状況でも、意図しない結果が生じることがあります。たとえば、テーブルのレイアウトを反映するビューがあるときにはselect *
と考えるかもしれませんが、ビューを再生成せずに基になるテーブルを変更すると奇妙なことが起こる可能性があります。
質問を入力して実行しない限り、select *
から離れてください。
常に名前付き列を使用してください。
それは悪い理由の良い例:"select * from table" vs "select colA,colB,etc from table" interesting behaviour in SqlServer2005
あなたは、ほとんどの場合、列を指定する必要がありますが、これは将来の変更やメンテナンスのために最も適しています。また、データを少なくしてパフォーマンスを向上させます。
誰かがより良いプラクティスにチャイムすることができますか?選択したクエリに対して、必要なすべてのIDまたはIDを返す必要がありますか?
カラムに名前を付けます。
これはベストプラクティスであるだけでなく、パフォーマンスを向上させることができます。
は、2つのクエリを想像:
SELECT *
FROM mytable
WHERE column1 = @somevalue
と
SELECT id, column1
FROM mytable
WHERE column1 = @somevalue
id
は、クラスタ化された主キーであるとcolumn1
上のインデックスがあります。
私はあなたのクライアントコードが可変数の列を正しく処理していると仮定しています。 e。テーブルレイアウトの変更でコードが破損することはありません。これは非常に強い仮定ですが、それを作ろうとします。
mytable
がid
とcolumn1
のみの場合、クエリは同じです。
column2
をmytable
に追加するとどうなりますか?
2番目のクエリ(名前付き列を使用)はインデックスを使用しますが、最初のクエリではcolumn2
も選択する必要があります(SQL Server
は無視されません)。
これにより、プランにClustered Table Seek
が追加され、クエリのパフォーマンスが悪化します。
クライアントコードの列名を決して参照しない限り、名前付き列を使用する必要があります。
パフォーマンスと保守性にはまだ影響があります。また、スキーマ変更のために「列3」が変更された場合はどうなりますか? – gbn
私が想定しているシナリオは、実際に返されたすべての列を反復処理し、それらを例えばそれ以上の処理を行わないHTMLテーブル。 I.とにかくすべての列が必要な場合に、行方不明またはデータ型の変更があった場合にコードが壊れないようにするには、おそらくSELECT *が使えます。 –
ええ、これも私も思ったことですが、名前付きフィールドに傾けて練習する必要があると思います。 –
をSELECT * FROM our_table
上で明示的に名前を付ける列を好む理由は明示的に プロジェクトは、私たちの意図より はっきりとそう貢献を表現するには、列に名前を付ける
私は「決して」または「常に」は、どちらか一方を使用するように指示するつもりはありません。それから始まるアドバイスはリテラルにはなりません。
あなたは小さなデータセットで作業している場合は、フィールドのすべてを指定しようとしている場合は特に、フィールドのリストで*
を交換するような愚かな「最適化」を使用して主張しないでください。
読み取り可能で簡単にSQLコードを保守することは、保存されたCPUサイクルを数回、またはメモリ使用量やネットワークトラフィックを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;
重複: //stackoverflow.com/questions/65512/which-is-fasterbest-select-or-select-column1-colum2-column3-etc –
@Jay:あなたができるからといって、あなたがするべきではない... ... –
ありますnathanが投稿したdupの素晴らしい答え。これは、「パフォーマンスが良い」理由を挙げているしばしば以下の答えになります。 – akf