Welcome to MSDN Blogs Sign in | Join | Help
Alimentation d’une table de dimension temps

Expression du besoin :

Un besoin récurrent est de définir une table de dimension temps et de l'alimenter.

 

Mise en place :

Le script ci-dessous crée une structure simplifiée de la table « DimDate » issue de la base d'exemple AdventureWorksDW.

En effet, par simplicité, seule les informations de langue anglaise sont enregistrées dans cette table.

 

L'alimentation de la table est réalisé à l'aide d'une procédure stockée qui prend en paramètre les deux bornes des dates.

 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DimDate]') AND type in (N'U'))

DROP TABLE [dbo].[DimDate]

GO

 

 

CREATE TABLE [dbo].[DimDate](

    [DateKey] [int] identity NOT NULL,

    [FullDateAlternateKey] [date] NOT NULL,

    [DayNumberOfWeek] [tinyint] NOT NULL,

    [EnglishDayNameOfWeek] [nvarchar](10) NOT NULL,

    [DayNumberOfMonth] [tinyint] NOT NULL,

    [DayNumberOfYear] [smallint] NOT NULL,

    [WeekNumberOfYear] [tinyint] NOT NULL,

    [EnglishMonthName] [nvarchar](10) NOT NULL,

    [MonthNumberOfYear] [tinyint] NOT NULL,

    [CalendarQuarter] [tinyint] NOT NULL,

    [CalendarYear] [smallint] NOT NULL,

    [CalendarSemester] [tinyint] NOT NULL,

    

CONSTRAINT [PK_DimDate_DateKey] PRIMARY KEY CLUSTERED

(

    [DateKey] ASC

))

GO

 

 

 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[FillDimDate]') AND type in (N'P', N'PC'))

DROP PROCEDURE [dbo].[FillDimDate]

GO

 

 

Create Procedure FillDimDate

    @starting_dt datetime

    ,@ending_dt datetime

 

as

set datefirst 1

declare @cntr_day datetime,@diff int,@cntr int;

SET @cntr = 0

 

select @diff = datediff(dd,@starting_dt,@ending_dt)

 

while @cntr <= @diff

begin

    select @cntr_day = dateadd(dd,@cntr,@starting_dt)

    insert into [DimDate]

    (FullDateAlternateKey,

    DayNumberOfWeek ,

    EnglishDayNameOfWeek,

    DayNumberOfMonth,

    DayNumberOfYear,

    WeekNumberOfYear,

    EnglishMonthName,

    MonthNumberOfYear,

    CalendarQuarter,

    CalendarYear,

    CalendarSemester)

    select

    @cntr_day

    ,datepart(dw,@cntr_day)

    ,case datepart(dw,@cntr_day)

    when 1 then 'Monday'

    when 2 then 'Tuesday'

    when 3 then 'Wednesday'

    when 4 then 'Thursday'

    when 5 then 'Friday'

    when 6 then 'Saturday'

    when 7 then 'Sunday'

    end

    ,datepart(day,@cntr_day)

    ,datepart(dy,@cntr_day)

    ,datepart(wk,@cntr_day)

    ,case datepart(mm,@cntr_day)

    when 1 then 'January'

    when 2 then 'February'

    when 3 then 'March'

    when 4 then 'April'

    when 5 then 'May'

    when 6 then 'June'

    when 7 then 'July'

    when 8 then 'August'

    when 9 then 'September'

    when 10 then 'October'

    when 11 then 'November'

    when 12 then 'December'

    end

    ,datepart(mm,@cntr_day)

    ,datepart(qq,@cntr_day)

    ,datepart(yy,@cntr_day)

    ,case (datepart(mm,getdate()))

    when 1 then 1

    when 2 then 1

    when 3 then 1

    when 4 then 1

    when 5 then 1

    when 6 then 1

    else 2

    end

    set @cntr = @cntr + 1

end

 

GO

EXECUTE FillDimDate @starting_dt ='2006-01-01',@ending_dt = '2009-12-31'

GO

 

Zoom sur l’algorithme série temporelle

1             Présentation de l’algorithme de série temporelle

 

L’algorithme de série temporal a évolué de manière significative sous SQL Server 2008.

SQL Server 2005 utilise l’algorithme ARTXP de la recherché de Microsoft.

Cet algorithme est bien connu pour sa pertinence mais peut néanmoins avoir certaines instabilité sur des projection à long termes.

Pour cette raison SQL Server 2008 introduit en complément l’algorithme ARIMA. L’utilisateur doit-il faire un choix entre du long termes ou un algorithme précis sur des projections à court terme ?

Dans un soucis à la fois de pertinence et simplicité, SQL Server 2008 compose avec les deux algorithmes.

Afin de contrôler ce comportement, nous avons trois nouveaux paramètres qui sont:

-          FORECAST_METHOD – contrôle quel algorithme est utilisé. La valeur “MIXED” est celle par défaut mais nous pouvons spécifier également ARIMA ou ARTXP.

-          PREDICTION_SMOOTHING – contrôle le niveau de composition des deux algorithmes. Une valeur proche de 0favorise ARTXP tandis qu’une valeur proche de 1 favorise plus ARIMA.

-          INSTABILITY_SENSITIVITY Si l’algorithme choisit est ARTXP, il est possible de définir des seuils pour lesquelles les données d’entrée de prédictions ne sont pas pris en compte.

 

1.1              Représentation de données de série temporel

Nous avons deux types de représentation de série temporel qui sont illustrés à travers les deux tableaux ci-dessous :

Représentation dénormalisée

Date

Vente Produit A

Vente Produit B

Vente Produit C

Janvier 2008

10

12

15

Février 2008

12

16

18

Mars 2008

10

12

15

 

Représentation normalisée

Date

Type produit

Vente

Janvier 2008

Produit A

12

Janvier 2008

Produit B

16

Janvier 2008

Produit C

12

Février 2008

Produit A

12

Février 2008

Produit B

16

Février 2008

Produit C

12

 

 

L’avantage de la représentation de type dénormalisé est la visualisation des données.

Cependant si nous souhaitons ajouter un grand nombre de série, il faut ajouter de même les colonnes associées ce qui devient difficilement gérable.

 

Concernant le modèle normalisé, il est plus souple pour rajouter des séries mais nous ne pouvons pas configurer des paramètres spécifiques pour les valeurs « normalisé ».

Le produit A aura le même paramètre que le produit B…

De plus le DMX utilisait pour faire de la prédiction est plus simple dans le cas de données dénormalisées.

 

1.2              Règles d’application de la série temporel

Par défaut les données sont censé être complète ; c'est-à-dire que pour chaque série les données doivent être complète.

Pour traiter ce genre de cas, il est nécessaire de définir une règle de substitution des valeurs nulles.

Le paramètre MISSING_VALUE_SUBSTITUTION offre une option pour remplacer les valeurs nulles.

 

Une deuxième règle pour utiliser l’algorithme de série temporel est de trier les données.

 

De plus il est intéressant de spécifier des réglages à l’algorithme afin d’augmenter la pertinence des résultats comme de spécifier que le temps est divisé par trimestre,…,

 

Lorsque nous avons plusieurs séries, SSAS essaye de trouver une relation entre ces dernières.

Nous pouvons contrôler ce comportement à l’aides des paramètres suivants :

-          L’option PREDICT_ONLY indique que la donnée doit être prédite mais non corrélée avec les autres séries.

-          L’option INPUT spécifie que les données servent en entrée mais ne doivent pas être prédite.

 

 

2             Création du modèle

2.1              Présentation

D’une manière générale, les structure de mining crées pour les séries temporels ne sont pas compatibles avec les autre modèles de mining.

