Propriété Slice dans le partitionnement de cube

Lors de la mise en place d’une évolution sur un cube que j’avais fait il y a un moment, j’en profite pour ajouter un peu de partitionnement étant donné que le cube avait bien grossi. Voulant aller vite, je crée 3 partitions, je déploie et paf, une erreur :

3240034361 : Erreurs dans le moteur de stockage OLAP : Les restrictions imposées sur un secteur de partition n’ont pas été respectées

(en anglais : Errors in the OLAP storage engine: The restrictions imposed on partition slice where violated)

Le problème vient de la propriété Slice de mes partitions que j’ai mis un peu hâtivement.

Explications en repartant du début…

 

Définir les partitions

Première chose à faire, définir les partitions. Pour cet article, je vais prendre la base Contoso (un AdventureWorks un peu plus épais) et je vais partitionner par Magasin (StoreKey).

En étudiant les données, je vois qu’elles ne sont pas distribuées également ; quelques magasins sortent du lot.

image

Je vais donc définir un schéma de partitionnement non linéaire en créant 7 partitions.

image

image

Je déploie, je process, tout va bien. Sauf qu’en testant, on peut voir que les partitions ne sont pas correctement utilisées dans les requêtes MDX.

image

Avec une requête sur un Magasin précis, on voit avec le Profiler que plusieurs partitions sont lues.

SELECT
[Measures].[Sales Amount] ON 0
,[Calendar].[Year].Children ON 1
FROM  [Contoso]
WHERE ([Stores].[Store].&[310])

Rappelons toutefois qu’il y a 2 avantages au partitionnement :

  • Optimisation des requêtes (on vient d’en parler)
  • Optimisation du Process en ne traitant que la “dernière” partition

Ce second point peut à lui seul justifier la mise en place de partitions. A ce propos, Microsoft recommande de partitionner à partir de 2 millions de lignes.

Propriété Slice

Si le moteur ne pointe pas directement sur la bonne partition, c’est parce que, dans mon partitionnement, je dois lui indiquer sur quel critère.

En SSAS multidim, cette clé de partitionnement s’appelle un Slice (traduit par “tranche” dans les outils en français). On trouve cette propriété Slice sur l’objet Partition.

image
(cliquer pour agrandir)

Cette propriété attend une expression en MDX qui renvoie un Tuple ou un Set. Ainsi pour notre partitionnement par Magasin, on aura une instruction comme celle-ci :

{[Stores].[Store].&[199],[Stores].[Store].&[200]}

Etant donné que j’ai plus de 300 magasins sur 7 partitions, je pars sur un Range (avec un : entre mes bornes) :

{[Stores].[Store].&[201]:[Stores].[Store].&[305]}

Et pour la première et la dernière partition,

{null:[Stores].[Store].&[198]}
{[Stores].[Store].&[311]:null}

En testant dans une requête MDX, cela fonctionne très bien.

SELECT
[Measures].[Sales Amount] ON 0
,{null:[Stores].[Store].&[199]} ON 1
FROM  [Contoso]

Sauf que c’est ce Range qui est à l’origine de l’erreur au Processing !

Pourquoi ?

Au traitement, Analysis Services utilise ce que vous avez mis dans la propriété Slice dans une instruction StrToMember(“propriété slice”, CONSTRAINED). Et la fonction StrToMember, en mode CONSTRAINED, ne supporte pas les Range… Triste

image
(cliquer pour agrandir)

Quelques références sur les limitations de STRTOMEMBER :

La solution ?

Elle est simple, il vous faut indiquer TOUS les membres de la partitions dans votre Set. Ou encore créer plus de partitions.  C’est pourquoi la gestion des partitions est souvent automatisée (PowerShell avec AMO, SSIS), mais ça, ce sera pour un prochain article.

Pour conclure, une fois les slices correctement définis sur les partitions, ma requête MDX requête la bonne partition, et uniquement celle-ci.

image

AutoSlice

Si vous avez correctement suivi, vous avez dû remarquer qu’il y a un truc qui ne colle pas. J’ai 7 partitions et quand j’ai requêté sans les Slices définis, il n’a scanné que 4 partitions. Pourquoi ?

Tout simplement car Analysis Services essaye quand même de déduire le critère de partitionnement au moment du Processing. Dans ces métadonnées, il indique les valeurs min et max de chaque dimension.

image
(cliquer pour agrandir)

C’est pour cela qu’il arrive à se débrouiller pour retrouver les partitions éligibles. Mais comme vous avez pu le voir, ce n’est pas parfait (principalement car il peut y avoir de l’overlap).

Pour creuser l’AutoSlice, je vous renvoie à l’article de Shabnam Watson : http://shabnamwatson.wordpress.com/2013/06/27/setting-the-slice-for-ssas-partitions/

 

2 réflexions sur “Propriété Slice dans le partitionnement de cube

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s