Select ColumnName を使用したアドホック クエリの方が優れていますが、プラン ガイドに保存された後のストアド プロシージャでは問題になるでしょうか?
6 に答える
ストアド プロシージャ内であっても、常に列を明示的に記述します。SELECT *
悪い習慣と見なされます。
たとえば、返される列の順序がわからない場合、一部のアプリケーションは特定の列の順序に依存している可能性があります。
つまり、アプリケーション コードは次のようになります。
Id = Column[0]; // bad design
IDを使用した場合SELECT *
、最初の列ではなくなり、アプリケーションがクラッシュする可能性があります。また、データベースが変更され、追加の 5 つのフィールドが追加された場合、関連しない可能性のある追加のフィールドが返されます。
これらのトピックは常に、常にこれを行う、または決してそれを行わないなどの包括的なステートメントを引き出しますが、現実は、ほとんどの場合と同様に、状況に依存します. 通常、列をリストすることは良い習慣であることは認めますが、使用することが悪い習慣であるかどうかSELECT *
は状況によって異なります。
すべてが共通のフィールドを 1 つまたは 2 つ持つさまざまなテーブルを考えてみましょう。たとえば、レイアウトが異なる多数のテーブルがありますが、それらはすべて「access_dt」と「host_ip」を持っています。通常、これらのテーブルを一緒に使用することはありませんが、疑わしいアクティビティによって、すべてのアクティビティの完全なレポートが要求される場合があります。これらは一般的ではなく、手動で確認されるため、すべてのログ テーブルをループしSELECT *
、すべてのテーブル間の共通フィールドを利用してレポートを生成するストアド プロシージャによって適切に処理されます。
この状況でフィールドをリストするのは時間の無駄です。
繰り返しますが、フィールドを一覧表示することは通常は良い習慣ですが、 を使用することが常に悪い習慣であるとは限りませんSELECT *
。
編集:例を少し明確にしようとしました。
これは一般的にベスト プラクティスですが、実際にすべての列が必要な場合は、すぐに読み取れる "SELECT *" を使用することをお勧めします。
重要なことは、必要のないデータを取得しないようにすることです。
テーブルの行を XML としてアーカイブする場合など、列が変更されたとしても、テーブルのすべての列が必要な場合については誰も言及していません。怠惰や読みやすさのために、「テーブルに現在存在するすべての列が必要です」の代わりに「SELECT *」を使用しないでください。正当な理由が必要です。「テーブルに存在する可能性のあるすべての列」が必要な場合に不可欠です。
また、テーブルの「ラッパー」ビューを作成する場合はどうですか?