L’une des différence de création d’une structure de mining à usage temporel est l’ajout d’un type KEY TIME comme le montre l’exemple ci-dessous.

CREATE MINING STRUCTURE [Wine Sales]

(

     [Month]          DATE KEY TIME,

     [Fortified]      DOUBLE CONTINUOUS,

     [Dry White]      DOUBLE CONTINUOUS,

     [Sweet White]  DOUBLE CONTINUOUS,

     [Red]          DOUBLE CONTINUOUS,

     [Rose]         DOUBLE CONTINUOUS,

     [Sparkling]    DOUBLE CONTINUOUS,

     [Average Red]  DOUBLE CONTINUOUS,

     [Average White] DOUBLE CONTINUOUS

)

 

2.2              Modèle de type « normalisé »

Dans un modèle de type « normalisé », la colonne de type séries est ajouté comme clé comme le montre l’exemple ci-dessous :

CREATE MINING STRUCTURE [Wine Sales Interleaved]

(

     [Month]        DATE KEY TIME,

     [Series]       TEXT KEY,

     [Category]    TEXT DISCRETE,

     [Sales]        DOUBLE CONTINUOUS

)

 

La création du modèle de mining dans ce type de modélisation, il faut ajouter un filtre sur les données de la structure pour préciser la série à analyser.

ALTER MINING STRUCTURE [Wine Sales Interleaved]

ADD MINING MODEL [Reds Interleaved]

(

    [Month],

     [Series],

     [Sales]        PREDICT

) USING Microsoft_Time_Series

WITH DRILLTHROUGH,

     FILTER([Category] = 'Red')

 

2.3              Modèle de type « dénormalisé »

 

Dans le cas de modèle dénormalisé, la construction du modèle de mining est relativement simple puisque cela consiste à appliquer l’attribut PREDICT.

ALTER MINING STRUCTURE [Wine Sales]

ADD MINING MODEL [Reds]

(

    [Month],

     [Fortified]      PREDICT,

     [Red]          PREDICT,

     [Rose]         PREDICT

) USING Microsoft_Time_Series

WITH DRILLTHROUGH

 

 

3             Traitement des modèles

3.1              Présentation

Le moyen le plus direct pour alimenter une structure est d’utiliser les instructions de type « INSERT INTO ».

Les données des séries ne doivent pas contenir des valeurs nulles.

Pour traiter ce cas, il faut utiliser le paramètre MISSING_DATA_SUBSTITUTION

3.2              Traitement d’un modèle dénormalisé

 

Ce cas est le plus simple car il correspond à un mapping 1 :1 entre une source tabulaire et la structure de data mining.

INSERT INTO MINING STRUCTURE [Wine Sales]

( [Month],

 [Fortified], [Red], [Rose], [Average Red],

 [Dry White], [Sweet White], [Sparkling], [Average White])

