3

SQL を実行するプログラムがあり、列 A、B、および C の値をテーブルに照会したいとします (厳密には必要のない列がいくつかあるとします)。SELECT * と SELECT A、B、C の違いは何ですか?

以下、今までの感想。必要な列のみを選択する:

  • ...結果を保存するために必要なメモリが少なくなります。
  • ...プログラムで結果を解析するのが少し簡単になるかもしれません。
  • ...選択された列がすべてカバリング インデックスで取得されない限り、高速にはなりません。

しかし、おそらくさらに問題が発生していると思います。

4

3 に答える 3

6

あなたの言うことは正しいですが、それ以上のものがあります。

「select *」に関するもう 1 つの非常に重要な問題は、テーブル スキーマが変更された場合にどうなるかです。クライアントが「select *」を使用すると、予期しない一連の列が取得される可能性があります (列が多い、列が少ない、順序が異なる...)。これは非常に悪いです。

クライアントが必要な正確な列名 (A、B、C) を選択すると、予想される形式 (可能な場合) または特定の明らかなエラーを含む結果セットが得られます。

また、不要な列を選択するためのメモリ消費と、場合によってはネットワーク トラフィックの問題は、「大規模な」アプリケーションにとって重要な場合があります。

于 2012-08-01T05:54:30.317 に答える
4

列名で選択すると、データベース エンジンがテーブル データを照会するのではなく、インデックスからデータにアクセスできる可能性が高くなります。

ここで読むことができる非常に関連性の高い記事

SELECT *新しい列をテーブルに追加するため、データベース スキーマが変更された場合、コードがその新しいデータを使用または表示する準備ができていなくても、システムが予期しないパフォーマンスと機能の変化にさらされます。

于 2012-08-01T05:49:36.087 に答える
1

を使用すると、クエリ処理が改善されますselect a,b,c from table。たとえば、非クラスター化インデックスのキー列である列からレコードを抽出しています。このような場合、レコードはクラスター化されていないインデックス ページから取得されるため、発行される物理データベース ページの読み取り数が少なくなります。物理ページの読み取りが少ないということは、常にパフォーマンスが向上する良い兆候です。

SQL Server に関する注意事項

  1. SQL Sever は、既定で、SELECT クエリで使用される列に関係なく、すべての列をバッファー プールにコピーします。
  2. SQL Server クエリ処理のパフォーマンスに大きな影響はありませんが、システム全体のパフォーマンスが向上するため、必要な列のみを使用することをお勧めします。

詳細 : SELECT * 対。SELECT COLUMNS – SQL Server の最適化手法

于 2012-08-01T05:48:49.707 に答える