あるインタビューでこの質問をされたので、ここで共有する価値があると思いました.
私は ASP.Net で Sql Server 2008 を使用しています。私の要件は、条件なしでテーブル データを選択することです。オプションは以下のとおりです。
ストアド プロシージャ
意見
この質問も確認しましたが、探している正確な回答を得ることができません。
セキュリティ、パフォーマンスなどの観点から、条件なしで選択クエリのみを実行するにはどれを選択する必要がありますか?
あるインタビューでこの質問をされたので、ここで共有する価値があると思いました.
私は ASP.Net で Sql Server 2008 を使用しています。私の要件は、条件なしでテーブル データを選択することです。オプションは以下のとおりです。
ストアド プロシージャ
意見
この質問も確認しましたが、探している正確な回答を得ることができません。
セキュリティ、パフォーマンスなどの観点から、条件なしで選択クエリのみを実行するにはどれを選択する必要がありますか?
ビューを使用します。テーブル値関数というオプションも見逃しています。
ここには、ビュー、テーブル値関数、またはストアド プロシージャの 3 つの可能性があります。
ビューは基本的なもので、パラメータ化できません。しかし、それはより大きなクエリの一部として簡単に構成でき、オプティマイザーは (通常) ビューの本体をクエリに含めたかのように最適なプランを生成することが期待できます (実際、多くの場合、マクロに好まれます。クエリに「展開」します)。
テーブル値関数はパラメーター化できますが、データベースに副作用をもたらすことはできません。ただし、クエリを構成することは可能であり、(インライン TVF であり、追い風がある場合) オプティマイザーは、うまくいけば、最適な計画を作成できます。
ストアド プロシージャは非常に強力です。何でも実行でき、データベースに変更を加え、必要に応じて結果を計算できます。ただし、唯一の選択肢はそれを実行することです。実行は別のスコープ内で行われ、より大きなクエリに構成することはできません。
したがって、ニーズに合った上記の中で最も強力でないものを使用することをお勧めします。これは、後で他のクエリの一部として再利用できる範囲が最も広いためです。
Re: パフォーマンス - ビューに対して単純な操作を行っている場合、SELECT *
またはストアド プロシージャを実行しているだけの場合、顕著な違いはないはずです。
Re: セキュリティ - 繰り返しますが、大した違いはありません -ストアド プロシージャと同じくらい簡単にGRANT
/DENY
SELECT
ビューで実行できます。EXEC
このリンクには、必要なもののほとんどが含まれています。
上記のシナリオでは、ビューを使用する必要があると思います。ビューはテーブルの単なるスナップショットであり、テーブル全体を公開しないため、より高速で安全です。ビューは単なるデータの表現とソースであり、テーブルとビューのトランザクションに関しては、ストアド プロシージャがはるかに強力であるため...
ストアド プロシージャは、ビューまたは通常の SELECT ステートメントよりも優れたパフォーマンスを提供します。
なんで?
1) 通常の SELECT ステートメントがデータベースに渡されると、コンパイルしてから実行する必要があり、オーバーヘッドが追加されます。
2) コンパイル済みおよび実行可能なプランは、SELECT ステートメントとビューの両方で同じです。
3) ストアド プロシージャは、実行を高速化するためにプリコンパイルされています。
クエリがテーブル内のすべてのデータを選択する場合、ストア プロシージャを使用して得られる最適化はありません。これは、おそらくインデックスを使用しないため、完全なテーブル スキャンを実行するためです。「Where INDEX_WhatEverNameIs > 0」のように、NC インデックス列にダミーの where 句を挿入することで、NC インデックスを使用することができます。
誰がそれを見るべきかという点で何らかの制限がある場合、ビューが使用されます。この場合、これをメモリに保存し、毎回同じように提供するインデックス付きビューを選択できるため、ビューとして答えることができます。