BI experience

MSSQL 2008R2 Slowly Changing Dimension et la volumétrie

| 0 Commentaires

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?

Laisser un commentaire

Champs Requis *.

*