OPENQUERY ([MaDataSource],

  'SELECT

   Month,

   [Fortified], [Red], [Rose],

      ([Fortified] + [Red] + [Rose]) / 3,

   [Dry White], [Sweet White], [Sparkling],

      ([Dry White] + [Sweet White] + [Sparkling]) / 3

   FROM [Wine Sales]

   ORDER BY [Month]')

 

Nous utilisons la fonction OPENQUERY pour se connecter à la source relationnelle.

 

3.3              Traitement d’un modèle normalisé

Dans ce cas, il est nécessaire d’effectuer une transformation des données pour alimenter la structure de data mining.

INSERT INTO MINING STRUCTURE [Wine Sales Interleaved]

( [Month], [Series], [Category], [Sales] )

OPENQUERY ([MaDataSource],

  'SELECT * FROM

  (SELECT [Month],

          [Type],

          CASE [Type] WHEN ''Red'' THEN ''Red''

                      WHEN ''Rose'' THEN ''Red''

                      WHEN ''Fortified'' THEN ''Red''

                      ELSE ''White''

          END AS [Category],

           [Sales] 

   FROM [Wine Sales2]

   UNION ALL

   SELECT [Month], ''Red Average'' AS [Type], ''Red'' AS [Category], SUM(Sales)/3 AS [Sales]

   FROM [Wine Sales2] t

   WHERE t.[Type] IN (''Red'', ''Fortified'', ''Rose'')

   GROUP BY [Month]

   UNION ALL

   SELECT [Month], ''White Average'' AS [Type], ''White'' AS [Category], SUM(Sales)/3 AS [Sales]

   FROM [Wine Sales2] t

   WHERE t.[Type] IN (''Dry White'', ''Sweet White'', ''Sparkling'')

   GROUP BY [Month]) t

   ORDER BY [Month], [Type] ')  

 

4             Etablir une projection de données

4.1              Cas général

La projection de données s’effectue à l’aide de la fonction  PredictTimeSeries.

clip_image002

Le résultat de notre fonction nous donne deux colonnes qui sont TIME et [NomModel]

4.2              Scénarios de simulation

4.2.1                What-if ?

Que se passerait-il si le mois prochain vis-à-vis de mes ventes globales si j’augmente de 10% le produit A ?

Ce type de cas est géré par la fonction « PREDICTION JOIN ».

SELECT FLATTENED

     PredictTimeSeries([Red], 3, 12, EXTEND_MODEL_CASES)

FROM [Reds]

NATURAL PREDICTION JOIN

(SELECT 1 AS [Month], 4520 AS [Red]

 UNION SELECT 2 AS [Month], 4000 AS [Red]) as t

Dans l’exemple ci-dessus, nous souhaitons faire une projection sur l’année à venir en précisant les ventes pour les deux prochains mois.

 

Si nous souhaitons fournir les vente pour le premier et le troisième mois, il faut fournir la valeur « null » pour le second mois. (SELECT 2 AS [Month], NULL AS [Red])

4.2.2                Nombre de données en entreé faible

Si le nombre de données en entrée est faible pour évaluer une projection, il est possible d’utiliser la fonction REPLACE_MODEL_CASES pour se baser sur l’historique d’un autre produit.

Dans l’exemple ci-dessous nous utilisons un historique d’un autre produit pour faire une projection de deux ans sachant que nous avons uniquement 6 mois d’historique pour notre nouveau produit.

 

SELECT FLATTENED

     PredictTimeSeries([Average Red], 24, REPLACE_MODEL_CASES)

FROM [Average Sales]

PREDICTION JOIN

(SELECT 1 AS [ Month], 109 AS [New Varietal]

  UNION SELECT 2 AS [Month], 123 AS [New Varietal]

  UNION SELECT 3 AS [Month], 154 AS [New Varietal]

  UNION SELECT 4 AS [Month], 165 AS [New Varietal]

  UNION SELECT 5 AS [Month], 225 AS [New Varietal]

  UNION SELECT 6 AS [Month], 230 AS [New Varietal]

) AS t

ON [Average Sales].Month = t.Month AND

   [Average Sales].[Average Red] = t.[New Varietal]

  

 

5             Paramètres

5.1              Drill-Throught

La fonctionnalité de Drill-Throught permet de fournir les données qui ont permis d’établir la projection.

5.2              Paramètres clés

5.2.1                MISSING_VALUE_SUBSTITUTION

Il est obligatoire que les séries de données possèdent toute une valeur. Pourquoi ne pas positionner une valeur pour ce paramètre ?

En fait, la valeur fournie a un impact important sur la prédiction des données.

Nous pouvons spécifier au moteur SSAS quelle valeur prendre si une valeur nulle est rencontrée.

Nous avons le choix parmi ces valeurs :

-          Previous,

-          Mean,

-          Number

Ci-dessous un exemple de paramètre sur un modèle de données

ALTER MINING STRUCTURE [Red With Filter]

ADD MINING MODEL [Reds Before 1990]

(

  Month,

  Red PREDICT

) USING Microsoft_Time_Series (MISSING_VALUE_SUBSTITUTION='Previous')

WITH DRILLTHROUGH,

   FILTER([Month Filter] < '1/1/1990')

 

5.2.2                PERIODICITY_HINT

PERIODICITY_HINT est le second parametre le plus important. Il faut toujours mettre la périodicité lorsque nous la connaissons.

Le format de la périodicité est du type n[,…] ce qui signifie que nous pouvons spécifier plusieurs période.

Par exemple une période pour des salaires mensuels peut être par trimestre ou par année. Dans ce cas, le format de la période serait 3,12.

 

5.2.3                HISTORIC_MODEL_COUNT et  HISTORIC_MODEL_GAP

 

La validation de l’algorithme de série temporal s’effectue à l’aide des paramètres HISTORIC_MODEL_COUNT et  HISTORIC_MODEL_GAP qui sont affectés à un modèle de data mining.

clip_image004

 

Le principe de ces paramètres est de créer des sous ensemble de modèle pour valider les données

A travers la copie d’écran ci-dessous, le premier modèle prend en entrée N -3 mois, prédit les 3 derniers et compare avec le réel

Le deuxième modèle prend en entrée les N - 6 mois, prédit les 6 suivant et compare avec le réel

Il faut avoir un niveau de profondeur de données suffisant

clip_image005

Le paramètre  HISTORIC_MODEL_COUNT correspond au numéro du sous modèle et  le paramètre HISTORIC_MODEL_GAP au nombre de pas de données à tronquer.

Le lien suivant décrit plus en détails la mise en place de ces deux paramètres :

http://www.sqlserverdatamining.com/ssdm/Home/TipsTricks/tabid/61/Default.aspx?id=26

 

 

Définir un membre par défaut d’une dimension de rôle.

 

Avez-vous déjà essayé de définir un membre par défaut sur une dimension qui est décliné en rôle ?

 image

image

Lors du déploiement, vous devriez obtenir l'erreur suivante  

 image

En effet, comment le moteur Analysis Services pourrait savoir sur quelle dimension il faut appliquer le membre par défaut ?

Le seul moyen d'attribuer cette propriété est de l'écrire en script MDX enregistrée dans le cube comme le montre la figure ci-dessous.

image

 

Nous avons ci-dessous, trois requêtes MDX.

  1. La première affiche explicitement le membre par défaut de la dimension de rôle [Due Date].
  2. La deuxième n'effectue aucun filtre sur les dimensions. Nous constatons bien que le membre par défaut s'applique bien, à savoir que le cube est agrégé selon l'indicateur choisit croisé avec l'ensemble des membres par défaut.
  3. Dans la troisième requête, nous « enlevons » le membre par défaut de la dimension [Due Date], ce qui donne la somme totale des ventes par Internet ;

image

Rédaction d’un fichier rss

 

Présentation

L’installation de Reporting Services fournit un utilitaire rs.exe exécutable en ligne de commande qui permet de gérer des taches d’administration comme le déploiement en automatique des rapports.

L’aide en ligne sur la syntaxe de la commande rs.exe est consultable à l’url suivante

http://msdn.microsoft.com/en-us/library/ms162839.aspx

Cette utilitaire consomme des fichiers qui portent l’extension rss. La logique des tâches à effectuer est contenu dans ce fichier rss.

Exemple d’invocation de l’utilitaire rs.exe

rs –i c:\scriptfiles\script_copycontent.rss -s http://localhost/reportserver

Nous allons voir par la suite comment créer un fichier rss.

Etapes de mise en oeuvre

Sachant que le fichier rss utilise la syntaxe du laguage VB.NET, le principe pour faciliter la rédaction des scripts est de créer un projet console VB.NET dans Visual Studio.

 

Les étapes de rédaction d’un fichier rss est décrit ci-dessous

Démarrer Visual Studio et Sélectionner File>New>Project

clip_image002

 

Choisir le language VB.NET et le projet Console Application. Préciser l’emplacement du projet.

clip_image004

Sélectionner le projet et ouvrir le menu contextuel pour choisir Add Web Reference.

clip_image006

 

Saisir le nom du serveur Reporting Services sur lequel le programme sera testé

http://[ServerName]/reportserver/reportservice.asmx

SelectionnerAdd Reference

clip_image008

Selectionner les propriétes du projet.

Enlever les namespaces fournis sauf system et system.diagnostics, puis rajouter System.IO, System.web.Services et System.Xml

clip_image002[18]

 

Le code peut à présent être édité et faire référence à notre classe proxy.

clip_image002[20]

 

Une fois testé, afin de créer notre fichier rss, il suffit de:

- Enlever la ligne d’instanciation de la classe proxy puisque cette tâche est automatiquement réalisée par l’utilitaire rs.exe. Le nom de cet objet est rs

- Enlever les balises Module et End Module

- Copier le contenu dans un fichier avec l’extension rss

image

La démocratisation du data mining

Mais au juste, qu'est-ce que le data mining?

 

Commençons par rectifier quelques fausses idées.

Les activités suivantes ne sont pas une implémentation du data mining:

  • Le "reporting ad_hoc". C'est la conception de rapport et la mise en relief de données à partir de méta-données. Ce n'est qu'une présentation des données existantes.
  • La navigation dans un cube. Dans un cube, les données sont mise en forme de manière structurées et agrégées facilitant ainsi l'interrogation et la comparaison de métriques essentielles à la prise de décision.
  • L'abonnement à des évènements pour accélérer la prise de décision.
  • Les statistiques. Bien qu'elles soient à la base du data mining, ça reste différent…

 

Robert Grossman nous donne une définition intéressante : "Le data mining est la conception semi-automatique ou automatique de modèles visant à mettre en avant des liens entre des données, détecter des anomalies, des changements,..., et le tout à partir d'un ensemble important d'informations. »

C'est donc le procédé qui permet d'identifier des tendances à partir de fait existants, on l'appelle aussi analyse prédictive ou exploration de données.

 

Dans quel cadre s'applique le data mining?

Les usages les plus souvent cités sont :

  • L'analyse des fraudes. Une compagnie d'assurance doit traiter une quantité importante de dossiers par jour et elle doit s'équiper d'un outil pour déceler les dossiers frauduleux.
  • L'étude des comportements des consommateurs.
  • La prédiction, comme le passage d'un client à la concurrence
  • La classification des clients afin de cibler une campagne publicitaire sur une population particulière.

 

L'exemple historique est celui d'une entreprise de grande distribution américaine. Après avoir analysé les ventes, ils se sont aperçus que les paquets de couches pour bébés étaient souvent achetés le samedi par les pères à cause de leur gros volume. D'où la réorganisation des rayons des supermarchés avec le positionnement des packs de bière à coté des couches. Le samedi étant un jour de match, les ventes ont amplement augmenté ! Cette image illustre bien les capacités de retour sur investissement (ROI) des travaux de data mining et plus généralement d'informatique décisionnelle.

Le cabinet d'étude IDC estime que dans certains cas, le data mining apporte un ROI de 150%!

 

Afin de répondre aux problèmes adressés par le data mining, il existe un certains nombre de procédés type comme la classification, le regroupement, la mise en association, la prédiction, l'analyse de séquence, la régression.

C'est à ce niveau qu'intervient le rôle des algorithmes car c'est eux qui permettent d'effectuer ces transformations de données.

La figure 1 ci-dessous présente la matrice des différents algorithmes liés aux tâches de transformation de données.

 

 

Figure 1 – Critères de choix pour un algorithme

 

La démarche de mise en œuvre

 

Comme dans tous projets, une démarche/méthodologie doit être mise en place pour assurer son bon déroulement.

Une méthodologie de référence est celle proposée par le CRISP-DM (CRoss Industry Standard Process for Data Mining)

.

Figure 2 : Méthodologie CRISP

 

Comme l'illustre la figure 2, cette méthodologie se décompose en 6 phases qui sont :

 

Analyse du métier

Cette phase initiale permet de définir les objectifs et les besoins d'un point de vue métier, afin de formuler le cahier des charges.

Compréhension des données

Cette phase consiste à partir d'échantillonnage d'évaluer la qualité des données, de définir les premiers jeux d'informations utiles pour répondre aux besoins métiers

Préparation des données

Cette phase permet de construire, transformer les données afin qu'elles puissent être consommées par les outils de modélisation.

Modélisation

Lors de cette phase plusieurs modèles sont appliqués et validés. Il n'est pas rare de revenir à la phase de préparation de données.

Evaluation

A ce niveau d'avancement, il est important de faire valider les modèles dans une perspective métier.

Déploiement

La phase finale consiste à rendre accessible les modèles élaborés aux utilisateurs finaux.

 

 

Mais pourquoi donc une démocratisation du data mining?

 

Microsoft est entré dans le domaine du data mining avec la version 2000 de SQL Server et le produit a bien évolué avec la version 2005 et maintenant 2008.

Comme le montre de nombreuses études, l'outil privilégié des analystes reste Excel. L'idée est donc de fournir dans Excel les outils nécessaires à la mise en œuvre d'un projet de data mining. Depuis le SP2 de SQL Server 2005, un add-in de data mining est intégrable dans Excel. Le lien de pour télécharger cet add-in est mentionné ci-dessous.

 

Pour s'éloigner un peu de la théorie, présentons par l'exemple un cas concret, celui de la définition des prix d'assurance de voiture en fonction des différentes caractéristiques.

Notre compagnie d'assurance possède une liste de véhicules avec l'ensemble des attributs qui les caractérisent en particuliers, un coefficient de risque.

Comme le montre la figure 3 ci-dessous, l'add-in Excel a été conçu pour suivre la méthode CRISP-DM.

Figure 3 – L'add in Excel

 

 

Décrivons dans le tableau suivant les étapes d'analyse :

 

Description de l'étape 

Présentation de l'étape 

Phase CRISP :

Compréhension des données

 

L'outil nous assiste pour déterminer les attributs majeurs qui influent sur le coefficient de risque.

Phase CRISP :

Préparation des données.

 

Les données sont facilement analysées de sorte à transformer notre coefficient risque en deux valeurs : important et faible (risque).

 

Phase CRISP :

Modélisation.

 

Une fois les données préparées, nous rentrons dans la phase de modélisation en utilisant en entrée les attributs prépondérants à l'affectation du coefficient risque. Ainsi dans notre cas, nous avons implémenté un arbre de décision qui permet de définir des relations entres les attributs.

 

 

Phase CRISP :

Validation et déploiement.

 

Plusieurs modèles sont implémentés puis comparés à l'aide de la « matrice de classification ». Dans notre cas, l'usage de l'algorithme arbre de décision est plus performant que le réseau de neurones.

Les résultats obtenus sont facilement consultables à l'aide d'un portail comme Sharepoint.

Phase CRISP :

Déploiement.

 

A partir des données analysées, il est possible de définir la politique tarifaire pour des nouveaux véhicules. Ainsi dans notre cas, nous pouvons évaluer le niveau de risque d'assurance en fonction des attributs du nouveau véhicule et donc associer par la suite un coût d'assurance.

 

A travers cet exemple, nous venons de montrer comment l'enrichissement d'Excel permet d'aider à la prise de décision.

Bien entendu, d'autres scénarios métiers peuvent être entièrement abordés à travers Excel comme déceler les acheteurs potentiels en vue d'une campagne marketing.

 

 

Au cœur de la bête

 

Nous avons vu comment implémenter un scénario de data mining avec Excel, mais que se passe-t'il en arrière plan ?

 

C'est Analysis Services (SSAS) la plateforme de data mining, bien qu'il soit aussi le moteur multidimensionnel de la suite SQL Server. Regardons comment il est structuré pour répondre aux problématiques de data mining.

 

Cet outil est organisé en plusieurs briques, comme le montre la figure 4.

Figure 4 – Analysis Services et le Data Mining

La modélisation multidimensionnelle commence par la création d'un cube, qui est la structure visant à manipuler les données. Dans ce cube, des dimensions sont créées afin de disposer de plusieurs axes pour analyser les données.

 

La modélisation prédictive (data mining) fonctionne de la même façon : une structure doit être créée pour accueillir les données concernées, et à l'intérieur de celle-ci, un ou plusieurs modèles seront implémentés, afin de dégager les tendances.

 

 

La création de structures et de modèles est accessible avec le DMX (Data Mining eXtension). Ce langage d'interrogation et de manipulation des objets, qui est au data mining ce que le SQL est à la base de données, a été créé et proposé par Microsoft, afin d'interagir avec Analysis Services. Il est relativement simple, comme le montre l'exemple suivant, qui crée un nouveau modèle selon l'algorithme de Naive Bayes :

 

CREATE MINING MODEL [NBExemple]

(

CustomerKey LONG KEY,

Gender TEXT DISCRETE,

[Number Cars Owned] LONG DISCRETE,

[Bike Buyer] LONG DISCRETE PREDICT

)

USING Microsoft_Naive_Bayes

 

 

Quand le volume de données à manipuler est très important ou quand on veut lier des analyses prédictives à de l'analyse multidimensionnelle, Excel ne suffit plus. Il faut alors passer dans du développement Business Intelligence Development Studio, c'est pourquoi il est nécessaire de faire collaborer les équipes fonctionnelles et techniques pour les projets avancés.

 

Bien que plusieurs algorithmes soient fournis de base, il est possible d'enrichir l'outil en proposant d'autres personnalisés. On bénéficie ainsi de l'ossature offerte par l'offre Microsoft: Analysis Services et Excel. Certains acteurs reconnus dans le monde du data mining ont développé des extensions pour transporter leurs méthodes dans SQL Server. On peut notamment citer SPSS qui propose leurs analyses statistiques ou Visual Numerics qui ont interfacé leurs méthodes d'analyse numériques vers SQL Server.

 

 

 

SQL Server : Plateforme intégrée et cohérente

 

Si l'investissement dans la suite SQL Server est essentiellement motivé par l'acquisition d'un outil de data mining, la montée en compétences des équipes sur le produit pourra être capitalisée lors de développement d'applications décisionnelles.

 

La suite SQL Server (SSIS – Integration Services, SSAS – Analysis Services, SSRS – Reporting Services) est complète pour mener à bien un projet décisionnel et un projet data mining selon la démarche expliquée précédemment. Dès qu'on attaque la manipulation des données, chaque module répond au besoin de chaque étape :

  • SSIS permet de préparer l'échantillon de données, et également d'alimenter un datawarehouse
  • SQL Server permet de stocker le volume important de données
  • La modélisation et l'évaluation des modèles prédictifs se fait dans SSAS, qui fait également de la modélisation dimensionnelle
  • Les utilisateurs peuvent accéder à tous les résultats via SSRS.

     

 

Donc, SQL Server peut être utilisé aux deux fins d'analyse décisionnelle et prédictive, l'implication et la formation des équipes de développement est réutilisable, pour obtenir une application de pilotage complète, qui donne une vision globale et précise de l'activité.

 

 

 

 

Conclusion

 

Ainsi, les besoins en data mining peuvent être assez rapidement comblés directement par les utilisateurs fonctionnels, l'accès par Excel étant relativement simple. Si les demandes sont plus complexes, on bénéficie d'une plateforme appropriée pour faire des analyses plus précises, plateforme qui reste ouverte et peut être enrichie avec d'autres modèles. La suite SQL Server, qui permet donc la démocratisation du data mining, est un outil complet d'aide à la décision.

 

 

Pour aller plus loin

 

Source pour le DMX : http://msdn.microsoft.com/fr-fr/library/ms132058.aspx

Add-in Office 2007: http://www.microsoft.com/sqlserver/2008/en/us/data-mining-addins.aspx

SPSS : http://www.spss.com/sqlserver/

Visual Numerics : http://www.vni.com/company/whitepapers/MicrosoftBIwithNumericalLibraries.pdf

Méthodologie CRISP-DM : http://www.crisp-dm.org/

SQL Server data mining : http://www.sqlserverdatamining.com/ssdm/

 

Blog des experts data mining chez Microsoft :

Jamie MacLennan : http://blogs.msdn.com/jamiemac/

Bogdan Crivat : http://www.bogdancrivat.net/dm/

 

 

Quel est le port d’écoute TCP d’Analysis Services

L’instance par défaut d’analysis Services utilise le port 2383. Les instances nommées utilisent la stratégie de port dynamique à savoir qu’un numéro de port libre est automatiquement affecté.

La stratégie du port d’écoute du serveur Analysis Services est définit à travers la propriété <port> du fichier de configuration « msmdredir.ini ». Ce fichier est situé dans le répertoire %Program files%\Microsoft SQL Server\90\Shared\ASConfig.

La copie d’écran ci-dessous illustre l’affectation d’un port pour une instance Analysis Services.

clip_image002

SQL Browser service utilise le port 2382.

C’est ce service qui a pour responsabilité de rediriger les appels clients vers la bonne instance avec son port associé.

Export de rapport Reporting Services au format CSV

 

Expression du besoin :

L’objectif est de définir un autre séparateur que la « virgule » pour le format CSV. Dans notre cas nous souhaitons que les données soient délimités par le séparateur « | ».

Mise en place :

La sortie du fichier CSV est personnalisable à l’aide des paramètres « Device Information »

http://technet.microsoft.com/en-us/library/ms155365.aspx et http://technet.microsoft.com/en-us/library/ms156281.aspx

Cette propriété permet de configurer en particuliers le séparateur, l’encodage, le nom de l’extension….

1) La première étape consiste à éditer le fichier rsreportserver.config et se positionner au niveau du nœud render.

2) Si nous souhaitons rajouter en plus du format par défaut, il faut

  1. Ajouter un nœud XML de type extension, en précisant un nom différent de ceux initialement présent, CSV (pipe séparateur dans notre cas)
  2. Renseigner les nœuds enfants comme le montre la copie d’écran ci-dessous. L’élément FieldDelimenter permet de spécifier le séparateur de colonne.

 

