-2

重複の可能性:
select * と select column

ストアド プロシージャでクエリ コマンドを指定する際の SQL Server のパフォーマンスについて、同僚の 1 人と話し合っていました。

だから私はどちらが他のものよりも好まれているのか、そしてその背後にある具体的な理由は何かを知りたい.

Employees (EmpName,EmpAddress) という 1 つのテーブルがあるとします。

そして、テーブルからすべてのレコードを選択したいと考えています。したがって、クエリは 2 つの方法で記述できます。

  1. 従業員から*を選択

  2. 従業員から EmpName、EmpAddress を選択

したがって、上記のクエリに特定の違いやパフォーマンスの問題があるのか​​ 、それとも SQL Server Engine と同じだけなのかを知りたいです。

アップデート:

  1. テーブルのスキーマはもう変更されないとしましょう。したがって、将来のメンテナンスの意味はありません。
  2. パフォーマンスに関して言えば、使用率が非常に高く、データベース サーバーで 1 秒あたり数百万回のヒットが発生しています。両方のアプローチについて、明確で正確なパフォーマンス評価が必要です。
  3. テーブル全体に対してインデックス作成は行われません。
4

4 に答える 4

8

テーブルに列を追加すると、特定の違いはその醜い頭を示します。

突然、2つの列を返すと予想していたクエリが3つを返すようになりました。2つの列用に特別にコーディングした場合、残りのコードは壊れています。

パフォーマンスに関しては、違いはないはずです。

私は常に、データベースを扱うときはできるだけ具体的にすることが最善であるというアプローチを取ります。テーブルに2つの列があり、それらの2つの列のみが必要な場合は、具体的に指定してください。これらの2つの列を指定します。それは将来あなたの頭痛を救うでしょう。

于 2013-01-21T18:00:25.420 に答える
7

常に列を明示的に参照する必要があります。このように、テーブル構造が変更された場合 (そして、そのような変更がインテリジェントな後方互換性のある方法で行われた場合)、クエリは引き続き機能し、時間の経過とともに変更できます。

また、テーブルのすべての列が実際に必要な場合を除き (一般的ではありません)、SELECT * を使用すると、必要以上のデータがアプリケーションに取り込まれ、より狭いカバーで満たされる可能性のあるものではなく、クラスター化されたインデックス スキャンが強制される可能性があります。索引。

于 2013-01-21T18:02:02.613 に答える
7

私も「できるだけ具体的に」というルールを熱心に支持しています。それに従わないと、長期的にはあなたを傷つけます。しかし、あなたの質問は別の背景から来ているようですので、私に答えさせてください。


クエリを SQL Server に送信すると、いくつかの段階を経ます。

  1. ネットワークを介したクエリ文字列の送信。
  2. クエリ文字列の解析、解析ツリーの生成
  3. 解析ツリー内の参照オブジェクトを既存のオブジェクトにリンクする
  4. 統計と行数/サイズの見積もりに基づく最適化
  5. 実行中
  6. ネットワークを介した結果データの送信

それぞれを見てみましょう:

  1. * クエリは数バイト短いので、これを実行すると速くなります
  2. * クエリに含まれる「トークン」が少ないため、(!) 高速になるはずです
  3. リンク中に、列のリストを取得してクエリ文字列と比較する必要があります。ここで、「*」は実際の列参照に解決されます。コードにアクセスしないと、どちらのバージョンのサイクルが少ないかはわかりませんが、アクセスされるデータの量はほぼ同じであるため、これは似ているはずです。
  4. -6. これらの段階では、2 つのサンプル クエリに違いはありません。どちらも同じ実行プランにコンパイルされるためです。

これらすべてを考慮すると、*表記法を使用すると、おそらく数ナノ秒節約できます。ただし、例は非常に単純化されています。より複雑な例では、複数テーブルの結合でテーブルの列のサブセットとして指定すると、*. その場合、明示的なクエリの方が高速であることはほぼ確実です。

上記の比較では、SQL Server プロセスが 1 つのプロセッサで単独で実行されており、他のクエリが同時に送信されていないことも前提としています。プロセスがコンパイル中に譲らなければならない場合、それらの余分なサイクルは、節約しようとしているサイクルよりもはるかに多くなります。

したがって、私たちが話している節約の量は、実際の実行時間と比較して非常にわずかであり、「悪い」コーディング慣行の言い訳として使用するべきではありません。

これがあなたの質問に答えることを願っています。

于 2013-01-21T19:01:44.970 に答える
1

パフォーマンスに関しては、これら2つの間に違いはないと思いますが、これら2つは異なる場合に使用され、違いが生じる可能性があります。
少し大きなテーブルを検討してください。テーブル (従業員) に 10 列が含まれている場合、最初のクエリはテーブルのすべての情報を保持します。しかし、2 番目のクエリでは、必要な列の情報を指定できます。すべての列名を指定するよりも、従業員番号 1 の情報が最適です。
もちろん、テーブルを ALTER する必要がある場合、これら 2 つは等しくありません。

于 2013-01-21T18:10:13.563 に答える