web-dev-qa-db-ja.com

ストアドプロシージャとビューの違いは何ですか?

私はいくつかの点について混乱しています:

  1. ストアドプロシージャとビューの違いは何ですか?

  2. SQL Serverでいつストアドプロシージャを使用し、いつビューを使用する必要がありますか?

  3. ビューでは、パラメータを渡すことができる動的クエリを作成できますか?

  4. どちらが最速で、どの基準で一方が他方より速くなりますか?

  5. ビューまたはストアドプロシージャはメモリを永続的に割り当てますか?

  6. ビューが仮想テーブルを作成し、プロシージャが材料テーブルを作成すると誰かが言ったらどういう意味ですか?

もしあれば、もっと多くのポイントを教えてください。

111
NoviceToDotNet

ビューはvirtualテーブルを表します。ビュー内の複数のテーブルを結合し、ビューを使用して、データが単一のテーブルから来ているかのようにデータを表示できます。

ストアドプロシージャは、パラメータを使用して関数を実行します。データを更新および挿入する場合でも、単一の値またはデータセットを返す場合でも。

ビューとストアドプロシージャの作成 -それぞれを使用するタイミングと理由に関するMicrosoftからの情報が含まれています。

2つのテーブルがあるとします。

tbl_userの列:.user_id、.user_name、.user_pw

tbl_profileの列:.profile_id、.user_id .profile_description

したがって、もし自分がこれらのテーブルからクエリを実行していることに気づいたら...

CREATE View vw_user_profile
AS
  Select A.user_id, B.profile_description
  FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id
GO

だから将来的に私がユーザーIDでprofile_descriptionを照会したい場合...私がしなければならないことはすべてです

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

そのコードは、次のようなストアドプロシージャで使用できます。

create procedure dbo.getDesc
 @ID int
AS
begin
SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
END
GO

後で電話することができます

dbo.getDesc 25

ユーザーID 25の説明を取得します。25はパラメーターです。

明らかにもっと多くの詳細がありますが、これは単なる基本的な考え方です。

114
Patrick

this のようなウェブ上で利用可能な多くの情報

ここに良い要約があります:

ストアドプロシージャ:

  • パラメータを受け入れます
  • NOTは、より大きなクエリでビルディングブロックとして使用できます
  • 複数のステートメント、ループ、IF ELSEなどを含めることができます。
  • 1つまたは複数のテーブルの変更を実行できます
  • iNSERT、UPDATE、またはDELETEステートメントのターゲットとして使用することはできません。

Aビュー:

  • パラメータを受け入れない
  • より大きなクエリの構成要素として使用できます
  • 単一のSELECTクエリのみを含めることができます
  • どのテーブルも変更できません
  • ただし、(時々)INSERT、UPDATE、またはDELETEステートメントのターゲットとして使用できます。
78
cusimar9

最初に理解する必要があります両方は異なるものです。ストアドプロシージャは、INSERT-UPDATE-DELETEステートメントに最適です。ビューはSELECTステートメントに使用されます。両方を使用する必要があります。

ビューでは、データを変更できません。 一部のデータベースには、ビューでINSERT-UPDATE-DELETEを使用できる更新可能なビューがあります。

9
Mahesh

SQLビューは、SQL SELECTクエリに基づいた仮想テーブルです。ビューは、1つ以上の既存のデータベーステーブルまたは他のビューを参照します。ストアドプロシージャは、単一の実行プランにコンパイルされたTransact-SQLステートメントのグループであるのに対して、データベースのスナップショットです。

ビューは、データベーステーブルに格納されたデータを表示するシンプルなものですが、ストアドプロシージャは実行可能なステートメントのグループです。

ストアドプロシージャがsqlステートメントを実行するのに対し、ビューは参照されるテーブルのデータを表示するため、高速です。

この記事を確認してください: View vs Stored Procedures 。まさにあなたが探しているもの

5
reggie

ビューは、複雑なSELECTをデータベースに保存する簡単な方法です。

