Je veux savoir quelle est la différence entre une requête et une vue en termes de performances. Et si une vue est coûteux, quoi d'autre à part une requête je pourrais faire pour améliorer les performances?
Points de vue et des requêtes ad-hoc, dans les cas les plus simples, sont presque identiques en termes de performances. Si bien que quand vous programme avec une vue, vous devriez penser à elle en tant que bien que le texte de la définition de la vue ont été coupé et collé dans votre requête parent.
HLGEM le souligne dans sa réponse que certaines éditions de SQL Server vous permet de "index" vues -- dans ce cas, les coulisses de SQL Server conserve les mêmes structures qui sous-tendent une table, une vue indexée et une table très similaires en termes de performance.
Dans SQL Server, mais vous pouvez généralement nid vues assez libéralement sans se heurter à des problèmes de performances, il peut rendre les choses plus difficiles à comprendre et à déboguer.
Sauf quand ils ne le sont pas. Avoir ce problème dès maintenant. De requêtes Ad-hoc est un ordre de grandeur plus rapide que la même requête transformé en une Vue. Il faut donc toujours penser à deux fois. ce n'est pas vraiment un commentaire, à moins que vous pouvez expliquer les circonstances dans lesquelles cela pourrait être le cas.
Je ne peux pas parler pour toutes les bases de données, mais dans SQL Server, vous ne peut pas indexer les points de vue, sauf si vous avez une version Entreprise. Une vue indexée peut être considérablement plus pauvres en termes de performances que d'une requête surtout si vous écrivez une requête à l'encontre d'ajouter certains où les conditions. Les vues indexées pouvez généralement effectuer assez bien. Une vue indexée peut également être à l'encontre de plusieurs champs qui sont dans les différentes tables et qui peuvent améliorer la performance sur la requête ad hoc. (Il ne peut pas trop, pour le réglage des performances, vous devez toujours tester par rapport à votre situation particulière.)
Un point de vue, c'est qu'ils ne permettent pas pour le moment de l'exécution de sélection de critères. Donc, souvent, vous vous retrouvez avec à la fois une vue et une requête.
Les vues peuvent être plus facilement mis à jour (Juste ajouter que la nouvelle table dans une jointure et de tout accès à des rapports financiers a disposition), mais ils sont beaucoup plus difficiles à réglage de la performance. C'est en partie parce qu'ils ont tendance à être plus généralisée et sont donc plus lents que leurs homologues qui ne retourne que le minimum nécessaire. Et oui comme Jonathan dit, vous pouvez bien trop facilement obtenir en s'unissant vues pour un rapport dans un désordre qui rejoint les mêmes grandes tables beaucoup plus de fois que de besoin, et est très lent.
Deux endroits où les points de vue de cireur est:
S'assurer que les relations complexes sont toujours correctement décrits. C'est une des raisons pourquoi les auteurs ont tendance à les favoriser.
La limitation de l'accès à un sous-ensemble d'enregistrements
Il y a aussi des restrictions sur le type de requêtes qui peuvent être faites pour une vue vice une requête ad hoc ou d'une procédure stockée. Par exemple, vous ne pouvez pas utiliser une instruction if (ou autre procédure le code de type: boucles) ou comme l'a noté ci-dessus, vous ne peut pas fournir des valeurs d'exécution de la où critères.
Un endroit où les points de vue sont souvent nettement plus lent, c'est quand ils appellent d'autres points de vue. Les visions sous-jacentes doivent être entièrement réalisé dans certaines bases de données, et donc vous pourriez avoir besoin pour callup 4,459,203 dossiers pour voir les 10 en définitive, vous êtes intéressé dans. Début à la couche de cela plus d'une fois et il peut devenir très lent, très rapide; point de vue qui appellent les vues sont tout simplement une mauvaise pratique.
Dans SQL Server je crois que la différence de performances entre les vues et les requêtes est négligeable. Ce que je recommande de faire pour améliorer les performances est de créer une autre table qui contient les résultats de la vue. Vous pourriez peut-être créer une table intermédiaire où de nouvelles données, puis une procédure stockée peut être exécuté à un certain intervalle de temps qui remplit la table de travail avec les nouvelles informations. Un déclencheur peut être bon pour cette fin. Selon les exigences de votre application de cette conception peut ou peut ne pas être approprié. Si vous travaillez avec des données en temps quasi réel, cette approche conduira à des problèmes de concurrence,...
Une autre chose à regarder dans, est à faire absolument sûr que les tables de base que vous utilisez pour construire votre point de vue sont indexés correctement, et que la requête elle-même est optimisé. Enfin, je crois que c'est possible dans SQL Server enterprise pour créer des vues indexées bien que je ne les ai pas utilisé avant.
Gérée manuellement 'matérialiser des tables de requêtes", sont généralement diaboliquement difficile et coûteuse (en termes de performances) pour maintenir avec précision, même en ignorant le coût de l'espace disque.
Si ils font exactement la même chose d'un point de vue pourrait être un peu plus rapide sur la première exécution, comme le serveur de base de données aura un plan d'exécution précompilé pour elle. Tout dépend de votre serveur.
Empasis sur la puissance et légèrement...
Juste pour préciser à partir d'un Oracle point de vue, points de vue n'ont pas de plan d'exécution stockée associés avec eux sur cette plate-forme. La définition de la vue est fusionné dans la requête et la requête est optimisée.
Vue de promouvoir la réutilisation du code et peut abstraire la base de données de la complexité de donner une cohérence à la "business" modèle de données. Cependant, ils ne sont pas presque aussi ajustable. Vous pouvez vous trouver dans une position où vous avez besoin de fournir des indicateurs de jointure ou d'autres à faible niveau d'optimisations et de nombreux DBA avec qui j'ai travaillé ne les aime pas être appliquée à des points de vue qu'ils peuvent ensuite être réutilisées dans de nombreuses requêtes, l'opinion que ces types de conseils devrait être utilisé avec toute la modération possible. J'aime utiliser des vues sur moi-même.
Vue est à peine plus chère à l'ordinateur qu'à la rédaction de la requête en main. Une vue peut enregistrer le programmeur/user beaucoup de temps à écrire la même requête de temps après le temps, et de faire des erreurs, et ainsi de suite. L'affichage peut également être la seule façon d'accéder aux données si les vues sont aussi utilisées pour faire respecter l'autorisation (contrôle d'accès) sur les tables sous-jacentes.
Si la requête ne fonctionne pas correctement, vous avez besoin d'examiner la façon dont la requête est formée, et si les tables ont tous les index appropriés. Si votre système a besoin de statistiques précises pour que l'optimiseur de bien performer, avez-vous mis à jour les statistiques suffisamment récemment?
Il était une fois il y a longtemps, je suis tombé sur un système où un générateur de requêtes avait créé une requête qui a inscrit dix-sept tables dans une seule clause from, y compris plusieurs JOINTURE EXTERNE GAUCHE d'une table avec elle-même. Et, en fait, un examen plus approfondi a révélé que plusieurs des "tables" étaient en fait des multi-vues de table, et certains d'entre eux ont également participé auto-jointures externes, et étaient eux-mêmes impliqués dans des auto-jointures externes de la vue. Dire "horrible" est un euphémisme. Il y avait beaucoup de nettoyage possible d'améliorer les performances de la requête en éliminant inutile jointures externes, des jointures automatiques, et ainsi de suite. (Il fait antérieur à la date de l'explicite rejoindre la notation de SQL-92 - je l'ai dit il y a longtemps, de sorte que la syntaxe de jointure externe a été SGBD spécifique.)
Ugh, j'ai vu ces points de vue qui appel vues avant (nous avons presque perdu un client au cours de leur mauvaise performance que j'ai été appelée pour aider à corriger) et ils sont brutaux de maintenir ainsi que horrible pour les performances ( et oui joindre à même de plusieurs millions de record muiltiple temps pour obtenir le champ de la intial points de vue n'a pas besoin, berk). Ces types de choses assez bien raté notre revue de code maintenant!
Si vous voulez dire que les performances du réseau, puis travailler à partir d'un cache local (comme avec ADO.Net ensembles de données) permettrait de réduire le trafic réseau - mais il pourrait causer des problèmes avec verrouillage. Juste une pensée.
Un point de vue est toujours une requête, c'est juste les résumés de certaines parties de celui-ci afin que vos requêtes peuvent être simplifiés (si ils font des choses similaires) et de maximiser la réutilisation.
Points de vue et des requêtes ad-hoc, dans les cas les plus simples, sont presque identiques en termes de performances. Si bien que quand vous programme avec une vue, vous devriez penser à elle en tant que bien que le texte de la définition de la vue ont été coupé et collé dans votre requête parent.
HLGEM le souligne dans sa réponse que certaines éditions de SQL Server vous permet de "index" vues -- dans ce cas, les coulisses de SQL Server conserve les mêmes structures qui sous-tendent une table, une vue indexée et une table très similaires en termes de performance.
Dans SQL Server, mais vous pouvez généralement nid vues assez libéralement sans se heurter à des problèmes de performances, il peut rendre les choses plus difficiles à comprendre et à déboguer.
ce n'est pas vraiment un commentaire, à moins que vous pouvez expliquer les circonstances dans lesquelles cela pourrait être le cas.
OriginalL'auteur Dave Markle
Je ne peux pas parler pour toutes les bases de données, mais dans SQL Server, vous ne peut pas indexer les points de vue, sauf si vous avez une version Entreprise. Une vue indexée peut être considérablement plus pauvres en termes de performances que d'une requête surtout si vous écrivez une requête à l'encontre d'ajouter certains où les conditions. Les vues indexées pouvez généralement effectuer assez bien. Une vue indexée peut également être à l'encontre de plusieurs champs qui sont dans les différentes tables et qui peuvent améliorer la performance sur la requête ad hoc. (Il ne peut pas trop, pour le réglage des performances, vous devez toujours tester par rapport à votre situation particulière.)
Un point de vue, c'est qu'ils ne permettent pas pour le moment de l'exécution de sélection de critères. Donc, souvent, vous vous retrouvez avec à la fois une vue et une requête.
Les vues peuvent être plus facilement mis à jour (Juste ajouter que la nouvelle table dans une jointure et de tout accès à des rapports financiers a disposition), mais ils sont beaucoup plus difficiles à réglage de la performance. C'est en partie parce qu'ils ont tendance à être plus généralisée et sont donc plus lents que leurs homologues qui ne retourne que le minimum nécessaire. Et oui comme Jonathan dit, vous pouvez bien trop facilement obtenir en s'unissant vues pour un rapport dans un désordre qui rejoint les mêmes grandes tables beaucoup plus de fois que de besoin, et est très lent.
Deux endroits où les points de vue de cireur est:
S'assurer que les relations complexes sont toujours correctement décrits. C'est une des raisons pourquoi les auteurs ont tendance à les favoriser.
La limitation de l'accès à un sous-ensemble d'enregistrements
Il y a aussi des restrictions sur le type de requêtes qui peuvent être faites pour une vue vice une requête ad hoc ou d'une procédure stockée. Par exemple, vous ne pouvez pas utiliser une instruction if (ou autre procédure le code de type: boucles) ou comme l'a noté ci-dessus, vous ne peut pas fournir des valeurs d'exécution de la où critères.
Un endroit où les points de vue sont souvent nettement plus lent, c'est quand ils appellent d'autres points de vue. Les visions sous-jacentes doivent être entièrement réalisé dans certaines bases de données, et donc vous pourriez avoir besoin pour callup 4,459,203 dossiers pour voir les 10 en définitive, vous êtes intéressé dans. Début à la couche de cela plus d'une fois et il peut devenir très lent, très rapide; point de vue qui appellent les vues sont tout simplement une mauvaise pratique.
OriginalL'auteur HLGEM
Dans SQL Server je crois que la différence de performances entre les vues et les requêtes est négligeable. Ce que je recommande de faire pour améliorer les performances est de créer une autre table qui contient les résultats de la vue. Vous pourriez peut-être créer une table intermédiaire où de nouvelles données, puis une procédure stockée peut être exécuté à un certain intervalle de temps qui remplit la table de travail avec les nouvelles informations. Un déclencheur peut être bon pour cette fin. Selon les exigences de votre application de cette conception peut ou peut ne pas être approprié. Si vous travaillez avec des données en temps quasi réel, cette approche conduira à des problèmes de concurrence,...
Une autre chose à regarder dans, est à faire absolument sûr que les tables de base que vous utilisez pour construire votre point de vue sont indexés correctement, et que la requête elle-même est optimisé. Enfin, je crois que c'est possible dans SQL Server enterprise pour créer des vues indexées bien que je ne les ai pas utilisé avant.
OriginalL'auteur Scott
Si ils font exactement la même chose d'un point de vue pourrait être un peu plus rapide sur la première exécution, comme le serveur de base de données aura un plan d'exécution précompilé pour elle. Tout dépend de votre serveur.
Empasis sur la puissance et légèrement...
OriginalL'auteur Daniel M
Vue de promouvoir la réutilisation du code et peut abstraire la base de données de la complexité de donner une cohérence à la "business" modèle de données. Cependant, ils ne sont pas presque aussi ajustable. Vous pouvez vous trouver dans une position où vous avez besoin de fournir des indicateurs de jointure ou d'autres à faible niveau d'optimisations et de nombreux DBA avec qui j'ai travaillé ne les aime pas être appliquée à des points de vue qu'ils peuvent ensuite être réutilisées dans de nombreuses requêtes, l'opinion que ces types de conseils devrait être utilisé avec toute la modération possible. J'aime utiliser des vues sur moi-même.
OriginalL'auteur Jack Ryan
Vue est à peine plus chère à l'ordinateur qu'à la rédaction de la requête en main. Une vue peut enregistrer le programmeur/user beaucoup de temps à écrire la même requête de temps après le temps, et de faire des erreurs, et ainsi de suite. L'affichage peut également être la seule façon d'accéder aux données si les vues sont aussi utilisées pour faire respecter l'autorisation (contrôle d'accès) sur les tables sous-jacentes.
Si la requête ne fonctionne pas correctement, vous avez besoin d'examiner la façon dont la requête est formée, et si les tables ont tous les index appropriés. Si votre système a besoin de statistiques précises pour que l'optimiseur de bien performer, avez-vous mis à jour les statistiques suffisamment récemment?
Il était une fois il y a longtemps, je suis tombé sur un système où un générateur de requêtes avait créé une requête qui a inscrit dix-sept tables dans une seule clause from, y compris plusieurs JOINTURE EXTERNE GAUCHE d'une table avec elle-même. Et, en fait, un examen plus approfondi a révélé que plusieurs des "tables" étaient en fait des multi-vues de table, et certains d'entre eux ont également participé auto-jointures externes, et étaient eux-mêmes impliqués dans des auto-jointures externes de la vue. Dire "horrible" est un euphémisme. Il y avait beaucoup de nettoyage possible d'améliorer les performances de la requête en éliminant inutile jointures externes, des jointures automatiques, et ainsi de suite. (Il fait antérieur à la date de l'explicite rejoindre la notation de SQL-92 - je l'ai dit il y a longtemps, de sorte que la syntaxe de jointure externe a été SGBD spécifique.)
OriginalL'auteur Jonathan Leffler
Si vous voulez dire que les performances du réseau, puis travailler à partir d'un cache local (comme avec ADO.Net ensembles de données) permettrait de réduire le trafic réseau - mais il pourrait causer des problèmes avec verrouillage. Juste une pensée.
OriginalL'auteur David Pike
Un point de vue est toujours une requête, c'est juste les résumés de certaines parties de celui-ci afin que vos requêtes peuvent être simplifiés (si ils font des choses similaires) et de maximiser la réutilisation.
OriginalL'auteur Giovanni Galbo