与えられたあなたのあなたがいることを仕様しているすべての列を選択し、ほとんど差があり 、この時点では。ただし、データベーススキーマは変更されることに注意してください。使用SELECT *
すると、テーブルに新しい列が追加されますが、コードはその新しいデータを使用または提示する準備ができていません。これは、予期しないパフォーマンスと機能の変更にシステムをさらしていることを意味します。
これを小さなコストとして却下してもかまいませんが、不要な列は次のようにする必要があることに注意してください。
- データベースから読み取る
- ネットワーク経由で送信
- プロセスにマーシャリング
- (ADOタイプのテクノロジの場合)メモリ内のデータテーブルに保存
- 無視して破棄/ガベージコレクション
アイテム#1には潜在的なカバーインデックスの排除、データページの読み込み(およびサーバーキャッシュのスラッシング)の原因、行/ページ/テーブルのロックの発生など、他の方法では回避できる可能性のある多くの隠れたコストがあります。
これを、列を指定することによる潜在的な節約と対比*
し、唯一の潜在的な節約は次のとおりです。
- プログラマーはSQLを再訪して列を追加する必要はありません
- SQLのネットワーク転送はより小さく/より高速です
- SQL Serverクエリの解析/検証時間
- SQL Serverクエリプランキャッシュ
項目1の場合、実際には、とにかく追加する可能性のある新しい列を使用するようにコードを追加または変更するので、それは洗浄です。
項目2の場合、違いがパケットサイズやネットワークパケットの数を変えるのに十分ではありません。SQLステートメントの送信時間が主な問題となるポイントに達した場合は、最初にステートメントの割合を減らす必要があるでしょう。
項目3の場合、*
とにかく展開を行う必要があるため、節約はありません。つまり、テーブルスキーマを参照する必要があります。現実的には、列を一覧表示してもスキーマに対して検証する必要があるため、同じコストがかかります。つまり、これは完全な洗浄です。
あなたが特定の列を指定するときの項目4については、クエリプランのキャッシュがより大きな得ることができる唯一のあなたは(あなたが指定したものではありません)列の異なるセットを扱っている場合。この場合は、あなたがしたいですか、必要に応じて別の計画をしたいので、異なるキャッシュエントリを。
したがって、質問を指定した方法が原因で、スキーマの最終的な変更に直面した場合の問題の回復力が低下します。このスキーマをROMに書き込んでいる場合(それが発生する場合)は、*
完全に許容可能です。
ただし、私の一般的なガイドラインでは、必要な列のみを選択する必要があります。つまり、すべての列を要求しているように見えることもありますが、DBAとスキーマの進化により、クエリに大きな影響を与える可能性がある新しい列が表示される場合があります。
私のアドバイスは、常に特定の列を選択する必要があるということです。何度も上手にできるようになることを忘れないでください。そのため、正しいことをする習慣を身に付けてください。
コードを変更しなくてもスキーマが変更される理由について疑問がある場合は、監査ログ、有効/有効期限、およびコンプライアンスの問題のためにDBAが体系的に追加するその他の同様のものについて考えてください。根本的な変更の別の原因は、システムまたはユーザー定義フィールドの他の場所でのパフォーマンスの非正規化です。