BI experience

15 mai 2012
par maryam khiali
0 Commentaires

MSSQL 2008R2 Slowly Changing Dimension et la volumétrie

En voulant mettre en place le chargement de dimension avec le principe du SCD. Je me suis tout de suite tournée vers les composants proposés dans SSIS

scd1

Pour petit rappel, vous trouverez sur ce lien : sqlservergeeks.com l’explication des différents types de SCD possibles à faire. Dans cet article nous parlerons du type2.

Votre dimension cible devra contenir 3 champs :

  • [DMXXXX_SCD_DATE_DEBUT]
  • [DMXXXX_SCD_DATE_FIN]
  • [DMXXXX_SCD_FLAG_ACTIF]

Voici le résultat que cela donne en passant par l’assistant du composant :

scd2

Ci-dessous voici ce que l’on a mis dans l’assistant pour le SCD de type 2: scd31

Le package global aura donc la forme ci-dessous :

scd4

1 – il y a un update pour toutes les colonnes sauf sur la colonne qu’on étudie en SCD (afin de prendre en compte de changement de libellés par exemple) : DMXXXX_ID
2- Dans le Load il y a le SCD qui permettra d’ajouter les nouvelles lignes et d’inactiver les anciennes à une date donnée.

Cette méthodologie est possible quand la volumétrie n’est pas très importante. Si votre volumétrie est trop importante et que vous voulez garder la démarche du SCD, il faut passer en full SQL :

scd52
1- Garder la démarche du chargement d’un TMP_DMXXXX afin de préparer le chargement des différents ID, les jointures avec les dimensions…
2- Update de tous les champs sauf des champs suivants (pour prendre en compte les changements de libellés, etc) :

  • DMXXXX_ID
  • DMXXXX_SCD_DATE_DEBUT
  • [DMXXXX_SCD_DATE_FIN]
  • [DMXXXX_SCD_FLAG_ACTIF]
  • DMXXXX_DATE_CREATION

Avec une requête du type :

UPDATE MAJ
SET
MAJ.[DMXXXX_LIBELLE] = TMP.XXXX_LIBELLE
,MAJ.[DMXXXX_DATE_DERN_MAJ] = TMP.XXXX_DATE_DERN_MAJ
FROM
DMXXXX MAJ INNER JOIN
(
SELECT
[DMXXXX_ID]
,DMXXXX_XXXX_ID
,[DMXXXX__LIBELLE]
FROM DMXXXX
) as SRC ON SRC.[DMXXXX_ID] = MAJ.[DMXXXX_ID]
INNER JOIN
(
SELECT
[XXXX_ID]
,[XXXX_LIBELLE]
FROM [STAGING].[dbo].TMP_DMXXXX
) as TMP ON TMP.[XXXX_ID]= SRC.[DMXXXX_XXXX_ID]
WHERE TMP.XXXX_DATE_DERN_MAJ <> SRC.DMXXXX_XXXX_DATE_DERN_MAJ

3- Ensuite on insert les nouvelles lignes c’est-à-dire les lignes qui ont une ID nouveau. En initialisant les champs suivants :
nouvelle_ligne

Dans le derived column voici ce que l’on a ajouté : scd6

