J'ai une table IMO extrêmement grande (~ 137 millions de lignes) avec beaucoup de données répétées, beaucoup de NULL
colonnes, etc.
J'envisage d'explorer cela en utilisant un tableau avec un COLUMNSTORE INDEX
et j'ai une IDENTITY
colonne dans le tableau d'origine, qui est ma seule colonne où chaque ligne est unique.
Dois-je laisser cette colonne ou l'inclure? J'ai lu que vous souhaitez inclure toutes les lignes de votre tableau dans le COLUMNSTORE INDEX
mais j'ai également lu que les meilleurs candidats sont des colonnes avec beaucoup de lignes non uniques.
Est-ce juste un mauvais candidat pour un COLUMNSTORE INDEX
?
J'utilise SQL Server 2012, il s'agit donc d'un magasin de colonnes non cluster. J'explore simplement de meilleures façons possibles de stocker ces données. Les mises à jour sont inexistantes, bien que de nouvelles lignes soient périodiquement ajoutées via un processus ELT, donc je suppose que du travail y sera effectué. Certaines personnes exploitent ces données et génèrent d'énormes rapports, de nombreuses analyses des lignes, entraînent parfois le serveur à une analyse qui nous a obligés à décharger une copie quotidiennement sur un serveur secondaire.
137 million rows
est grand mais gérable. Avez-vous envisagé de partitionner la table et de la placer dans différents groupes de fichiers? L'index Columnsstore dans SQL 2012 n'est pas accessible en écriture, vous allez donc rencontrer des problèmes - vous devez le supprimer et le recréer. Je ne dis pas que la volonté de columnstore est mauvaise, mais il vaut mieux explorer d'autres options également.Réponses:
Les colonnes d'identité ne sont pas vraiment compressées dans les index Columnstore dans SQL Server 2012 ou SQL Server 2014. Tout dépendra vraiment de la charge de travail que vous rencontrez. Si votre charge de travail comprend la colonne d'identité, vous pouvez très bien profiter de l' élimination du segment.
Du point de vue de la compression - Columnstore vous fournira une meilleure compression que la page ne le fait généralement. Typiquement. Veuillez le tester avant de passer à la production.
Votre plus gros problème dans SQL Server 2012 sera une implémentation très faible du mode batch, et vous ne pouvez rien y faire.
la source
Je n'ai pas pu résister à rejoindre Niko avec une autre réponse (bienvenue, Niko!). En général, je suis d'accord avec Niko que les limitations du mode batch dans SQL 2012 (si Niko ne crée pas de lien vers son propre blog, je le ferai :)) peuvent être une préoccupation majeure. Mais si vous pouvez vivre avec ceux-ci et avoir un contrôle total sur chaque requête que vous écrivez sur la table pour l'examiner attentivement, columnstore pourrait fonctionner pour vous dans SQL 2012.
En ce qui concerne vos questions spécifiques sur la colonne d'identité, j'ai trouvé que la colonne d'identité se comprime très bien et je recommande fortement de l'inclure dans votre index columnstore lors de tout test initial. (Notez que si la colonne d'identité se trouve être également l'index cluster de votre b-tree, elle sera automatiquement incluse dans votre index columnstore non cluster .)
Pour référence, voici les tailles que j'ai observées pour ~ 10 MM de lignes de données de colonne d'identité. Le magasin de colonnes chargé pour une élimination optimale des segments se comprime à 26 Mo (contre 113 Mo pour la
PAGE
compression de la table de magasin de lignes), et même le magasin de colonnes construit sur un arbre b ordonné de façon aléatoire ne fait que 40 Mo. Cela montre donc un énorme avantage de compression, même par rapport à la meilleure compression SQL que b-tree peut offrir et même si vous ne prenez pas la peine d'aligner vos données pour une élimination optimale des segments (ce que vous feriez en créant d'abord un b-tree puis construire votre magasin de colonnes avecMAXDOP
1).Voici le script complet que j'ai utilisé au cas où vous voudriez jouer:
la source