Index de colonnes et clés étrangères en cluster


18

J'optimise les performances d'un entrepôt de données à l'aide d'index. Je suis assez nouveau sur SQL Server 2014.Microsoft décrit ce qui suit:

"Nous considérons l'index clusterstore clusterstore comme la norme pour le stockage de grandes tables de faits d'entreposage de données, et nous nous attendons à ce qu'il soit utilisé dans la plupart des scénarios d'entreposage de données. Étant donné que l'index clusterstore columnstore peut être mis à jour, votre charge de travail peut effectuer un grand nombre d'insertions, de mises à jour, et supprimer des opérations. " http://msdn.microsoft.com/en-us/library/gg492088.aspx

Cependant, si vous lisez plus loin dans la documentation, vous trouverez sous limitations et restrictions:

"Impossible d'avoir des contraintes uniques, des contraintes de clé primaire ou des contraintes de clé étrangère."

Cela me déroute beaucoup! C'est une bonne pratique (non obligatoire) d'avoir des clés étrangères dans l'entrepôt de données pour diverses raisons (intégrité des données, relations visibles pour la couche sémantique ...)

Microsoft préconise donc des index clusterstore groupés pour les scénarios d'entrepôt de données; cependant, il ne peut pas gérer les relations de clé étrangère?!

Ai-je raison là-dessus? Quelles autres approches conseilleriez-vous? Dans le passé, j'ai utilisé un index columnstore non clusterisé dans des scénarios d'entrepôt de données, avec suppression et reconstruction pour les chargements de données. Cependant, SQL Server 2014 n'ajoute alors aucune réelle nouvelle valeur pour les entrepôts de données ??


À mesure que la fonctionnalité mûrit, vous verrez de plus en plus de ces fonctionnalités devenir prises en charge (diable, en 2012, les index columnstore étaient en lecture seule!). En attendant, on vous offre un compromis - d'excellentes performances avec des limitations, ou même ancien même ancien. Je ne crois pas non plus qu'ils voulaient que cela signifie que chaque table de votre DW devrait avoir des index clusterstore et qu'aucune table ne devrait avoir de contraintes - il y a probablement un nombre limité de tables dans n'importe quel DW qui vous donneraient un énorme coup pour le mâle.
Aaron Bertrand

3
Attention, il peut gérer les jointures. Une relation FK n'est absolument pas nécessaire pour une jointure. Il est là pour gérer l'intégrité référentielle - ce qui est bien d'avoir mais dans un entrepôt de données PEUT être omis. À risque, oui, mais aussi avec un gain de performance.
TomTom

8
Aussi - "pas de réelle nouvelle valeur"? Vous voulez dire qu'être accessible en écriture et en cluster ne vous semble pas être une amélioration? Avoir des utilisateurs capables d'interroger des données en temps réel au lieu d'attendre une baisse et de reconstruire pour obtenir des données plus récentes ne semble pas être une bonne chose pour vos utilisateurs et moins de maintenance pour vous? haussement d'épaules
Aaron Bertrand

Vous pouvez avoir des index (uniques) en créant une vue indexée. Il semble que l'infrastructure pour la maintenance des index soit déjà là. C'est juste que les index normaux ne sont pas (encore) implémentés.
usr

@AaronBertrand Dans un scénario DWH avec des tables de faits avec une clé étrangère, l'index Clustered Columnstore ne fonctionne pas. Cela contraste fortement avec Microsoft s'attendant à ce que cela soit la norme pour stocker de grandes tables de faits. J'espère que vous pouvez me prouver le contraire ...? Parce que j'aime SQL Server.
OverflowStack

Réponses:


13

Vous avez beaucoup de questions ici:

Q: (Le manque de clés étrangères) me confond beaucoup! C'est une bonne pratique (non obligatoire) d'avoir des Fk dans le DWH pour diverses raisons (intégrité des données, relations visibles pour la couche sémantique, ....)

R: C'est exact, c'est généralement une bonne pratique d'avoir des clés étrangères dans un entrepôt de données. Cependant, les index clusterstore groupés ne le prennent pas encore en charge.

Q: Donc, MS préconise les index de magasins de colonnes en cluster pour les scénarios DWH, mais il ne peut pas gérer les relations FK?!

R: Microsoft vous donne des outils. C'est à vous de voir comment vous utilisez ces outils.

Si votre plus grand défi est un manque d'intégrité des données dans votre entrepôt de données, alors l'outil que vous voulez est des tables conventionnelles avec des clés étrangères.

Si votre plus grand défi est la performance des requêtes et que vous êtes prêt à vérifier l'intégrité de vos propres données dans le cadre du processus de chargement, l'outil que vous souhaitez est les index clusterstore columnstore.