image

Une fois le fichier de configuration enregistré, puis l’instance Reporting Services redémarré, la modification est visible depuis la « toolbar » du site Report Manager comme le montre la copie d’écran ci-dessous.

image

La démocratisation de la performance de l'entreprise avec PerformancePoint Server 2007

Un besoin grandissant / La donnée au centre des entreprises

Le système d'information est devenu depuis quelques années un point central pour la croissance des entreprises. Dans un premier temps ces systèmes ont permis de collecter et de traiter l'information tout en optimisant son stockage. Puis dans un second temps, grâce à l'évolution de la puissance des machines, de la capacité disques grandissante, ces données ont pu être croisées et agrégées à des fins analytiques.

Nous voyons aujourd'hui fleurir de nombreux projets autour des problématiques « VLDB » (Very Large Data Base). Le traitement de données de masse n'est plus une barrière au grand bénéfice des projets axés sur la Business Intelligence.

 

Essentiellement pour des problématiques de coût, Le décisionnel était initialement réservé à des structures de taille importante. Depuis la sortie de SQL Server 7, il y après de 11 ans, Microsoft est allé à l'encontre de ce courant en enrichissant sans cesse son offre BI en proposant dans « une même boîte » l'ensemble des outils nécessaires dont entre autre « Analysis Services » pour la construction de cubes, « Integration Services (SSIS) » pour la partie chargement (ETL) ou encore « Reporting Services » pour la constitution de rapports.

 

 

