À l'aide de points de vue au lieu de tables dans des procédures stockées?
Est-ce une bonne pratique de vues de requête à la place des matières tables des procédures stockées? (même si l'affichage ne marche pas fournir toutes les données différents)
J'ai toujours pensé qu'il pourrait être une bonne idée, parce que c'est une couche d'abstraction supplémentaire et qui est similaire à l'aide des propriétés, au lieu de variables membres de la classe de fonctions.
Mais maintenant, je regardais les procédures stockées créé par l'ASP.NET Fournisseur d'appartenances et ils ont toujours requête sur les tables directement.
Je suis conscient que vous ne pouvez pas insérer facilement des données lors de l'utilisation de points de vue, mais si la procédure stockée uniquement les requêtes de données, vous devriez toujours utiliser des tableaux directement? Si oui, quelle est la raison principale? (performance?)
OriginalL'auteur magnattic | 2011-02-05
Vous devez vous connecter pour publier un commentaire.
Vue est juste une macro qui se développe en une requête externe.
Si votre vue contient plusieurs jointures, puis quand vous rejoindre si d'autres points de vue d'un coup vous avez 20 ou 30 chemin de JOINTURE lorsque vous en fait voir 3 Jointures en SQL de la procédure stockée. Vous trouverez également que chaque requête est différent: pourquoi continuer à se joindre à la même 20 ou 30 tables pour chaque requête?
Généralement, il n'y a aucun avantage sauf si la vue est indexé/concrétisé et l'optimiseur peut l'utiliser.
Idées comme le fait d'avoir des calculs sur un seul tableau masqué par une vue doit être dans une colonne calculée: pourquoi garder le calcul? Pour un calcul sur plusieurs tables dans une vue, il devrait être indexé.
À l'aide d'une procédure stockée est déjà pas accès à la table de la base de droits de propriété (chaînage).
Il y a des bons usages de points de vue pour éviter le contact direct de la table de l'accès par les utilisateurs, ou de masquer les modifications de schéma, ou de fournir une certaine sécurité de base (par exemple basé sur SUSER_SNAME), mais pas pour la performance ou de l'idéologie
OriginalL'auteur gbn
De base de données différent optimiseurs optimiser les requêtes de différentes façons, donc ce n'est pas une réponse facile. Mais en général, l'ajout d'une couche d'abstraction peut (pas définitivement) arrêter l'optimiseur d'utiliser correctement les index.
Dans Sql Server si vous avez une clause where qui contient des appels de ce genre:
il fait un non sargable requête, c'est à dire une requête qui ne pas utiliser les index ou les utilise sous-optimale.
Je suppose que l'utilisation d'un point de vue sera également affecter la sarg. Je vais aller tester cela (Sql Server) - je reviens dans 5 minutes.
MODIFIER
Je suppose que la réponse est "ça dépend" et que vous avez besoin pour activer votre plan d'exécution de requête pour être sûr, le test suivant que je n'ai montré aucune différence entre une interrogation d'un simple point de vue basé sur une table et simplement l'interrogation de la table sous-jacente. Mais il a besoin de plus de tests comme un complexe de vue pourrait agir différemment.
C'est seulement quatre minutes!
OriginalL'auteur amelvin
J'ai utilisé les points de vue dans les procédures stockées dans ces deux cas:
1 - pour des jointures complexes ou dans des conditions qui sont nécessaires dans de multiples procédures
2 - substitution de la table renommée. Par exemple, j'ai eu deux tables, appelées "membre" et "non_member'. Plus tard, j'ai décidé de les combiner dans une table 'user'. Afin d'éviter d'avoir à modifier chaque proc je l'avais déjà écrit, j'ai créé des points de vue appelé "membre" et "non_member', qui a utilisé des clauses where pour filtrer la table 'user' de façon appropriée. Tous les procs a couru comme ils le faisaient sans modifications. Je peux les modifier pour accéder à la nouvelle table directement quand j'ai le temps.
OriginalL'auteur Ray
Dans SQL Server (au moins), ma compréhension est que les Procédures Stockées sont optimisés au moment de la compilation, et sont donc plus efficace en général que les points de vue. Je ne suis pas certain, mais je soupçonne que par l'exécution d'une SPRL sur une vue, vous risquez de perdre toute optimisation gagné de cette manière.
De plus, pourquoi? Comme une affiche précédente sugessted, vous pourriez être en cours d'exécution plus jointures que vous devez si l'un ou plusieurs des points de vue vous sont notamment sont elles-mêmes composées de nombreuses jointures, et ce ne sera pas évident.
Aussi, ma compréhension est que l'une des principales raisons de l'utilisation de vues est de présenter les données d'une table dans un format que l'utilisateur peut consommer, tout en protégeant les données de la table contre des modifications involontaires. Depuis le jeu de résultats à partir d'une procédure stockée n'est pas soumis à des INSERTIONS et MISES à jour, ce point est discutable.
Depuis une procédure stockée par la conception accepte des paramètres, ne permet pas à l'utilisateur d'interagir avec les données de la table directement, et peuvent exécuter toutes les requêtes que vous pourriez utiliser dans une vue (plus un ensemble beaucoup plus), il me semble que (avec quelques exceptions) la principale raison on pourrait faire c'est de rendre la programmation plus facile, au coût potentiel de performance et de facilité de maintenance (si quelqu'un modifie l'une de ses points de vue, sans réalisation de la procédure stockée dépend-il?).
Je vous recommande de codage dans la procédure stockée, à moins qu'il y est une raison impérieuse de le faire autrement . . .
OriginalL'auteur XIVSolutions