4- on insert ensuite les lignes qui ont un même Id (XXXX_ID) et un XXXX_monchamp (le champ sur lequel je souhaite faire mon historisation) différent. (le data flux reste le même que dans le 3- avec une jointure en plus au niveau du lookup pour récupérer juste les lignes qui ont le même ID métier et un ID du champ à historiser différent. Dans le derived column voici les infos qu’on y a mises :
scd71

5 -Et ensuite il faut désactiver les enregistrements les plus anciens avec une requête du type :

UPDATE MAJ
SET
MAJ.DMXXXX_SCD_FLAG_ACTIF = 0,
MAJ.DMXXXX_SCD_DATE_FIN = GETDATE()
FROM
DMXXXX MAJ INNER JOIN
(
SELECT
k.DMXXXX_XXXX_ID,
MIN(k.DMXXXX_SCD_DATE_DEBUT) as DMXXXX_SCD_DATE_DEBUT
FROM DMXXXX k
WHERE EXISTS (
SELECT
t.DMXXXX_XXXX_ID
FROM
(
SELECT
DMXXXX_XXXX_ID,
DMXXXX_SCD_FLAG_ACTIF ,
COUNT(*) as nb
FROM DMXXXX
WHERE  DMXXXX_SCD_FLAG_ACTIF = 1
GROUP BY
DMXXXX_XXXX_ID,
DMXXXX_SCD_FLAG_ACTIF
having count(*)>1
) as t
WHERE t.DMXXXX_XXXX_ID = k.DMXXXX_XXXX_ID
)
GROUP BY
k.DMXXXX_XXXX_ID
)  as tb_finale ON tb_finale.DMXXXX_XXXX_ID = MAJ.DMXXXX_XXXX_ID
and tb_finale.DMXXXX_SCD_DATE_DEBUT = MAJ.DMXXXX_SCD_DATE_DEBUT

Et vous, comment faites-vous vos chargements de dimensions?

20 avril 2012
par maryam khiali
1 Commentaire

binary_checksum, l’ennemi du décisionnel?

En arrivant sur un projet décisionnel, une stratégie d’update avec la fonction binary_checksum avait été appliquée pour détecter les changements. En faisant quelques tests et quelques recherches sur internet, nous nous sommes vite rendus compte que cette fonction ne remplissait pas forcement son rôle. Nous avions des colonnes qui ne se mettaient pas à jour. Voici ce qu’on peut glaner sur Internet :

  • un exemple pour comprendre comment fonctionne le binary_checksum

« BINARY_CHECKSUM(*), calculé à partir de n’importe quelle ligne d’une table, retourne la même valeur tant que la ligne ne subit aucune modification. BINARY_CHECKSUM(*) retourne une valeur différente pour la plupart des modifications apportées à la ligne (mais pas pour toutes) et permet de détecter la plupart des modifications. »

  • un article sur un blog qui résume bien la situation : qu’il ne faut pas utiliser binary_checksum mais plutôt la fonction hashbytes (fonction moins performante que le binary_checksum et plus lourde à mettre en place)
  • vous trouverez dans cet article un exemple d’utilisation du hashbytes qui confirme que l’utilisation n’a pas l’air très simple pour arriver à un résultat qui fonctionne à tous les coups

Conclusion nous avons enlevé l’utilisation du binary_checksum pour passer à un update classique basé sur :

  • une date de mise à jour
  • et sur l’ID unique que l’application nous fournissait

Les performances restent correctes.

Si vous avez eu une expérience binary_checksum ou encore hashbytes n’hésitez pas à la partager avec nous!

12 avril 2012
par maryam khiali
0 Commentaires

ODBC, OLE DB, ADO et ADO.NET ça vous parle?

Nous avons plusieurs types de connexion à la base de données. Mais quelle est la différence entre ces différents types? Et comment choisir le type de connexion dont nous avons besoin?

Tout d’abord voici un bref récapitulatif de leur apparition :

  • 1992 : création de l’ODBC
  • 1996 : création de l’OLE DB et de l’ADO
  • 2002 : création d’ADO.NET

Définitions :

ODBC : (Open Database Connectivity) est une interface de programmation d’application (API) universelle qui permet de se connecter à des bases de données  ayant obligatoirement l’apparence d’une base de données relationnelle. Les données non structurées ne pourront donc pas être traitées avec de l’ODBC.

Caractéristiques générales :

  • performant
  • codage avec l’API ODBC difficile
  • moins robuste que l’ADO par exemple

Son mode de fonctionnement est assez simple : l’API ODBC employé par une application va faire appel à un gestionnaire de drivers qui va lui-même appeler le bon driver afin de récupérer le résultat de la demande envoyée par l’application.

OLE DB et ADO:

  • l’OLE DB qui est un fournisseur de données aussi bien sur les bases de données relationnelles que non relationnelles
  • et l’ADO une surcouche entre l’OLE DB et l’application. L’ADO (ActiveX Data Object) encapsule et rend virtuellement accessibles toutes les fonctionnalités de OLE DB.

l’OLE DB et l’ADO sont basés sur COM (Component Object Model : application binary interface ). Ces interfaces permettent le dialogue entre différents programmes.

Grâce au framework COM, les développeurs bénéficient d’un support riche et homogène de fonctionnalités de conception d’accès aux données dans  tous les langages Microsoft de développement :  (VB, C++, VBScript, J++…)

Le tandem OLEDB et ADO  propose donc une combinaison :

  • performante
  • codage facile pour les développeurs
  • robuste

ADO.NET (ActiveX Data Objects for .NET):

Comme vous le savez sûrement le framework COM est voué à disparaitre au profit de FRAMEWORK.NET.

A partir de là Microsoft a développé l’ADO.NET. Il regroupe à la fois le fournisseur de données et la surcouche permettant l’accès aux résultats du fournisseur de données. Ce nouveau framework corrige plusieurs problématiques que les développeurs rencontraient lors de développements avec ADO. Je vous laisse voir ces évolutions sur developpez.com

Pour conclure plusieurs sources laissent à croire que l’OLE DB et l’ADO sont voués à disparaitre au profit de l’ADO.NET.

Du coup pensez-y pour vos prochains développements!!

10 avril 2012
par maryam khiali
0 Commentaires

SSAS et son bug Identity Tinyint

Par soucis de performance, pour le chargement de schémas en étoile, pour le processing de cube SSAS, les administrateurs de bases de données nous demandent de la rigueur quant au choix des typages de nos champs.

Il se trouve que SSAS a un bug qui ne nous permet pas de toujours agir dans ce sens.

Si l’on construit, par exemple, une dimension avec comme clef incrémentale, propre au système décisionnel, une IDENTITY(1,1) tinyint, cette dernière ne pourra pas être reliée correctement lors de la construction du cube dans SSAS :

« This causes problems when attempting to define FK relationships between this column and related FK columns in toher tables in the DSV. » (voir dans cet article)

En effet, dans la dimension, l’ID incrémental tinyint sera converti en int et dans la table de fait vous aurez un tinyint non incrémental et du coup SSAS n’arrivera pas à les lier.

La solution que certains conseillent est de créer des vues en faisant un CAST sur l’ID en question. Mais je ne sais pas si maintenir ce genre de vue est bien à recommander.

Pour SQL Server 2012, malheureusement, le bug reste entier! voir sur ce lien

9 février 2012
par maryam khiali
0 Commentaires

BI personnelle ou BI d’entreprise?

Une des sessions des techdays m’a permis de mieux comprendre l’utilisation  des cubes (AS), du modèle tabulaire et de powerpivot.

Petit historique :


Année Outil Technologie
1998 OLAP services SQL Server 7.0
2000 Analyse services (avec ajout d’une brique datamining) SQL Server 2000
2005 Analyse services UDM (KPI, XMLA moteur plus robuste) SQL Server 2005
2008 pas d’évolution particulière de ces outils SQL Server 2008
2008 apparition de l’outil powerpivot SQL Server 2008R2
2012 apparition du modèle BISM SQL Server 2012

Microsoft propose donc l’exploitation de 3 outils : Powerpivot, cube OLAP, modèle tabulaire. Mais dans quels cas utiliser l’un ou l’autre?

La BI Personnelle :

Si les utilisateurs finaux ont besoin de croiser des données (pour un volume allant jusqu’à 4Go) mais qu’ils n’ont pas de budget ni le temps de lancer un projet informatique, l’outil PowerPivot est la solution. L’utilisateur pourra télécharger gratuitement un addin pour Excel ou s’il a Sharepoint, utiliser Excel Services pour le faire (en installant powerpivot for sharepoint). Grâce au moteur Vertipaq, des données chargées dans un fichier Excel seront montées en mémoire. L’utilisateur fonctionnel aura ensuite accès aux fonctionnalités d’Excel et plus avec le langage DAX.

La version 2012 de powerPivot a certaines fonctionnalités en plus, notamment le fait de pouvoir faire:

  • des mesures calculées
  • des hiérarchies (juste au niveau de la représentation des données donc moins puissant que dans AS)
  • des KPI

La BI d’Entreprise :

Pour une exploitation des données plus sécurisée, plus contrôlée, plus robuste un projet  de type BI d’entreprise pourra être mis en place.

2 possibilités s’offrent à nous :

  • mettre en place des cubes multidimensionnels avec l’exploitation du langage MDX
  • mettre en place des modèles tabulaires avec l’exploitation du langage DAX.

Le cube multidimensionnel :

Tout d’abord il faut savoir que les cubes AS ont un stockage physique et une mise en cache. Ce système peut accueillir des Téras de données. Cette technologie permet de gérer des navigations dans les données complexes et répond à des demandes intenses d’ aggrégation de  chiffres.

Exemple : j’ai un plan comptable. Certains indicateurs s’additionnent, d’autres se soustraits et d’autres ne sont pas pris en compte (Le parent n’est pas forcement la somme des enfants. Le petit nom anglais : CustomRollup, UnaryOperations). L’agrégation des données pourra donc être très précise et paramétrée. De plus on pourra donner aux utilisateurs la possibilité d’ écrire directement dans le cube (writeBack) pour faire des simulations. D’autres fonctionnalités singulières au cube AS : Default Members, NameSets, Scope Assignments, relations plusieurs à plusieurs vous feront pencher vers l’utilisation d’un cube multidimentionnel.

Le modèle tabulaire :

Concernant la couche sémantique BISM ou autrement dit le modèle tabulaire, si vous avez des contraintes de temps pour le développement un peu court, que le volume de données ne dépasse pas une centaine de giga, que les utilisateurs ne connaissent pas bien leur chemin d’analyse, cette technologie vous conviendra.

Cette technologie sera beaucoup plus performante pour les demandes de chiffres sur une granularité fine par les utilisateurs. En effet le cube AS sera plus performant sur des demandes d’agrégation et beaucoup moins performant quand l’utilisateur voudra aller dans le détail de l’information. C’est dans ces cas d’utilisation que le modèle tabulaire prendra tout son sens.

Monter un modèle tabulaire ressemble au montage d’un powerpivot.

Ce modèle propose un partitionnement (même si le stockage des données se fait en mémoire vive) car un modèle tabulaire se process comme un cube multidimensionnel. On pourra mettre en place une sécurité comme sur AS mais en un peu moins poussée. Les démarches de développement sont sensiblement similaire au développement d’un cube AS.

Et il ne faut pas oublier que le modèle tabulaire peut être la source de l’outil powerView dans Sharepoint  qui permet de faire des jolis dashboards  et sur un powerPoint de continuer à naviguer dans les données même après export de sharepoint.

J’espère avoir bien retransmis ce que j’ai pu apprendre lors de cette session des techdays. J’attends vos retours!