SQL Server / Office System : un duo gagnant pour les projets décisionnels

 

Un autre outil a depuis longtemps fait ses preuves auprès des utilisateurs finaux : Excel a su s'imposer pour l'affichage et la manipulation de faibles volumes de données. Ceci est d'autant plus vrai au niveau d'une population d'utilisateurs non initiés à l'informatique qui ont du s'adapter pour faire face à la nécessité de traiter et de synthétiser des données dans leur métier au quotidien.

 

Parallèlement à la collecte de données structurées pouvant être stocké dans des bases de données, les grandes entreprises se dotent de plus en plus de portails centralisant l'ensemble des « documents » publiés par leurs différentes applications ou par leurs collaborateurs. La demande très forte des clients auprès de la division Services de Microsoft ou de nos partenaires pour des projets Microsoft Office Sharepoint Server (MOSS) en est la preuve.

 

 

La gestion de la performance : un devoir de chacun au bénéfice de tous.

La collecte des données et la constitution de cubes multidimensionnels ont permis aujourd'hui de restituer auprès d'une petite population de décideurs des indicateurs permettant d'affiner le pilotage des entreprises. Il est maintenant nécessaire de franchir une nouvelle étape afin de disposer de nouveaux outils offrant la possibilité d'analyser en fonction d'objectifs définis les indicateurs de performances souhaités.

 

La mondialisation, la complexité des entreprises et le volume croissant de données ne permet plus aujourd'hui aux entreprises de progresser en centralisant toutes les décisions. Chacun doit pouvoir à son niveau disposer des informations permettant de travailler efficacement. La consolidation des données mises à jour par ces différents acteurs doit donner une meilleure visibilité « en haut de la pyramide » sur les indicateurs de performances mais il faut également avoir la capacité d'analyser les données collectées afin de définir des axes d'améliorations efficaces pour faire progresser l'entreprise.

 

Nous pouvons par exemple identifier dans l'entreprise différent types d'acteurs :

  • Les « consommateurs de données » sont les plus nombreux. Ils affichent des rapports issus de données de l'entreprise sans avoir besoin de connaissance techniques particulières.
  • Les « requêteurs » sont un peu moins nombreux mais doivent avoir une plus grande maîtrise des sources de données qu'ils utilisent afin de pouvoir adapter leurs rapports à leur besoin.
  • Les « analystes » font partie de la population la plus restreinte. Assister de développeurs compétents, ils doivent maîtriser l'ensemble des données de l'entreprise afin d'être à même de fournir des analyses poussées sur les indicateurs de performances de l'entreprise.

 

Schéma 1 – Exemple de profils

 

La gestion de la performance dans les entreprises est donc passée d'un cadre réservé aux seuls « initié » à un cadre plus « populaire » ou chacun à son rôle à jouer pour le bénéfice de tous.

 

Oui mais PerformancePoint Server (PPS) c'est quoi ?

PerformancePoint Server 2007 est la réponse de Microsoft à ces problématiques de démocratisation du décisionnel. La synthèse des fonctionnalités évoluées de ProClarity en matière d'analyse graphique, de Business Scorecard Manager 2005 pour la constitution de tableaux de bords et le développement de nouvelles fonctionnalités complémentaires permet de proposer des solutions aux entreprises pour faire face aux enjeux de demain.

 

Ce produit est constitué de trois modules comme le montre le schéma suivant (Schéma 2 – Les modules de PerformancePoint Server 2007).

 

Schéma 2 – Les modules de PerformancePoint Server 2007

 

 