Q: Cependant SQL 2014 n'ajoute aucune vraie nouvelle valeur pour DWH ??

R: Heureusement, le magasin de colonnes en cluster n'était pas la seule nouvelle fonctionnalité de SQL Server 2014. Par exemple, consultez le nouvel estimateur de cardinalité.

Q: Pourquoi suis-je si en colère et amer de la façon dont ma fonctionnalité préférée a été implémentée?

R: Vous m'avez attrapé - vous n'avez pas vraiment posé cette question - mais j'y répondrai quand même. Bienvenue dans le monde des logiciels tiers où tout n'est pas construit selon vos spécifications exactes. Si vous ressentez avec passion un changement que vous aimeriez voir dans un produit Microsoft, consultez Connect.Microsoft.com . C'est leur processus de rétroaction où vous pouvez soumettre un changement, d'autres personnes peuvent le voter, puis l'équipe produit le lit et vous explique pourquoi il ne le mettra pas en œuvre. Parfois. La plupart du temps, ils le marquent simplement comme "ne résoudra pas, fonctionne sur ma machine" mais bon, parfois vous obtenez des réponses.


"Correct, c'est normalement une bonne pratique d'avoir des clés étrangères dans un entrepôt de données" -> SQLCAT - Top 10 des meilleures pratiques pour la construction d'un entrepôt de données relationnelles à grande échelle ... "Construire des index non cluster pour chaque clé étrangère." -> Rien sur la mise en œuvre de la relation FK mentionnée dans le lien, et le non-CI est redondant en raison de columnstore, donc n'indiquerait pas la nécessité de FK sur la table des faits, êtes-vous d'accord? Intéressé par vos réflexions à ce sujet.
Adrian Torrie

1
... et pour les dimensions: "Évitez d'appliquer des relations de clé étrangère entre le fait et les tables de dimension, pour permettre des chargements de données plus rapides. Vous pouvez créer des contraintes de clé étrangère avec NOCHECK pour documenter les relations; mais ne les appliquez pas. Assurez l'intégrité des données via Transform Lookups, ou effectuez les vérifications d'intégrité des données à la source des données "
Adrian Torrie

6

Je peux comprendre que vous sentiez que certaines pièces auxquelles vous êtes habitué manquent. Mais c'est uniquement parce qu'ils manquent.

Néanmoins, SQL Server était utilisé avec succès lorsque les clés étrangères n'étaient qu'un concept (que nous avions implémenté via des déclencheurs à cette époque), et non une implémentation physique telle qu'une contrainte. L'intégrité référentielle déclarative était là au moins par SQL Server 7.0, mais beaucoup plus faible que l'implémentation actuelle.

En ce qui concerne la valeur de l'index de cluster de colonnes, il fournit un index et les lignes peuvent être mises à jour. Cette discussion peut vous être utile: http://sqlwithmanoj.com/2014/07/24/maintaining-uniqueness-with-clustered-columnstore-index-sql-server-2014/

Manoj souligne qu'il existe un moyen de créer une vue indexée / matérialisée en haut de cette table, avec Clustering Key comme PK (1ère colonne de la table / vue). Que cela vous convienne, bien sûr, c'est une décision que vous devez prendre.

Mais, comme l'ont commenté Aaron Bertrand et TomTom, il s'agit de meilleures performances. Si vous pouvez gérer les autres problèmes qui vous concernent (et je pense qu'ils sont gérables), vous obtenez plusieurs avantages. Utilisez donc le ColumnStore pour ce qui est capable de faire et de gérer vous-même les fonctionnalités manquantes.


2

Cette question concerne SQL 2014, mais je veux fournir des informations supplémentaires à la lumière des modifications apportées dans SQL 2016 aux index columnstore, car il peut être difficile de trier les limitations dans différentes versions et cette question fait toujours surface assez haut sur Google:

Pour SQL 2016, Microsoft décrit une méthode pour utiliser des index btree non clusterisés (qui peuvent désormais être ajoutés en tant qu'index secondaires sur une table columnstore en cluster) pour appliquer les contraintes de clé étrangère, à condition que la contrainte soit ajoutée avant l'index columnstore: https: // docs .microsoft.com / fr-fr / sql / bases-de-données relationnelles / index / columnstore-indexes-design-guidance

Niko Neugebauer a également publié un blog à ce sujet; il est en fait possible de créer directement des contraintes uniques / étrangères sur les tables columnstore (j'ai appliqué cette approche dans mon travail): http://www.nikoport.com/2015/09/15/columnstore-indexes-part-66- plus-cluster-columnstore-améliorations-dans-sql-server-2016 /

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.