私はいくつかの点について混乱しています:
ストアドプロシージャとビューの違いは何ですか?
SQL Serverでいつストアドプロシージャを使用し、いつビューを使用する必要がありますか?
ビューでは、パラメータを渡すことができる動的クエリを作成できますか?
どちらが最速で、どの基準で一方が他方より速くなりますか?
ビューまたはストアドプロシージャはメモリを永続的に割り当てますか?
ビューが仮想テーブルを作成し、プロシージャが材料テーブルを作成すると誰かが言ったらどういう意味ですか?
もしあれば、もっと多くのポイントを教えてください。
ビューは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はパラメーターです。
明らかにもっと多くの詳細がありますが、これは単なる基本的な考え方です。
this のようなウェブ上で利用可能な多くの情報
ここに良い要約があります:
ストアドプロシージャ:
Aビュー:
最初に理解する必要があります両方は異なるものです。ストアドプロシージャは、INSERT-UPDATE-DELETEステートメントに最適です。ビューはSELECTステートメントに使用されます。両方を使用する必要があります。
ビューでは、データを変更できません。 一部のデータベースには、ビューでINSERT-UPDATE-DELETEを使用できる更新可能なビューがあります。
SQLビューは、SQL SELECTクエリに基づいた仮想テーブルです。ビューは、1つ以上の既存のデータベーステーブルまたは他のビューを参照します。ストアドプロシージャは、単一の実行プランにコンパイルされたTransact-SQLステートメントのグループであるのに対して、データベースのスナップショットです。
ビューは、データベーステーブルに格納されたデータを表示するシンプルなものですが、ストアドプロシージャは実行可能なステートメントのグループです。
ストアドプロシージャがsqlステートメントを実行するのに対し、ビューは参照されるテーブルのデータを表示するため、高速です。
この記事を確認してください: View vs Stored Procedures 。まさにあなたが探しているもの
ビューは、複雑なSELECT
をデータベースに保存する簡単な方法です。
単純なSQLでは不十分な場合に、ストアプロシージャが使用されます。ストアプロシージャには、変数、ループ、および他のストアドプロシージャの呼び出しが含まれます。これはプログラミング言語であり、クエリ言語ではありません。
ビューは静的です。それらを特定のレイアウトを持つ新しいテーブルと考えてください。テーブル内のデータは、作成したクエリを使用してその場で作成されます。他のSQLテーブルと同様に、WHERE
、GROUP BY
、およびORDER BY
でソートおよびフィルタリングできます。
何をするかによります。
これはデータベースに依存します。単純なビューはクエリを実行し、結果をフィルタリングするだけです。しかし、Oracleのようなデータベースでは、基本的なビューの基本データが変更されると自動的に更新されるテーブルである「マテリアライズド」ビューを作成できます。
マテリアライズドビューを使用すると、ビューの列(特にデータベース内に存在しない計算列)にインデックスを作成できます。
何を言っているのか分かりません。
主な違いは、ビューをクエリするとき、その定義がクエリに貼り付けられることです。プロシージャはクエリの結果を提供することもできますが、コンパイルされており、非常に高速です。別のオプションはインデックス付きビューです。
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つのテーブルのみのサブセットである場合、通常は可能です。
上記のコメントに加えて、ビューに関するいくつかのポイントを追加したいと思います。
@Patrickは彼が言ったことは正しいですが、他の質問に答えるために、ビューはメモリ内に自分自身を作成します。また、結合、データのタイプによっては、集計が行われた場合、かなりメモリを消費するビューになります。
ストアドプロシージャは、すべての処理を一時ハッシュテーブル(例:#tmpTable1)を使用するか、メモリ内で@ tmpTable1を使用して実行します。何を伝えたいかによって異なります。
ストアドプロシージャは関数に似ていますが、名前で直接呼び出されます。クエリ自体の中で実際に使用される関数の代わりに。
大量のデータを取得しない場合、ほとんどの場合、メモリテーブルの方が明らかに高速です。