Le module « Planning » (Planifier, Budgéter & Prévoir) permet de modéliser les indicateurs de l'entreprise qui seront utiles et de définir des objectifs vis-à-vis de ceux-ci.

 

L'objectif est de disposer de données cohérentes à tous les niveaux en :

  • rationnalisant les données à l'aide de formulaires, workflows, soumissions, approbations, templates…
  • définissant des modèles applicables aussi bien unitairement qu'à l'entreprise dans son ensemble,
  • facilitant l'intégration de données provenant de sources et versions diverses en une seule vue pour simplifier les processus de planification, budgétisation et prévision.

 

La souplesse de la solution réside dans la création de plans et de budgets à l'aide d'assistants, sans la moindre ligne de code. Des modèles de conception sont fournis au travers de l'outil et l'intégration avec Excel, Outlook et Sharepoint Server 2007 offre un environnement collaboratif riche et souple à cette solution.

 

Le module « Analyse » (Analyses et Requêtes) permet d'analyser les résultats en confrontant les valeurs des indicateurs mesurés par rapport à la modélisation effectuée.

 

Ce module s'appuie principalement sur la richesse et la puissance de la plate-forme décisionnelle Microsoft offrant des possibilités de vues multidimensionnelles, de définition de règles métiers au niveau du serveur, d'analyse de causes sous-jacentes et de prévisibilité.

 

Tout comme pour le module « planning », l'outil permet de créer, de gérer et de diffuser des analyses sans la moindre ligne de code en profitant de l'intégration avec la suite Office. Le travail collaboratif est mis en avant avec la possibilité d'ajout d'annotations et de discussions aux Scorecards, de partage d'informations au travers de SQL Server Reporting Services, de SharePoint Report Center sous des formats aussi divers que sont HTML, XML, PDF. Ces possibilités sont complétées par les outils collaboratifs traditionnels de Microsoft que sont Office Excel, Outlook, Live Meeting et MSN Messenger.

 

Le module « Monitoring » (Scorecards, Dashboards & Rapports) offre une palette de possibilités vis-à-vis de l'interface de suivi des performances.

 

La visualisation des indicateurs (KPIs) peut s'effectuer de différentes manières au travers de Scorecards, de Dashboards, de Strategy maps (intégration avec Visio). La navigation dans les données (drill down/up) est facilitée et permet une utilisation large accessible à tous les collaborateurs.

 

L'outil s'intègre pleinement dans toutes les activités de l'entreprise en permettant un monitoring au jour le jour des process. Toutes les populations de l'entreprise peuvent ainsi accéder aux informations qui leurs sont destinées.

 

 

Et pour la suite…

Parallèlement à l'offre PerformancePoint Server, Microsoft dispose d'outils plus spécifiques dédiés à des populations très ciblés comme par exemple Microsoft® Forecaster qui est une solution à faible coût de budgétisation et de planification ou encore Microsoft®FRx qui est un outil de reporting financier intégré à Microsoft Dynamics GL. Ces deux modules devraient être intégrés dans le module « Sierra » qui dans un premier temps pourra être mis en œuvre en parallèle avec PerformancePoint et dans un second temps sera intégré au produit.

 

En conclusion

PerformancePoint Server 2007 est un outil complet et intuitif dans son utilisation qui s'inscrit pleinement dans la stratégie de l'offre globale de Microsoft. Son couplage avec de nombreux produits dont entre autre SharePoint est indispensable pour bénéficier d'un fonctionnement agréable. Ce produit devrait très vite être adopté par de nombreuses entreprises désireuses de disposer d'outils leurs offrants un avantage compétitif vis-à-vis d'une concurrence mondiale de plus en plus acharnée.

 

Pour aller plus loin

Présentation du produit PerformancePoint Server 2007 :

http://office.microsoft.com/fr-fr/performancepoint/FX101680481036.aspx

Les acteurs du décisionnels :

http://www.olapreport.com/

Bonnes pratiques de design SSAS

Passons en revue quelques bonnes pratiques de design SSAS

Design des dimensions

 

Création de relations entre attributs

Il est important de créer des relations entre les attributs au sein d'une dimension. En effet les agrégats sont calculés à partir des relations entre les attributs.

 

Eviter de rajouter des attributs non utilisé

L'ajout d'attributs non utilisé affecte l'espace de stockage du cube et en même temps les performances.

S'il n'est pas nécessaire de créer une hiérarchie pour un attribut, il est intéressant de définir la propriété AttributeHierachyEnabled à false.

Le fait de configurer cette propriété améliore les temps de processing et diminue la taille du cube car l'attribut ne sera plus indexé ni agrégé.

Il est intéressant d'appliquer cette règle par exemple pour une adresse ou un numéro de téléphone.

 

Utilisation des clés numériques

L'usage de clés numérique améliore les performances, ce qui est particulièrement vrai pour les dimensions avec un nombre de membres important.

 

Extrait du Microsoft SQL Server 2005 Analysis Services Performance Guide

From a processing perspective, it is a best practice to assign a numeric source field to the KeyColumns property rather than a string property. Not only can this reduce processing time, in some scenarios it can also reduce the size of the dimension. This is especially true for attributes that have a large number of members, i.e., greater than 1 million members.

 

Eviter de créer des relations redondantes au sein des attributs

La redondance au niveau des attributs a un impact au niveau des performances.

Par exemples si les relations entre attributs A->B, B->C, et A->C ont été crées, A->C est redondant et devrait être enlevé.

 

Définition des types de relation dans le temps

Si les relations entre attributs ne changent pas au cours du temps, il est important de les définir comme Rigid. Ainsi, les agrégats ne sont pas détruits lorsque du process de la dimension.

 

Traitement des erreurs dans le processing d'une dimension

Il faut éviter de configurer la propriété ErrorConfigurations est definini à IgnoreError.

Il est préférable de traiter en amont la correction de données et d'identifier les lignes en erreur.

 

Création des relations au sein des différents niveaux d'une hiérarchie

Dans un souci de performance, il est important de définir des relations au sein des attributs qui définissent une hiérarchie.

 

Eviter de créer des relations de type diamond-shaped

Une relation de type " Diamond-shaped" correspond à une chaîne d'attributs qui ont se séparent et se rejoignent par la suite.

Ce type de relation peut avoir un impact lors de la création des agrégats sur le serveur.

Dans ce cas, il est fortement recommandé de créer une hiérarchie utilisateur qui contient tous les chemins.

 

Design du cube

Eviter d'avoir beaucoup de dimension parent-child

L'usage des relations parent-enfant doit être effectué avec parcimonie.

 

Eviter d'avoir un groupe de mesure intermediaire ou une dimension trop importante dans une relation many-to-many

Les relations many-to-many sont calculées à la vole, ce qui peut être pénalisant pour les dimensions importantes ou les groupes de mesures intermédiaires.

 

Eviter de créer plusieurs groups de mesure avec les mêmes axes d'analyse et le même niveau de granularité.

Le fait d'avoir un nombre important de groupe de mesure peut avoir un impact sur les performances.

Si les axes d'analyse sont communs avec la même granularité des indicateurs, il est pertinent de regrouper les groupes de mesures.

 

 

Isoler chaque distinct count mesure dans un groupe de mesure séparé

Positionner chaque distinct count mesure dans son propre groupe de mesure améliore les performances.

 

Matérialiser les mesures de référence

Afin d'améliorer les performances, les dimensions de référence doivent être matérialisées.

Vers une meilleure modélisation

Avant de rentrer dans le cœur du sujet, représentons les concepts et les bonnes pratiques de modélisation des liens entre attributs.

Les relations d’attributs

Tous les attributs sont liés directement ou indirectement à l’attribut clé. En créant des hiérarchies, il est facile de créer des relations redondantes.