単純なSQLでは不十分な場合に、ストアプロシージャが使用されます。ストアプロシージャには、変数、ループ、および他のストアドプロシージャの呼び出しが含まれます。これはプログラミング言語であり、クエリ言語ではありません。

  1. ビューは静的です。それらを特定のレイアウトを持つ新しいテーブルと考えてください。テーブル内のデータは、作成したクエリを使用してその場で作成されます。他のSQLテーブルと同様に、WHEREGROUP BY、およびORDER BYでソートおよびフィルタリングできます。

  2. 何をするかによります。

  3. これはデータベースに依存します。単純なビューはクエリを実行し、結果をフィルタリングするだけです。しかし、Oracleのようなデータベースでは、基本的なビューの基本データが変更されると自動的に更新されるテーブルである「マテリアライズド」ビューを作成できます。

    マテリアライズドビューを使用すると、ビューの列(特にデータベース内に存在しない計算列)にインデックスを作成できます。

  4. 何を言っているのか分かりません。

5
Aaron Digulla
  1. VIEWは、 "WHERE"句を使用できる動的クエリです
  2. ストアドプロシージャは、事前に定義された結果を返す固定データ選択です。
  3. ビューもストアドプロシージャもメモリを割り当てません。マテリアライズドビューのみ
  4. TABLEはただ1つのENTITYであり、ビューは異なるENTITIESまたはTABLESからデータを収集できます
3
swissben

主な違いは、ビューをクエリするとき、その定義がクエリに貼り付けられることです。プロシージャはクエリの結果を提供することもできますが、コンパイルされており、非常に高速です。別のオプションはインデックス付きビューです。

3
rsc

Maheshは、ビュー内のデータを変更できないことを示唆している場合、まったく正しくありません。パトリックの見解で

CREATE View vw_user_profile AS 
Select A.user_id, B.profile_description
FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id

データを更新することができます...例として、これらのいずれかを行うことができます...

Update vw_user_profile Set profile_description='Manager' where user_id=4

または

Update tbl_profile Set profile_description='Manager' where user_id=4

すべてのテーブルのすべてのフィールドが存在するわけではないため、このビューに挿入することはできません。PROFILE_IDが主キーであり、NULLにできないと仮定しています。ただし、ビューに挿入することもできます...

を使用して既存のテーブルにビューを作成しました...

Create View Junk as SELECT * from [TableName]

その後

Insert into junk (Code,name) values 
('glyn','Glyn Roberts'),
('Mary','Maryann Roberts')

そして

DELETE from Junk Where ID>4

この場合、INSERTとDELETEの両方が機能しました

明らかに、集計または計算されたフィールドを更新することはできませんが、単純なビューであるビューは更新可能でなければなりません。

ビューに複数のテーブルが含まれる場合、挿入または削除はできませんが、ビューが1つのテーブルのみのサブセットである場合、通常は可能です。

2
Glyn Roberts

上記のコメントに加えて、ビューに関するいくつかのポイントを追加したいと思います。

  1. ビューを使用して複雑さを隠すことができます。 5人がプロジェクトに取り組んでいるが、そのうちの1人だけが複雑な結合のようなデータベースのものではあまりに優れているシナリオを想像してください。このようなシナリオでは、他のチームメンバーが単一のテーブルを照会しているときに簡単に照会できるビューを作成できます。
  2. ビューによってセキュリティを簡単に実装できます。 Table -EmployeeSalarySSN numberのような機密性の高い列が含まれているとします。これらの列は、表示を許可されていないユーザーには表示されません。このような場合、NameAgeなどの承認を必要としないテーブルの列を選択するビューを作成できますなど、機密性の高い列(前述の給与など)を公開しません。これで、テーブルEmployeeを直接クエリする権限を削除し、ビューの読み取り権限を維持できます。このようにして、ビューを使用してセキュリティを実装できます。
1
Ajendra Prasad

@Patrickは彼が言ったことは正しいですが、他の質問に答えるために、ビューはメモリ内に自分自身を作成し​​ます。また、結合、データのタイプによっては、集計が行われた場合、かなりメモリを消費するビューになります。

ストアドプロシージャは、すべての処理を一時ハッシュテーブル(例:#tmpTable1)を使用するか、メモリ内で@ tmpTable1を使用して実行します。何を伝えたいかによって異なります。

ストアドプロシージャは関数に似ていますが、名前で直接呼び出されます。クエリ自体の中で実際に使用される関数の代わりに。

大量のデータを取得しない場合、ほとんどの場合、メモリテーブルの方が明らかに高速です。

1
Robbie Tapping