Que remplacer à gauche rejoindre dans une vue afin que je puisse avoir une vue indexée?
J'ai normalisé des tables dans une base de données et à dénormaliser, j'ai créé un point de vue de deux tables. Quand j'ai essayé de créer un index cluster sur la vue, il ne me laisse pas, comme le point de vue a été créé avec une jointure externe gauche. J'ai utilisé une jointure gauche parce que je veux les valeurs null à apparaître dans le résultat de l'affichage, à l'instar de la façon dont il a été suggéré dans ce précédent post.
Question sur rejoindre où une colonne d'un côté, la valeur est null
La structure de la table et la relation est très semblable à ce qui a été décrit dans le lien ci-dessus.
Me semblait frappé un mur ici, que je ne pouvais pas convertir ma gauche, rejoindre en une jointure interne, qui permettrait d'exclure tous les enregistrements avec des valeurs nulles sur les colonnes jointes. Mes questions sont les suivantes:
- Pourquoi indexation est pas autorisé à l'extérieur de la ou des jointures automatiques?
- Existe-il des performances de hits sur cette sorte d'onu-vue indexée?
- Quelqu'un sait de toute solution de contournement pour ce problème?
Je viens de terminer un Serveur SQL cours hier donc ne sais pas comment procéder. Apprécie les observations. Des acclamations.
source d'informationauteur Noble_Bright_Life
Vous devez vous connecter pour publier un commentaire.
Il y a une "solution de contournement" ici qui consiste à vérifier
NULL
dans la jointure et d'avoir unNULL
représentation de la valeur dans le tableauValeur NULL
La jointure
Voici une alternative. Vous voulez une vue matérialisée de l'Un ne contenant pas de B. Qui n'est pas directement disponible... donc au lieu de cela, se matérialiser deux points de vue. L'un des tous Un et l'un des seuls avec B. Puis, obtenez seulement de ne pas avoir de B en prenant à l'exception de B. Cela peut être fait de manière efficace:
Créer deux vues matérialisées (mA et mAB) (edit: mA peut-être la table de base).
mA manque la jointure entre A et B (donc contenant tous Une période [et, par conséquent, contenant les enregistrements SANS allumettes dans B]).
mAB jointures entre A et B (donc ne contenant qu'Un avec B [et, par conséquent, à l'exclusion de ceux des enregistrements SANS allumettes dans B]).
Pour obtenir Une bonne fois pour toutes sans allumettes dans B, masque, celles qui correspondent à:
Cela devrait donner une gauche anti semi join contre votre index en cluster pour obtenir la carte d'identité et d'un index cluster chercher à obtenir les données de mA vous êtes à la recherche pour.
Essentiellement à ce que vous sont en train de faire est la règle de base que SQL est beaucoup mieux dans les relations avec des données qui y de données qui N'est PAS. En matérialisant deux sources, vous gagnez certains convaincant en fonction des options. Vous devez peser le coût de ces points de vue à l'encontre de ces gains vous-même.
Je ne pense pas qu'il y est une bonne solution. Ce que vous pouvez faire à ce sujet est de créer un véritable tableau de la vue et de l'ensemble des indices sur qui. Cela peut être fait par une procédure stockée qui est appelé régulièrement lorsque les données sont mises à jour.
Mais ce n'est qu'une remarquable approche si les données ne sont pas mis à jour toutes les quelques secondes.
Logiquement vous faire deux requêtes distinctes. "A LEFT JOIN B' est juste un raccourci pour '(UNE JOINTURE B) de l'UNION UN"
La première requête est Une table interne rejoint à la table B. il obtient une vue indexée, puisque c'est là que le gros du travail est fait.
La deuxième requête est juste Une table où l'une des colonnes de jointure sont nulles. Faire une vue qui produit les mêmes colonnes de sortie de la première requête et plaquettes avec les valeurs null.
Seulement l'union de deux résultats avant de les renvoyer. Pas besoin pour une solution de contournement.
Je vais travailler sur une réponse à 1, mais pour l'instant:
[2]. La vue sera ni plus ni moins performantes que la requête équivalente sur le udnerlying tables. Tous les conseils habituels s'applique sur le fait d'avoir la couverture des index, de préférence un index sur les colonnes jointes, etc.
[3]. Il n'y a pas de véritable solution de contournement. La plupart des restrictions sur les vues indexées existe pour de très bonnes raisons, une fois que vous creusez dans.
Je venais de créer la vue, en général, et plus rien faire, sauf s'il y avait des problèmes de performances.
Je vais essayer d'ajouter une réponse pour 1 une fois que j'ai reconstruit dans mon propre esprit.