Ainsi la relation Customer à City n’est pas redondante, ce qui n’est pas le cas pour la relation suivante Customer à Country qui peut être obtenu indirectement.

Cette redondance a bien sur un impact sur le stockage de la base de données.

De plus les attributs possèdent un type qui peut être qualifiés de rigide ou de flexible.

Une relation entre attribut est dite rigide si elle n’évolue pas dans le temps comme par exemple, le sexe d’une personne.

Lorsque les types de relation sont flexibles, les agrégats sont automatiquement supprimés lors du traitement de la dimension et doivent être reconstruit à l’aide de l’instruction « process index » contrairement aux relations rigides. Par défaut, le type de relation est flexible.

Ce point est important à prendre en compte lorsque la fenêtre pour traiter le cube est limitée.

Les hiérarchies naturelles

A partir de lien d’attributs, il est possible de définir des hiérarchies naturelles et non naturelles.

Une hiérarchie est dite naturelle lorsqu’une unicité est définie pour chaque parent de la hiérarchie.

Ainsi la hiérarchie Country-State-City-Customer est naturelle tandis que Age-Gender-Customer ne l’est pas. En effet, si nous remontons la hiérarchie, à partir d’un sexe donné, il n’est pas possible de définir le parent ; le seul moyen est de naviguer par l’attribut clé.

D’un point de vue performance, une hiérarchie naturelle est matérialisée alors qu’une hiérarchie non naturelle est calculée à la volée.

Sous SQL Server 2005, il était facile de créer une hiérarchie non naturelle car l’option de la dimension KeyDuplicate était à IgnoreError.

Comment implémenter les bonnes pratiques ?

Le nouvel outil BID 2008, Business Inelligence Developpment, propose une nouvelle interface simplifié afin de guider l’utilisateur dans l’implémentation des bonnes pratiques de conception.

Tout d’abord les assistants de création de cube et de dimension ont été simplifiés. Ainsi, sur un même écran, il est possible de définir un nombre de propriété important sur un un attribut comme son nom simplifié, son type, l’activation de la navigation. De plus des validations s’effectuent en temps réels comme par exemple un avertissement qui apparaît si un nom n’est pas spécifié lorsqu’une clé composite d’une dimension est définie.

clip_image002

Nous avons vu qu’il est important d’utiliser avec précaution des hiérarchies non naturelles et d’éviter de créer des attributs redondants, ce qui auraient des impacts négatifs sur les performances.

Afin d’avoir une synthèse des relations entre les attributs, BID propose un nouvel onglet, l’attribute relationShip designer.

Ainsi, sous la figure ci-dessous nous pouvons aisément voir à l’aide du message d’avertissement qu’il y a une redondance entre les relations MonthsàCalendar QuarteràCalendar Semester et Monthsà Calendar Semester.

clip_image004

Cette version apporte donc un ensemble de règles de validation de bonnes pratiques. L’utilisateur est donc guidé, ce qui continue à démocratiser la Business Intelligence.

Il est d’ailleurs possible d’accéder et de modifier ces règles de validation et en particuliers de les activer ou désactiver soit au niveau du projet ou alors au niveau d’un élément plus fin comme la dimension.

LES CURSEURS SOUS SQL SERVER

EVITER LES CURSEURS, OUI MAIS…

« N'utilisez pas les curseurs, ils ne sont pas performants » est une phrase qui revient souvent dans la bouche des DBA.

Certes, une grande partie des traitements de boucle sont remplaçables par des traitements ensemblistes, d'autant

plus que le moteur relationnel est optimisé pour ce type de tâche.

Notons au passage que parmi les « templates » de code T-SQL fournis avec SQL Server Mangement Studio, l'outil

de développement et d'administration fourni avec SQL Server 2005, les curseurs ne figurent plus dans la liste.

Cependant, il est parfois nécessaire d'exécuter un traitement pour chaque ligne d'un résultat, comme définir une

concaténation de caractères, lancer un traitement spécifique…

Comment éviter donc l'usage du curseur ?

METHODES ALTERNATIVES A L'UTILISATION DES CURSEURS

Il existe de nombreuses techniques alternatives à l'utilisation des curseurs dont chacune s'adapte généralement plus

dans un contexte précis.

Explorons trois de ces techniques.

La première consiste à utiliser une requête avec paramètre, la deuxième à utiliser une variable de type table avec une

boucle While et la troisième à faire appel à définir une procédure stockée en .NET.

Requête avec paramètre

Un besoin qui fréquemment est de pouvoir concaténer le résultat des champs d'une requête.

Le principe est d'empiler les résultats d'un SELECT dans une variable.

Prenons un exemple sur la table HumanResources.Department de la base exemple de SQL Server 2005, AdventureWorks.

Concaténons le nom des départements.

La fonction COALESCE permet de traiter le cas des valeurs nulles.

Variable table avec une boucle While

Le principe est d'utiliser une variable de type table, de l'alimenter et boucler en fonction du nombre de lignes insérées,

information obtenue grâce à la variable globale @@ROWCOUNT.

A la différence de la première technique, celle-ci permet d'effectuer un traitement pour chaque ligne recherchée.

Sur ce principe recompilons chaque procédure de notre base à l'aide du code suivant :

La liste des procédures de la base est obtenue en interrogeant la vue système de SQL Server 2005 sys.objects. Pour

les versions ultérieures, il faudra utiliser la vue sysobjects. Une colonne de type IDENTITY a été définie sur notre variable

table afin de pouvoir effectuer le traitement définie sur chaque élément de notre résultat.

Procédure en C#

L'apport de la CLR dans SQL Server donne une très grande richesse pour certains traitements la manipulation de

caractères ou des calculs mathématiques qui sont moins efficaces en T-SQL et surtout plus fastidieux à écrire.

Regardons à travers l'exemple ci-dessous le fonctionnement d'une procédure en C#.

La manière de coder une procédure en .NET est très proche de celle employée dans ADO.NET.

Les différences notables sont surtout au niveau de l'objet « connection » et de l'objet « SqlPipe » permet de définir le

« resultset » à renvoyer au client.

L'instruction ("context connection=true")) précise que la connexion utilisée est celle de SQL Server. Dans cet exemple, l'ob-

USE AdventureWorks

DECLARE @DptName varchar(max);

SET @DptName = '';

select @DptName= @DptName + COALESCE(Name +',','') from HumanResources.Department;

IF @DptName IS NOT NULL

SET @DptName = SUBSTRING(@DptName,1,LEN(@DptName)-1)

SELECT @DptName

SET NOCOUNT ON

DECLARE @rows int, @j int;

DECLARE @schemaName nvarchar(128);

DECLARE @name nvarchar(128);

DECLARE @procName nvarchar(128);

DECLARE @procTable TABLE(pk int IDENTITY (1, 1),schema_name nvarchar(128) , name nvarchar(128));

INSERT INTO @procTable

SELECT schema_name(schema_id),name FROM sys.objects WHERE type in ('P','U','V') and name not

in('sp_helpdiagrams','sp_creatediagram','sp_alterdiagram', 'sp_dropdiagram', 'sp_renamediagram',

'sp_upgraddiagrams','sp_helpdiagramdefinition')

SET @rows = @@ROWCOUNT;

SET @j = 1;

WHILE @j<= @rows

BEGIN

SELECT @schemaName = schema_name, @name = name FROM @procTable WHERE pk = @j;

SET @procName = @schemaName +'.'+@name

EXECUTE sp_recompile @procName

SET @j = @j + 1;

END;

jet SqlPipe renvoie une chaîne de caractères mais nous pouvons aussi renvoyer un enregistrement ou une table.

Notons tout de même à propos de cette nouvelle fonctionnalité que les manipulations d'ensembles seront toujours

