Archive pour mai 2010

Tuning des attributs de dimension dans Analysis Services

21 mai 2010

 

Les attributs d’une dimension dans un cube servent à la base à analyser les données selon les valeurs qu’ils contiennent. Par exemple, dans une dimension produit, on peut avoir des attributs comme la couleur, le poids, la gamme, le nom du designer qui l’a créé, etc.

Dans la vraie vie, une dimension peut contenir un grand nombre d’attributs. Le problème est que souvent, certains attributs n’ont rien à voir avec de l’analyse. Par exemple, un attribut Adresse dans une dimension client n’est pas un bon candidat pour l’analyse (et je parle bien de l’adresse du genre “3 rue des macarons cuits”, pas de la ville ou du code postal).

image

Néanmoins, on trouve souvent ce genre d’attributs à des fins de présentation dans un rapport (pour du publipostage ou de l’export par exemple).

Mon premier avis serait d’orienter ce genre de restitution de données vers une base de production (ou tout du moins dans une base relationnelle) comme source de données et non un cube mais ce n’est pas toujours possible.

L’approche que j’utilise est la suivante. Je catégorise avec mon client les attributs :

  • Attribut d’analyse : utilisé pour ventiler les mesures
  • Attribut intermédiaire : attribut technique utilisé dans une Referenced Dimension Usage par exemple
  • Propriété simple : utilisé pour afficher des méta-données sur le client

En fonction de ma classification, je configure les attributs différemment pour optimiser mon cube :

image

Enabled

Visible

OptimizedState

Attribut d’analyse

True

True

FullyOptimized

Attribut intermédiaire

True

False

NotOptimized

Propriété

False

N/A

NotOptimized

Il y a toutefois encore un problème à résoudre. En effet, le fait de mettre AttributeHierarchyEnabled à false, empêche de voir la propriété dans les assistants d’un outil comme Report Builder.

En effet, en requêtage MDX, on récupère un CellSet qui peut contenir, si on les demande dans la requête, les méta-données mais il faut que le client OLAP sache les exploiter correctement.

Par exemple, Excel (2007+) sait les demander et les afficher nativement.

image

Dans Report Builder, on devra passer par un membre calculé pour remonter la propriété comme une mesure avec une expression comme celle-ci.

[Tiers].CurrentMember.Properties(“Adresse”)

La méthode est décrite dans ce post :
 http://blog.djeepy1.net/2009/01/27/report-builder-2-0-creer-un-membre-calcule-sans-passer-par-ssas/

Obtenir les métadonnées d’un cube via PowerShell

13 mai 2010

Cas pratique : obtenir la liste des attributs des dimensions leurs caractéristiques et leurs croisements avec les groupes de mesures (sous format exploitable type Excel évidemment).

Une solution pragmatique eut été d’affecter un stagiaire à cette tâche et de lui demander de prendre le projet et de tout transcrire dans un fichier Excel.
Mais, évidemment, je n’ai pas pour habitude de procéder de la sorte et j’avais besoin de la liste très rapidement.

Je me suis donc tourné vers PowerShell car je sais qu’il y a une extension pour SQL Server et plus précisément pour Analysis Services.

Ce billet n’a pas pour but de vous apprendre PowerShell mais de vous montrer les commandes utiles pour fouiller dans SSAS.

Pour commencer, il faut charger les commandes SSAS :

[Reflection.Assembly]::LoadWithPartialName
("Microsoft.AnalysisServices")

Ensuite, on se connecte au serveur (vous noterez que j’utilise des variables – $server, $cubeid, etc.)

$server = New-Object Microsoft.AnalysisServices.Server
$server.connect($servername)

Ensuite, on récupère le cube dans la bonne base de données

$cube = $server.Databases.Item($database).Cubes.Item($cubeid)

Enfin, je n’ai plus qu’à itérer sur les groupes de mesures pour récupérer les données

foreach ($mg in $cube.MeasureGroups)
{
    foreach ($dim in $mg.Dimensions) {
        foreach ($attr in $dim.CubeDimension.Attributes) {
            $row = $mg.Name + ‘,’+
             $mg.ID + ‘,’+
             $dim.Dimension.Name + ‘,’ +
             $dim.Dimension.ID + ‘,’ +
             $dim.GetType().ToString()
            $row | out-file -append $filename
        }
    }
}

Le modèle objet d’Analysis Services n’est pas compliqué même si ce n’est pas trivial non plus.
Vous pouvez trouver des informations sur ce modèle dans la MSDN ici : http://msdn.microsoft.com/fr-fr/library/microsoft.analysisservices.cube(v=SQL.105).aspx

Editions SQL Server Analysis Services

12 mai 2010

J’ai récemment suivi un débat sur le moyen de freiner les développeurs afin qu’ils s’en tiennent aux fonctionnalités de l’édition en production (ie. l’édition Standard).

Avec SQL Server, il est difficile de bloquer les développeurs pendant la phase de réalisation. Avec Analysis Services, il existe un moyen.

Dans le propriétés du projet, on peut en effet viser l’édition cible.

image

On obtient dans certains onglets un avertissement nous mettant en garde de l’indisponibilité de la fonctionnalité en édition standard.

 image

Cependant, cet avertissement n’est pas levé sur toutes les fonctionnalités… En effet, on peut mettre des mesures semi-additives ou non-additives sans avoir un seul warning :-( .

Vous comprendrez ma déception en fin de journée après avoir constaté qu’un agrégat de type DistinctCount ne fonctionnait pas en production alors qu’il marchait très bien sur ma plate-forme de développement.

Je savais pour LastNonEmpty mais maintenant, j’ai appris par cœur les types d’agrégats et les éditions qui les supportent.

 

Pour soutenir cette feature sur Connect :
https://connect.microsoft.com/SQLServer/feedback/details/558728/add-warning-in-bids-when-using-semiadditive-or-nonadditive-aggregate-in-standard-edition-target


Suivre

Get every new post delivered to your Inbox.

Joignez-vous à 203 followers