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


137

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

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

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

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

  4. どちらが最も速く、どの基準でどちらが他よりも速いですか?

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

  6. プロシージャがマテリアルテーブルを作成する一方で、ビューが仮想テーブルを作成すると誰かが言ったとはどういう意味ですか?

他にもポイントがありましたら教えてください。

回答:


143

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

ストアドプロシージャは、データを更新して挿入するか、単一の値またはデータセットを返すかに関係なく、パラメーターを使用して機能を実行します。

ビューとストアドプロシージャの作成 -いつ、どのように使用するかについて、マイクロソフトからの情報があります。

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

  • tbl_user、列を持ちます:user_iduser_nameuser_pw
  • tbl_profile、列を持ちます:profile_iduser_idprofile_description

そのため、これらのテーブルからクエリを実行している場合は、SQLのすべての部分で結合を行う代わりに、次のようなビューを定義します。

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

したがって、将来的にクエリを実行profile_descriptionする場合user_id、必要なのは次のとおりです。

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

そして、user_id25 の説明が表示され25ます。

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


1
しかし、結合できるので、パラメーターを指定する必要がないストアドプロシージャの複数のテーブルを結合できます。
NoviceToDotNet

5
なぜそうするのですか?あなたは何を成し遂げようとしているのですか?ビューをテーブルとして使用できます...ストアドプロシージャは作業を行うためのものです...ビューはあなたの人生を楽にするためのものです。
Patrick

1
ビューはストアドクエリと考えてください。2つのテーブルがあり、作業に多くの結合が必要な場合、常に結合する必要がないように、反対のビューを作成できます。
Patrick

2
わかりません。もう少し説明してください。
NoviceToDotNet

2
そうですが、ビューを保存します...単一のテーブルのように呼び出すことができます。このようにして、結合を1回作成すると、将来の使用は、テーブルであるかのように、基になるSQLを呼び出すビューを直接参照します。
Patrick

107

たくさんの情報がここにあります

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

ストアドプロシージャ:

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

ビュー:

  • NOTパラメータを受け入れます
  • より大きなクエリでビルディングブロックとして使用できます
  • 1つのSELECTクエリのみを含めることができます
  • どのテーブルにも変更を加えることはできません
  • ただし、(場合によっては)INSERT、UPDATE、またはDELETEステートメントのターゲットとして使用できます。

6
また、ビューには「order by」または「top」句を
含めないでください

2
「INSERT、UPDATE、またはDELETEステートメントのターゲットとして使用できない」とはどういう意味ですか?ストアドプロシージャでINSERT、DELETE、UPDATEを使用できませんか?
Arsman Ahmad

「ビュー、パラメーターを受け入れません」、それは本当ではありませんか?ビデオの例:youtube.com/watch
v

ビューは、ベーステーブル/テーブルへの変更を行うことができます。csharp-video-tutorials.blogspot.com/2012/09/...
Khurram

8

まず、両方が異なるものであることを理解する必要があります。ステートメントにStored Procedures最適INSERT-UPDATE-DELETEです。一方ViewsSELECTステートメントに使用されます。両方を使用する必要があります。

ビューでは、データを変更することはできません。いくつかのデータベースは、あなたが使用することができ、更新可能なビューの持っているINSERT-UPDATE-DELETEのをViews


2
ビューを使用して、基になるテーブルのデータを変更できます。ビューは更新可能です。
Dot Net開発者

7

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

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

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

この記事を確認してください:ビューvsストアドプロシージャ。まさにあなたが探しているもの


5

ビューはSELECT、データベースにコンプレックスを保存する簡単な方法です。

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

  1. ビューは静的です。それらを特定のレイアウトの新しいテーブルと考えてください。その中のデータは、それを作成したクエリを使用してその場で作成されます。任意のSQLテーブルと同じように、並べ替えることができますし、それをフィルタリングしWHEREGROUP BYそしてORDER BY

  2. 何をすべきかに依存します。

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

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

  4. 私はあなたが何を話しているのか理解できません。


5

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

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

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

4

ビューのデータを変更できないと彼が示唆したとき、マヘシュはまったく正しくありません。だからパトリックの視点で

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

すべてのテーブルにすべてのフィールドが存在するわけではないため、このビューにINSERTすることはできません。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つのテーブルのみのサブセットである場合は、通常は挿入または削除できます。


3

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


1

@Patrickは彼の発言には正解ですが、他の質問に答えるために、ビューはメモリ内にそれ自体を作成します。結合のタイプによっては、データ、および実行された集約がある場合、かなりメモリを消費するビューになる可能性があります。

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

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

明らかに、多くのデータを取得していない場合、メモリテーブルの方が高速です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.