web-dev-qa-db-fra.com

Quelle est la différence entre une procédure stockée et une vue?

Je suis confus sur quelques points:

  1. Quelle est la différence entre une procédure stockée et une vue?

  2. Quand dois-je utiliser des procédures stockées et quand dois-je utiliser des vues dans SQL Server?

  3. Les vues permettent-elles la création de requêtes dynamiques où nous pouvons passer des paramètres?

  4. Lequel est le plus rapide et sur quelle base l'un est-il plus rapide que l'autre?

  5. Les vues ou les procédures stockées allouent-elles de la mémoire de manière permanente?

  6. Qu'est-ce que cela signifie si quelqu'un dit que les vues créent une table virtuelle, alors que les procédures créent une table de matériaux?

S'il vous plaît laissez-moi savoir plus de points, s'il y en a.

111
NoviceToDotNet

Une vue représente une table virtuelle . Vous pouvez joindre plusieurs tables dans une vue et utiliser cette vue pour présenter les données comme si celles-ci provenaient d'une seule table.

Une procédure stockée utilise des paramètres pour exécuter une fonction ... qu'il s'agisse de mettre à jour et d'insérer des données ou de renvoyer des valeurs uniques ou des ensembles de données.

Création de vues et de procédures stockées - Microsoft fournit des informations indiquant quand et pourquoi les utiliser.

Disons que j'ai deux tables:

tbl_user colonnes: .user_id, .user_name, .user_pw

tbl_profile Colonnes: .profile_id, .user_id .profile_description

Donc, si je me trouve interroger beaucoup de ces tables ... au lieu de faire la jointure dans CHAQUE part de sql, je définirais une vue comme:

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

Donc, à l'avenir, si je veux interroger profile_description par identifiant d'utilisateur ... tout ce que je dois faire est

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID

CE code pourrait être utilisé dans une procédure stockée telle que:

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

Alors plus tard je peux appeler

dbo.getDesc 25

et j'obtiendrai la description de l'ID utilisateur 25. où 25 est votre paramètre.

Il y a évidemment BEAUCOUP plus de détails, mais ce n’est que l’idée de base.

114
Patrick

Beaucoup d'informations disponibles sur le Web comme this

Voici un bon résumé:

Une procédure stockée:

  • accepte les paramètres
  • peut [~ # ~] pas [~ # ~] être utilisé comme bloc de construction dans une requête plus grande
  • peut contenir plusieurs instructions, boucles, IF ELSE, etc.
  • peut effectuer des modifications sur une ou plusieurs tables
  • ne peut PAS être utilisé comme cible d'une instruction INSERT, UPDATE ou DELETE.

Une vue:

  • n'accepte PAS les paramètres
  • peut être utilisé comme bloc de construction dans une requête plus grande
  • ne peut contenir qu'une seule requête SELECT
  • ne peut effectuer aucune modification sur une table
  • mais peut (parfois) être utilisé comme cible d'une instruction INSERT, UPDATE ou DELETE.
78
cusimar9

Vous devez d'abord comprendre que les deux sont des choses différentes. Les procédures stockées sont mieux utilisées pour les instructions INSERT-UPDATE-DELETE. Les vues sont utilisées pour les instructions SELECT. et vous devriez utiliser les deux.

Dans les vues, vous ne pouvez pas modifier les données. Certaines bases de données ont des vues modifiables dans lesquelles vous pouvez utiliser INSERT-UPDATE-DELETE sur des vues.

9
Mahesh

Une vue SQL est une table virtuelle basée sur une requête SQL SELECT. Une vue fait référence à une ou plusieurs tables de base de données existantes ou à d'autres vues. Il s'agit de la capture instantanée de la base de données, tandis qu'une procédure stockée est un groupe d'instructions Transact-SQL compilées dans un seul plan d'exécution.

View est une simple présentation des données stockées dans les tables de la base de données, tandis qu'une procédure stockée est un groupe d'instructions pouvant être exécutées.

Une vue est plus rapide car elle affiche les données des tables référencées, tandis qu'une procédure de stockage exécute des instructions SQL.

Consultez cet article: View vs Stored Procedures . Exactement ce que vous cherchez

5
reggie

Une vue est un moyen simple de sauvegarder un complexe SELECT dans la base de données.

Une procédure de stockage est utilisée lorsque le simple SQL ne suffit pas. Les procédures stockées contiennent des variables, des boucles et des appels à d'autres procédures stockées. C'est un langage de programmation, pas un langage de requête.

  1. Les vues sont statiques. Considérez-les comme de nouvelles tables présentant une certaine disposition. Les données qu’elles contiennent sont créées instantanément à l’aide de la requête que vous avez créée. Comme avec n'importe quelle table SQL, vous pouvez la trier et la filtrer avec WHERE, GROUP BY et ORDER BY.

  2. Cela dépend de ce que vous faites.

  3. Le dépend de la base de données. Des vues simples exécutent simplement la requête et filtrent le résultat. Mais des bases de données comme Oracle permettent de créer une vue "matérialisée" qui est essentiellement une table qui est mise à jour automatiquement lorsque les données sous-jacentes de la vue changent.

    Une vue matérialisée vous permet de créer des index sur les colonnes de la vue (en particulier sur les colonnes calculées qui n'existent nulle part dans la base de données).

  4. Je ne comprends pas de quoi tu parles.

5
Aaron Digulla
  1. Une vue est une requête dynamique dans laquelle vous pouvez utiliser une clause "WHERE"
  2. Une procédure stockée est une sélection de données fixe, qui renvoie un résultat prédéfini
  3. Ni une vue, ni une procédure stockée allouer de la mémoire. Seulement une vue matérialisée
  4. Une table est juste une entité, une vue peut collecter des données de différentes entités ou tables
3
swissben

La principale différence est que lorsque vous interrogez une vue, sa définition est collée dans votre requête. La procédure pourrait également donner les résultats de la requête, mais elle est compilée et donc beaucoup plus rapidement. Une autre option est les vues indexées.

3
rsc

Mahesh n’a pas tout à fait raison de suggérer que vous ne pouvez pas modifier les données dans une vue. Donc, avec la vue de Patrick

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

Je peux mettre à jour les données ... par exemple, je peux faire l'une de ces choses ...

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

ou

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

Vous ne pouvez pas INSERER dans cette vue car tous les champs de la table ne sont pas présents et je suppose que PROFILE_ID est la clé primaire et ne peut pas être NULL. Cependant, vous pouvez parfois insérer dans une vue ...

J'ai créé une vue sur une table existante en utilisant ...

Create View Junk as SELECT * from [TableName]

ENSUITE

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

et

DELETE from Junk Where ID>4

L'INSERT et le DELETE ont tous deux travaillé dans ce cas

De toute évidence, vous ne pouvez pas mettre à jour les champs agrégés ou calculés, mais toute vue qui est simplement une vue directe doit pouvoir être mise à jour.

Si la vue contient plus d'une table, vous ne pouvez pas insérer ou supprimer, mais si la vue est un sous-ensemble d'une seule table, vous le pouvez généralement.

2
Glyn Roberts

En plus des commentaires ci-dessus, je voudrais ajouter quelques points à propos de Views.

  1. Les vues peuvent être utilisées pour masquer la complexité. Imaginez un scénario dans lequel cinq personnes travaillent sur un projet, mais une seule d'entre elles est trop bonne pour les bases de données telles que les jointures complexes. Dans un tel scénario, il peut créer des vues qui peuvent être facilement interrogées par les autres membres de l'équipe lorsqu'ils interrogent une seule table.
  2. La sécurité peut être facilement implémentée par Views. Supposons que nous ayons une table Employee qui contient des colonnes sensibles comme Salary, numéro SSN. Ces colonnes ne sont pas censées être visibles pour les utilisateurs qui ne sont pas autorisés à les voir. Dans ce cas, nous pouvons créer une vue en sélectionnant les colonnes d’une table ne nécessitant pas d’autorisation telle que Nom , Age , etc., sans exposer les colonnes sensibles (telles que Salary, etc., que nous avons déjà mentionnées). Nous pouvons maintenant supprimer l'autorisation d'interroger directement la table Employee et conserver simplement l'autorisation de lecture dans la vue. De cette manière, nous pouvons implémenter la sécurité à l'aide de Views.
1
Ajendra Prasad

@Patrick est correct avec ce qu'il a dit, mais pour répondre à vos autres questions, une vue se créera d'elle-même dans la mémoire. Selon le type de jointure, de données et, si une agrégation est effectuée, la vue risque d'être très gourmande en mémoire.

Les procédures stockées effectuent tout leur traitement en utilisant Table de hachage temporaire, par exemple # tmpTable1 ou en mémoire avec @ tmpTable1. En fonction de ce que vous voulez lui dire de faire.

Une procédure stockée est comme une fonction, mais est appelée directement par son nom. au lieu de fonctions réellement utilisées dans une requête elle-même.

Évidemment, la plupart du temps, les tables de mémoire sont plus rapides si vous ne récupérez pas beaucoup de données.

1
Robbie Tapping