plus performantes à l'aide des instructions T-SQL.

A PROPOS DES PERFORMANCES

Connaissez-vous la règle des 80-20 ? Elle consiste à optimiser 20 pourcent des traitements les plus couteux pour

améliorer 80 pourcent des performances du serveur.

Chaque base de données possède ses spécificités. Ainsi, même deux bases ayant la même structure et des volumétries

identiques peuvent avoir des performances différentes.

En conclusion, ne vous jetez pas sur la réécriture de tous vos curseurs et passez, au contraire, davantage de temps

sur vos traitements couteux en ressources, d'autant que, parfois, le curseur sera plus performant que d'autres techniques…

SQL Server nous fournit plusieurs d'outils de monitoring tels que le profiler, le perfmon, les instructions SET

STATISTICS IO, SET STATISTICS TIME…

using System.Data;

using System.Data.SqlClient;

using System.Transactions;

using Microsoft.SqlServer.Server;

public partial class StoredProcedures

{

[Microsoft.SqlServer.Server.SqlProcedure()]

public static void SampleSP(int rating)

{

using (SqlConnection conn = new SqlConnection("context connection=true"))

{

conn.Open();

string rsResult;

SqlCommand cmd = new SqlCommand(

"SELECT VendorID, AccountNumber, Name FROM Purchasing.Vendor " +

"WHERE CreditRating <= @rating", conn);

cmd.Parameters.AddWithValue("@rating", rating);

SqlDataReader r = cmd.ExecuteReader();

while (r.Read())

{

// effectue des traitements dans la boucle

}

SqlContext.Pipe.Send(rsResult);

}

}

}

REFERENCES

T-SQL Coding standards :

http://msdn.microsoft.com/library/default.asp?url=/library/

en-us/dnsqlpro04/html/sp04l9.asp

Best SQL Server Performance Tuning Tips:

http://www.sql-serverperformance.

com/best_sql_server_performance_tips.asp

Cursor performance :

http://www.sqlteam.com/item.asp?ItemID=5761

Managed Data Access Inside SQL Server with ADO.NET and SQLCLR

http://msdn.microsoft.com/library/default.asp?url=/library/

en-us/dnsql90/html/mandataaccess.asp

Gestion des relations sous SSAS 2008

 

Le dimension designer de la CTP 5 de SQL Server 2008 propose un nouvel onglet « l’attribute relationShip ».

clip_image002

Pourquoi rajouter cet onglet ?

clip_image004Représenter graphiquement les relations entre les différents attributs définis à travers les hiérarchies

Ainsi la copie d’écran ci-dessous modélise l’ensemble des relations entre les différents attributs des hiérarchies précédemment définis.

clip_image006

clip_image004[1]Créer une propriété de membre d’un attribut qui peut par exemple être utilisé pour faire des tris

Sur la copie d’écran ci-dessous, l’attribut « Month Name » contient l’attribut Month of Year

clip_image008

clip_image004[2]Donner une vision globale des types de relations utilisées.

Une bonne pratique est de définir des relations de type « Rigid » lorsque les relations entre les attributs n’évoluent pas dans le temps.

Comme le montre la copie d'écran ci-dessus, les relations de type "Rigid" sont représentées avec des flèches en gras.

Mode d’emploi :

Les relations se créent à l’aide de glisser-déplacer d’un attribut sur un autre.

Renvoyer les N enregistrements d’une table jointe

Utilisation de la fonction CROSS APPLY

Cette nouvelle fonction en plus d'être performante simplifie grandement l'écriture de certaines requêtes comme celui de retourner les n enregistrements d'une table jointe.

SELECT

CustomerID,

L.SalesOrderID

FROM

Sales.Customer c

CROSS APPLY

(

SELECT

top 5 SalesOrderID

FROM

Sales.SalesOrderHeader s

WHERE

s.CustomerID = c.CustomerID

ORDER BY

SalesOrderID DESC

 

) L

ORDER BY

CustomerID

 

Faire une concaténation sur un résultat d’une requête

Premier cas : Concaténer le résultat d'une colonne sur une ligne

Le principe est d'empiler les résultats d'un SELECT dans une variable.

Prenons un exemple sur la table HumanResources.Department de la base exemple de SQL Server 2005, AdventureWorks.

Concaténons le nom des départements.

USE AdventureWorks

DECLARE @DptName varchar(max);

SET @DptName = '';

select @DptName= @DptName + COALESCE(Name +',','') from HumanResources.Department;

IF @DptName IS NOT NULL

SET @DptName = SUBSTRING(@DptName,1,LEN(@DptName)-1)

SELECT @DptName

 

Cette méthode possède l'avantage de travailler de manière ensembliste et ne fait pas appel à un curseur.

 

Deuxième cas : Concaténer les lignes jointes

Traitons ce cas de trois manières et comparons le temps CPU à l'aide de l'instruction set statistics time ON.

Le premier cas de figure utilise une fonction explicitement crée

 

CREATE FUNCTION dbo.GetMedalResult

(

    @CustomerID bigint

)

RETURNS VARCHAR(max)

AS

BEGIN

    DECLARE @r VARCHAR(max)

      SET  @r = ''

    SELECT @r = @r + COALESCE(convert(varchar(max),SalesOrderID )+',', '')        

        FROM Sales.SalesOrderHeader

        WHERE CustomerID = @CustomerID

      IF @r <> ''

      SET @r = SUBSTRING(@r,1,LEN(@r)-1)

    RETURN @r

END

GO

 

La requête

SELECT   CustomerID, dbo.GetMedalResult(CustomerID)

FROM Sales.Customer

order by CustomerID

retourne le tableau suivant

CustomerID

SalesOrderIDs

1

43860,44501,45283,46042

2

46976,47997,49054,50216,51728,57044,63198,69488

3

44124,44791,45568,46377,47439,48378,49538,50748,53616,59011,65310,71889

 

Temps CPU :

Sur mon environnement de travail, j'obtiens les résultats suivant :

CPU time = 3588 ms, elapsed time = 3702 ms.

 

Le deuxième cas de figure s'appuie sur les fonctionnalités de XML incluses dans le moteur SQL Server.

 

USE AdventureWorks

GO

   

SELECT

    CustomerID,

    SalesOrderIDs = REPLACE(

        (

            SELECT

                SalesOrderID AS [data()]

            FROM

                Sales.SalesOrderHeader soh

            WHERE

                soh.CustomerID = c.CustomerID

            ORDER BY

                SalesOrderID

            FOR XML PATH ('')

        ), ' ', ',')

FROM

    Sales.Customer c

ORDER BY

    CustomerID

 

Temps CPU :

--CPU time = 265 ms, elapsed time = 378 ms.

Le temps CPU est divisé par plus de 10 en utilisant la les fonctionnalités de XML incluses dans le moteur SQL Server. La fonction data renvoie les éléments sur une même ligne séparée d'un espace.

   

Le troisième cas de figure s'appuie sur en plus des XML de la nouvelle clause SQL Server 2005 CROSS APPLY

   

USE AdventureWorks

GO

   

SELECT

    CustomerID,

    SalesOrderIDs = LEFT(o.list, LEN(o.list)-1)

FROM

    Sales.Customer c

CROSS APPLY

(

        SELECT

            CONVERT(VARCHAR(12), SalesOrderID) + ',' AS [text()]

        FROM

            Sales.SalesOrderHeader s

        WHERE

            s.CustomerID = c.CustomerID

        ORDER BY

            SalesOrderID

        FOR XML PATH('')

    ) o (list)

ORDER BY

    CustomerID

Temps CPU :

CPU time = 218 ms, elapsed time = 330 ms.

Le temps CPU est légèrement plus performant que le précédant cas de figure.

Page view tracker