[SSIS] Change Data Capture (CDC) dans SSIS 2012

Le change data capture est un concept qui n’est pas propre à SQL Server (présent dans d’autres SGBD tels que Oracle), et qui consiste à suivre et à récupérer les changements sur les données dans une table.
Il a été implémenté au niveau de SQL Server 2008, mais exclusivement au niveau du moteur de base de données : beaucoup d’articles de blog en ont parlé à l’époque, je vous invite à vous référer à larticle de François Jehl.

Un des côtés fastidieux du CDC était le traçage par LSN et donc l’écriture des requêtes qui pouvait être pénible sous SSIS.

Dans SQL Server 2012, Microsoft va plus loin dans sa démarche et nous donne 3 composants pour utiliser le CDC directement dans SSIS :

  • Une tâche CDC Control Task qui va gérer le cycle de vie des packages CDC, et notamment toute la mécanique des LSN.
  • Deux composants pour DataFlow Task, un CDC Source qui, comme son nom l’indique lit les informations d’une table de change data capture, et un CDC Splitter qui, lui va rediriger les lignes selon qu’elles doivent être insérées, mises à jour ou supprimées.
En pratique :
On va créer un package SSIS utilisant les composant CDC pour alimenter une table finale à partir d’une table source.
Je crée une table source de tarifs de produit dans laquelle j’insère un jeu de données test.
Sur cette table j’active le CDC. Ici c’est la même chose que sous SQL Server 2008, on retrouve les mêmes commandes.
Package d’initialisation 
Dans SSIS, je crée mon package d’initialisation qui va effectuer la première alimentation de ma table destination et initialiser une variable d’état du CDC.
Le package se présente sous la forme suivante :
Les paramètres à saisir dans le CDC Control Task Start sont les suivants :

  • Dans « SQL Server CDC database ADO.NET connection manager », renseigner le connection manager SSIS où est utilisé le change data capture
  • Dans « CDC control operation », sélectionner « Mark initial load start »
  • Dans « Variable containing the CDC state », donner le nom d’une variable où l’on va stocker l’état du CDC. Cliquer sur New s’il s’agit du premier appel.
  • Les 3 champs suivants definissent respectivement la base de données, la table et le champ de la table où l’on stocke l’état du CDC

Le flux de contrôle « CDC Control Task End » est à configurer de la même manière, sauf que l’on sélectionne « Mark initial load end » dans « CDC control operation »
Le dataflow Task consiste en un bête chargement de table :
On peut dès lors exécuter le package et vérifier les données que j’ai dans ma table destination.

Package d’alimentation quotidien

On crée maintenant le package d’alimentation quotidien : il ressemble à notre package initial dans sa structure (toujours un CDC control task suivi d’un dataflow task et d’un autre CDC control task).

Dans le CDC Control Task Start on sélectionne « Get processing range » dans le « CDC control operation » :

Dans le CDC Control Task End, on sélectionne « Mark processing range » dans le « CDC control operation » :

Le dataflow task est maintenant développé de la manière suivante, à l’aide des deux nouveaux composants SSIS (CDC source et CDC splitter) :

Je m’attarde sur le CDC source, notamment au niveau du CDC processing mode. Je vous laisse consulter l’article suivant de Matt Masson (qui fait partie de l’équipe de développement de SSIS) pour comprendre pourquoi j’ai choisi « Net » :

J’effectue quelques requêtes de modifications de données dans ma table source et j’exécute ensuite mon package.

Dans mon dataflow, on retrouve bien les modifications effectuées sur ma table source, et ma table de destination est bien à la fin de l’exécution semblable à la table source :

Là où ça devient intéressant est que si vous relancez le package, aucune ligne n’est générée dans le dataflow. SSIS a géré tout seul les LSN grâce à nos CDC control task, et sait qu’il n’y a pas eu de changement pas rapport à la précédente exécution.

Conclusion :

SSIS 2012 implémente la gestion en natif du change data capture et simplifie son utilisation. La gestion pénible des LSN pour dater les changements devient implicite : aucune requête à écrire dans mon dataflow task au niveau des sources et aucune manipulation de dates à implémenter :
En revanche, il faut garder à l’esprit que le CDC peut être gourmand en ressources sur vos bases sources, comme c’était déjà le cas sur SQL Server 2008.

Publié dans Integration Services

[Modélisation BI] Les Clés Etrangères

Relançons le débat pour un vendredi : faut-il mettre des clés étrangères dans un datawarehouse.
Sujet sensible puisque deux sessions aux dernières journées SQL Server en ont plus ou moins parlé :

Comme Florian le suggère sur son blog, vous devinerez que je suis partisan de ne pas en mettre.

Pourquoi une telle hérésie ?

Je fais de l’informatique décisionnelle : ma base de données se charge via des batchs uniques développés majoritairement avec SSIS (tout du moins pour mon cas). Mes tables n’ont donc qu’une façon unique d’être alimentée et ce qu’on insère doit, de ce fait, être totalement maîtrisé par mon package (voir mon article sur la gestion des orphelins à ce sujet).
C’est un point essentiel de ma démonstration : losrque je fais du développement SQL pour une application .NET par exemple, je mets des clés étrangères car mes tables peuvent dépendre à la fois de batch ou d’écrans de l’application, etc.

L’autre point essentiel est l’optimisation de mes traitements : la fenêtre temporelle pour le chargement des données est par expérience de plus en plus réduite et le volume des données toujours plus grand. Toute optimisation de chargement est donc bonne à prendre.
C’est pour cela également que je ne fais pas un un rejet total de toutes les contraintes : j’implémente des clés primaires et des index uniques bien pensés au niveau de mon datawarehouse

Et l’intégrité des données dans tout ça ?

Garantir l’intégrité des données par des relations de clés étrangères c’est bien, mais ça peut être coûteux en performance. Développer une solution d’alimentation qui ne permet pas de créer des problèmes d’intégrité, c’est mieux.
Il faut garder à l’esprit que vous devrez de toute façon repasser sur votre alimentation et redévelopper vos packages si vous avez des données non intègres. Les clés étrangères ne vous épargneront pas ce travail, donc autant y remédier en amont.

Et concrètement dans la pratique ?

Les conditions de test sont les suivantes :

  • Machine Virtuelle en Windows 7
  • SQL Server 2008
  • 4 CPU
  • 3 Go de Ram

J’ai fait un test avec une table de dimension Produit à 50000 lignes et une table de dimension Client à 50000 lignes.
J’ai imaginé une table de faits avec un idTemps, un IdClient, un IdProduit et une quantité.
Un index unique sur les Id est créé.

 J’utilise un package SSIS d’upsert classique développé avec un double lookup.

Le premier test consiste en un chargement de 250000 lignes dans la table de faits lorsque celle-ci est vide.

Résultats :

Sans clé étrangère Avec clés étrangères
6s078 7s458

Le second test consiste en un chargement de 250000 lignes dont la moitié sont en update et l’autre moitié sont en insert.
Résultats :

Sans clé étrangère Avec clés étrangères
1min32 1min39
Conclusion :
Je ne prétends pas clore le débat avec cet article, mais juste exposer mes préférences et les argumenter. Il faut garder à l’esprit que les tests effectués ici sont faits sur une faible volumétrie et seulement deux clés étrangères.
Il convient enfin de garantir que votre solution d’alimentation empêche l’insertion de données non intègres pour pouvoir justifier la non-utilisation des clés étrangères.
Publié dans Modélisation BI

SQL Server 2012 et Techdays 2012

Un petit message pour faire le point sur SQL Server 2012 :

La date de sortie est prévue pour le 7 Mars 2012

A ce sujet, je vous conseille de jeter un oeil sur le blog de Charles-Henri Sauget si vous souhaitez vous installer une maquette sur une machine virtuelle. Il consacre une série d’articles qui va de l’installation de SQL Server jusqu’à la production des rapports, et ceci de manière très bien détaillée.

Autre actualité autour des technologies Microsoft et donc de SQL Server 2012, la tenue des Techdays 2012, les 7, 8 et 9 Février au Palais des Congrès à Paris.


Beaucoup de sessions autour de SQL Server 2012 de prévues, année de sortie oblige :

  • 2012 : les utilisateurs prennent le pouvoir ?
  • Analysis Services 2012 : BI Personnelle, couche sémantique, cube, quelle(s) solution(s) pour un nouveau projet décisionnel?
  • Business Intelligence ou Intelligence pour le Business avec SQL 2012 ? 
  • Mettre en Oeuvre une Plateforme d’Intégration et de Gestion des Informations de l’Entreprise (EIM) avec SQL Server 2012 Master Data Services
  • Le futur a-t-il besoin de nous ?
  • Vous avez dit Power View ?
  • BI en libre-service et maîtrise de l’IT, pourquoi choisir ?
  • SQL Server 2012: Gérer vos données maitres avec Master Data Services (MDS)
  • SQL Server 2012 : Gérez la qualité de vos données avec Data Quality Services (DQS)
Je serai sûrement présent les 8 & 9 Février et j’essaierai d’assister aux sessions précédemment citées. Il y a de fortes chances que je traîne souvent avec Florian Eiden également.
Publié dans SQL Server

[SSAS] Ajouter de l’intelligence à votre cube Analysis Services (Year To Date YTD, Month To Date MTD,…)

Un article que je voulais faire depuis longtemps, donc je profite du temps que j’ai devant moi.
On donne toujours comme avantage à un cube par rapport à une base de données relationnelle, sa facilité à naviguer sur les dates.
De là découle une certaine facilité à créer des membres calculés en MDX tels que des Year To Date, des Month To Date, des 3 Jours Glissants, etc… bien qu’ils ne soient pas intégrés par défaut.

On va montrer comment les intégrer dans un cube SSAS en moins de temps qu’il ne faut pour le dire.

Conseil :
Je recommande de faire la manipulation sur un cube finalisé. Ca vous évitera de mettre les mains dans le code MDX pour rajouter des mesures ou modifier des noms.

 Processus :

  • Ouvrir sa solution Analysis Services, et aller sur le cube.
  • Cliquer sur « Add Business Intelligence »

  • Dans la fenêtre qui s’ouvre, cliquer sur « Next », puis sélectionner « Define Time Intelligence » et cliquer sur « Next »
  • Choisir ensuite une hiérarchie et le type de mesures d’analyse temporelle que vous voulez ajouter.
Remarques :
Les indicateurs créés dépendent de la hiérarchie. Il faut donc recommencer l’opération autant de fois que l’on a de hiérarchies date.
Votre dimension doit être définie comme une dimension date en spécifiant bien les niveaux (plus il y a de niveaux définis, plus le choix de mesures à rajouter est grand)
  • Dans l’exemple, j’ai choisi la hiérarchie « Calendar », pour un YTD, un MTD et un 12 Mois Glissants.
  • Sélectionner les mesures sur lesquelles vous voulez appliquer ses analyses. Dans l’exemple, je choisis « Internet Sales Amount » et « Internet Order Quantity », puis cliquer sur « Finish », puis encore sur « Finish » dans la fenêtre d’après.
Le travail est terminé, on va maintenant regarder comment se présentent les résultats.

Dans notre hiérarchie Temps que l’on a utilisée, un nouvel attribut nommé « Calendar Date Calculations » est disponible. Il prend pour valeur les 3 analyses que l’on a sélectionnées lors de la création (YTD, MTD, 12 mois glissants) plus la période courante (qui correspond à la valeur à date, c’est-à-dire sans analyse)
Mais qu’est-ce qui s’est passé concrètement ?
Dans le DataSourceView, l’assistant a créé une Named Calculation nommé « Calendar Date Calculations » qui correspond à notre attribut d’analyse qui vaut « Current Date ».
L’assistant a créé ensuite le code MDX qui initialise notre nouvel attribut pour les valeurs YTD, MTD et 12 mois glissants. Puis fait un scope sur les mesures que l’on a sélectionnées avec les formules adéquates.
On imagine aisément que l’on peut s’appuyer sur ce code MDX pour créer des analyses qui ne seraient pas présentes dans l’assistant.
Conclusion :
Normalement vos utilisateurs seront friands de ce genre d’implémentation. Et vu le temps de mise en oeuvre, il serait dommage de les en priver.
Publié dans Analysis Services

Gestion des Orphelins

La gestion des orphelins est une problématique récurrente de tous les projets décisionnels. On va détailler ici les 3 méthodes permettant de gérer tout ça.

Tout d’abord : qu’est-ce qu’un orphelin ? Il s’agit d’une clé dans notre table de fait qui arrive de notre système source, mais qui n’est pas référencée dans la dimension associée. Comment cela peut-il se produire ? Plusieurs hypothèses sont possibles : une erreur à la saisie lors d’une gestion par saisie manuelle d’un code, des systèmes de gestions indépendants n’ayant pas des mises à jours simultanées, … Les causes peuvent être multiples.

Dans les exemples qui suivent on va partir d’une table de faits de ventes qui contient un code client qui n’est pas dans la dimension client (l’exemple n’est pas innocent, c’est un cas rencontré chez un client. La création de la carte client remontait dans les systèmes sources avec une latence d’une quinzaine de jours alors que la vente était bien saisie sur la carte non encore créée)

On a donc en tables sources les tables suivantes :

Une table source Client :

Code Client Nom Prénom
12 Pierre Jean
15 Dupont Jacques
25 Martin Louis

Une table source Ventes :

DateVente CodeClient CodeProduit Quantité
12/12/11 12 FR1234 2
12/12/11 12 FR3421 5
13/12/11 25 GR0987 10
15/12/11 40 RF5483 9

qui contient bien un client non référencé (ici le CodeClient 40)

1ère méthode : Le rejet


La première méthode est la plus simple : elle consiste à dire que cette ligne de ventes avec un client inconnu est une anomalie, et à rejeter de ce fait la ligne.

Attention, il faut penser à insérer la ligne rejetée dans une table de rejet pour pouvoir retenter une intégration une fois notre système source client mis à jour.

On a donc au final les 3 tables suivantes :

Une dimension Client :

IdClient CodeClient Nom Prénom
1 12 Pierre Jean
2 15 Dupont Jacques
3 25 Martin Louis

Une table de faits Ventes :

IdDate IdClient IdProduit Quantité
20111212 1 1 2
20111212 1 2 5
20111213 3 3 10

Et une table de rejet :

DateVente CodeClient CodeProduit Quantité
15/12/11 40 RF5483 9

Cette méthode est une des plus simples à mettre en place. Il faut juste penser à rejouer l’intégration des lignes de la table de rejet de manière régulière.

2ème méthode : Création d’un membre inconnu

La méthode vue précédemment a un inconvénient : à un instant t, on peut avoir au niveau global des différences de chiffres. En effet des lignes sont rejetées, ce n’est pas la meilleure manière de gérer l’intégrité des données.
La solution consiste donc à définir un client inconnu sur lequel on rattachera les lignes contenant un code client absent du système source.

On crée donc un client inconnu dans notre nouvelle table de dimension Client (souvent en id -1, ligne que l’on créera une bonne fois pour toutes au moment de la création de la table) :

IdClient CodeClient Nom Prénom
-1 N/A N/A N/A
1 12 Pierre Jean
2 15 Dupont Jacques
3 25 Martin Louis

Et au moment du chargement de notre table de faits Ventes, on met comme IdClient -1 lorsqu’on trouve un client non présent dans la table de dimension :

IdDate IdClient IdProduit Quantité
20111212 1 1 2
20111212 1 2 5
20111213 3 3 10
20111215 -1 4 9

Cette méthode est la plus répandue sur les projets décisionnels. Elle a cependant un inconvenient majeur, c’est qu’on a une perte d’information. Si le client est créé ultérieurement notre ligne sera toujours rattaché au client inconnu dans notre table de faits.

Pour cela, on peut utiliser une variation de cette deuxième méthode (méthode 2bis) qui consiste à rajouter dans notre table de faits le CodeClient afin de pouvoir mettre à jour l’IdClient une fois le client créé dans le système source.

La table de faits Ventes ressemblerait donc à :

IdDate IdClient CodeClient IdProduit Quantité
20111212 1 12 1 2
20111212 1 12 2 5
20111213 3 25 3 10
20111215 -1 40 4 9

Cela nécessite comme la première méthode le passage d’un script de mise à jour que l’on planifierait par exemple toutes les semaines ou tous les mois.
Je n’aime pas trop cette variation car elle crée dans la table de faits des données qui n’ont pas grand chose à y faire.

3ème méthode : la méthode « ultime »

La dernière méthode empêche toute perte d’informations mais peut être coûteuse en performance.
Elle consiste à scanner en amont du chargement de la table de faits les codes client non présents dans la table de dimension, et à les insérer dans la table de dimension, avec des attributs neutres qui seront mis à jour lors de l’arrivée du client dans le système source.

On obtient alors la table de dimension suivante :

IdClient CodeClient Nom Prénom
1 12 Pierre Jean
2 15 Dupont Jacques
3 25 Martin Louis
4 40 Inconnu Inconnu

Le nom inconnu et le prénom inconnu seront mis à jour lors de l’arrivée dans le système source du client ayant le CodeClient 40.

Et notre chargement de la table de faits donne la table suivante :

IdDate IdClient IdProduit Quantité
20111212 1 1 2
20111212 1 2 5
20111213 3 3 10
20111215 4 4 9

Cette méthode est la plus robuste (d’où le nom « ultime ») dans le sens où vous pouvez alimenter votre table de faits sans lancer l’alimentation de votre table de dimension et ne pas perdre d’informations.

Conclusion :

Le méthode 2bis et 3 sont les plus robustes en terme de conservation de l’information. En revanche, elles n’ont d’intérêt que dans le cas où on a une chance de recevoir ultérieurement le client dans le système source. Dans les faits, ce sont la méthode 2 et dans une moindre mesure la méthode 3 qui sont les plus utilisées sur les projets.
Gardez à l’esprit que la gestion des orphelins doit se faire en fonction du souhait de votre client car il s’agit avant tout d’une problématique fonctionnelle. Ce n’est pas au développeur de décider quelle méthode implémenter, mais c’est à lui d’informer son client quand aux différentes gestions possibles.

Publié dans Modélisation BI

Un maître mot : l’Ergonomie

Pendant ma dernière année d’études, j’avais un cours d’ergonomie. Vous savez le cours dont on ne sait pas trop pourquoi il se trouve dans notre emploi du temps, et dont on ne voit l’intérêt qu’après quelques années d’expériences.
Je repensais à tout cela lors de mon retournement de veste pour repasser d’Android à iOs (quoi de mieux qu’Apple pour caractériser l’ergonomie)

Au final, je peux dire que mon choix de ma spécialité sur les technologies Microsoft dans le domaine de la BI s’est fait sur l’ergonomie des différents outils.

Comme tous les consultants en Business Intelligence, j’ai commencé par développer des packages Integration Services et lorsque j’ai mis les mains dans d’autres ETL (Datastage ou Informatica pour ne pas les citer), je n’ai eu qu’une envie : retourner sur SSIS. Je trouve son accessibilité et la clarté de son interface incomparables.
C’est à ce moment là en général qu’on a la fierté d’annoncer qu’on est développeur, mais qu’on écrit pas une ligne de code de la journée (vive le drag and drop et les interfaces graphiques).
En sortant de la présentation des nouveautés SQL Server 2012 pour SSIS, on constate l’effort particulier fait par Microsoft pour le développeur. N’est-ce pas le meilleur moyen d’attirer de nouveaux utilisateurs dans leur communauté ?

En lisant l’article de Florian Eiden sur les clés étrangères (où il me cite, il préfère que ce soit moi plutôt que lui qui sois fâché avec les DBA), je me disais également que je retrouvais ce souci d’ergonomie dans ma manière de modéliser et de développer.
Ne pas mettre de clés étrangères, c’est aussi un moyen de garder un modèle accessible et simple en ne le surchargeant pas de contraintes multiples.

Ma manière de construire des packages SSIS est aussi empreinte d’ergonomie et essayant de garder des packages le plus unitaire possible (chargement d’une table par package, un fichier de configuration commun à tous les packages, …)

Même ma façon de construire des cubes n’échappe pas à cette problématique : je suis partisan de l’affichage exclusif des hiérarchies et du masquage de tous les attributs. Toujours vers un objectif de lisibilité accrue pour les utilisateurs.
La communication de Microsoft sur le modèle tabular d’Analysis Services 2012 est axée sur la simplicité de mise en oeuvre.

Finalement ma manière de travailler et mon choix de carrière ont été guidés par l’ergonomie de manière implicite. Il m’aura fallu 6 ans après ce cours pour m’en rendre compte.

Publié dans Non classé

Journées SQL Server à Paris 2011 : Compte-Rendu

Un petit retour rapide sur les journées SQL Server organisées par le GUSS qui se déroulaient les 12 & 13 Décembre à Paris : j’ai pu suivre 5 sections couvrant un spectre assez large des nouveautés SQL Server 2012.
Je vous livre un premier ressenti à chaud de ces nouveautés avant de tester tout ça plus en détail (et de commencer à les implémenter l’année prochaine chez nos clients)

Avant de commencer, je voulais féliciter le GUSS et l’ensemble des organisateurs de l’événement pour la qualité de la prestation (accueil, organisation, session, …)

Analysis Services :

La session était présentée conjointement par Aurélien Koppel et François Jehl, et je ne peux que vous conseiller d’aller assister à leur session qui est déjà programmée aux TechDays à Paris en Février 2012.
Elle mettait en avant les différences entre mode multidimensionnel et mode tabular sous Analysis Services.
Pas de surprise sur le contenu, Microsoft met en avant la BI personnelle avec son mode tabular (et tout ce qui l’accompagne comme le DAX), sans toutefois délaisser le mode multidimensionnel pour la BI d’entreprise.
En outre le mode tabular semble bien marcher dès lors que les données sont « propres ». Cela laisse à penser que le mode multidimensionnel tirera son épingle du jeu dès qu’on aura du spécifique.

La réserve qu’on pourrait poser finalement est la suivante :
La BI personnelle ne remettrait-elle pas au goût du jour les bases Access (remplacées par des classeurs PowerPivot aujourd’hui et demain) qu’on a cherché à intégrer dans un datawarehouse d’entreprise ces dernières années ?

PowerView (Ex-Crescent) :

Il s’agit d’un outil pour utilisateurs finaux (j’insiste bien dessus) qui sert à créer des rendus de données graphiques. Ça a un rendu sexy, ça semble plutôt intuitif, par contre ne serait-ce pas le remplaçant de Performance Point malgré la communication opposée de Microsoft ? (Surtout quand on sait que PPS ne profite d’aucune évolution dans cette nouvelle évolution de SQL Server)

Index ColumnStore :

On reste sur un avis mitigé : la fonctionnalité est-elle réellement finie ? Les performances de ces nouveaux index semblent intéressantes mais leur flexibilité laisse à désirer (on pense tout de suite à l’impossibilité de mettre à jour des données avec un tel index).
Fonctionnalité gadget ou véritable évolution, l’avenir nous le dira.

Integration Services :

Les nouveautés en terme de développement sont surtout d’ordre graphique et ergonomique, mais il s’agit là d’un vrai pas en avant dans ces domaines. Quand on connait les interfaces des outils concurrents, on voit que Microsoft cherche à satisfaire sa communauté de développeurs et à attirer de nouveaux utilisateurs.

La grosse avancée qui méritera d’être testée plus en profondeur est la toute nouvelle gestion au niveau déploiement et administration de l’outil (Integration Services est enfin un vrai service, gestion des packages au niveau projet, gestion des configurations au niveau projet également, disparition des fichiers dtsconfig, …). Il est clair qu’elle nécessitera d’adopter une nouvelle méthode de travail.
Car même si l’ancienne méthode est toujours disponible (mode Legacy), il est à parier qu’elle ne le sera pas indéfiniment.

Un dernier mot pour parler de la session « Modélisation dimensionnelle » présentée par Jean-Pierre Riehl et Florian Eiden : elle ne concernait pas les outils ou les nouveautés SQL Server 2012, mais elle avait le mérite d’être à destination des consultants et des décideurs en leur rappelant les bases et les concepts de la modélisation d’un datawarehouse, sujet trop souvent sacrifié sur l’autel de la technique.

Publié dans SQL Server

Journées SQL Server à Paris les 12 & 13 Décembre 2011

La communauté SQL francophone organise à Paris dans les locaux Microsoft les journées SQL Server qui se tiendront les 12 & 13 Décembre 2011.

Les sessions promettent d’être intéressantes avec la distinction de deux types de parcours* (un parcours moteur SQL et un parcours Business Intelligence).

* Un parcours appliance a été ajouté.

Je suivrai en particulier le parcours BI avec notamment la présence de deux collègues en tant que speaker, messieurs Sébastien Madar et Florian Eiden.

Inscription via le lien suivant :
Journées SQL Server

Je suivrai précisemment ce parcours :

lundi 12 décembre 2011 :

10:00 S121 – La Business Intelligence avec SQL Server 2012

Tour d’horizon de toutes les nouveautés BI de SQL Server 2012, de BISM à Power View (projet Crescent) en passant par SSIS et le nouveau moteur de qualité de données DQS. Cette session introduit l’ensemble des choses que vous verrez pendant l’événeme … More

Tour d’horizon de toutes les nouveautés BI de SQL Server 2012, de BISM à Power View (projet Crescent) en passant par SSIS et le nouveau moteur de qualité de données DQS. Cette session introduit l’ensemble des choses que vous verrez pendant l’événement.

11:45 S122 – Décider entre Tabular ou Multidimensional pour un projet Analysis Services

Cette session se focalise sur les différences entre le nouveau modèle BISM et le modèle UDM classique. Qu’est ce qui change ? Dois-je refaire mes projets décisionnels ? Dois-je apprendre un nouvel outil ? Découvrez tout ce qu’il faut savoir sur la n … More

Cette session se focalise sur les différences entre le nouveau modèle BISM et le modèle UDM classique. Qu’est ce qui change ? Dois-je refaire mes projets décisionnels ? Dois-je apprendre un nouvel outil ? Découvrez tout ce qu’il faut savoir sur la nouvelle version d’Analysis Services dans SQL Server 2012 au travers de cette session.

14:00 S123 – Power View, Powerpivot : voir ses données autrement

Power View (projet Crescent) est la nouvelle évolution dans la famille des outils de restitution de données Microsoft. Découvrez ce nouvel outil qui permet la création de tableaux de bord très riches et dynamiques. Dans cette session, découvrez égal … More

Power View (projet Crescent) est la nouvelle évolution dans la famille des outils de restitution de données Microsoft. Découvrez ce nouvel outil qui permet la création de tableaux de bord très riches et dynamiques. Dans cette session, découvrez également sa collaboration avec PowerPivot. Ensemble, ces 2 outils donnent du pouvoir aux utilisateurs afin de maitriser leurs besoins décisionnels.

15:45 S124- SQL Server & Sharepoint : le couple de l’année

Venez découvrir dans cette session les spécificités de l’architecture, de la gestion et du décisionnel dans un contexte SQL Server associé à SharePoint. Les produits suivants seront couverts : SQL Server 2008 R2, SQL Server 2012, Power View (projet … More

Venez découvrir dans cette session les spécificités de l’architecture, de la gestion et du décisionnel dans un contexte SQL Server associé à SharePoint. Les produits suivants seront couverts : SQL Server 2008 R2, SQL Server 2012, Power View (projet Crescent), SharePoint 2010, SQL Server Reporting Services, Excel Services, PowerPivot, Performance Point Services, etc.

17:15 ColumnStore Index : une nouvelle façon d’indexer vos Datawarehouse

Connu sous le nom de code Apollo, SQL Server 2012 apporte une grande nouveauté dans l’indexation des bases de données : les index de type colonne. Venez découvrir cette fonctionnalité et comment elle peut améliorer grandement vos performances avec l … More

Connu sous le nom de code Apollo, SQL Server 2012 apporte une grande nouveauté dans l’indexation des bases de données : les index de type colonne. Venez découvrir cette fonctionnalité et comment elle peut améliorer grandement vos performances avec le cas d’utilisation d’un DatawareHouse.

mardi 13 décembre 2011 :

10:00 S221 – Modélisation dimensionnelle : le fondement du datawarehouse

Etoiles, flocons, granularité, faits, dimensions, mesures… c’est le vocabulaire du décisionnel, ce sont les éléments de base du datawarehouse. Kimball & Inmon, ce sont les précurseurs qui ont définit comment penser ses dimensions, comment modéliser … More

Etoiles, flocons, granularité, faits, dimensions, mesures… c’est le vocabulaire du décisionnel, ce sont les éléments de base du datawarehouse. Kimball & Inmon, ce sont les précurseurs qui ont définit comment penser ses dimensions, comment modéliser ses tables et ses colonnes pour bien répondre au besoin d’analyse. Avec SQL Server 2012 et son modèle tabulaire, ce modèle de conception est-il remis en cause ? Et que dire des autres courants comme Data Vault, Hadoop et consorts ? Cette session fait le tour de ces notions et des modélisations existantes. Elle présente les concepts essentiels à prendre en compte pour bien construire sa solution décisionnelle, que ce soit en termes de justesse de l’analyse, d’efficacité pour le stockage ou de temps de réponse. Cette session s’adresse aux nouveaux venus du décisionnel, aux autodidactes n’ayant jamais pu acquérir la théorie ou encore aux consultants confirmés qui souhaitent se mettre à jour sur les bonnes pratiques de la modélisation dimensionnelle.

11:45 S222 – Les nouveautés SSIS dans SQL Server 2012

SSIS bénéficie de nombreuses améliorations dans la prochaine version de SQL Server (nouveaux designers, mode projet, etc.). Venez découvrir toutes ces nouveautés qui enrichissent cet outil de manipulation de données, indispensable dans les projets … More

SSIS bénéficie de nombreuses améliorations dans la prochaine version de SQL Server (nouveaux designers, mode projet, etc.). Venez découvrir toutes ces nouveautés qui enrichissent cet outil de manipulation de données, indispensable dans les projets décisionnels mais aussi très pratique dans de nombreuses tâches de développement.

14:00 S213 – Contraintes et performances

Une idée solidement ancrée dans l’esprit des informaticiens est que la vérification des contraintes « gâche du temps » d’exécution, tant est si bien que certains évite de les poser. Nous verrons quel est le coût exact d’une contrainte, quel perte de t … More

Une idée solidement ancrée dans l’esprit des informaticiens est que la vérification des contraintes « gâche du temps » d’exécution, tant est si bien que certains évite de les poser. Nous verrons quel est le coût exact d’une contrainte, quel perte de temps elle entraîne, comment minimiser leur temps d’exécution et comment la plupart des contraintes SQL permettent de vous faire gagner un temps considérable… Après cet exposé, vous n’aurez plus qu’une seule envie : poser le maximum de contraintes dans votre base de données !

15:45 S224- MDS et DQS : données d’entreprise

Tour d’horizon de SQL Server 2012 Master Data Services et Data Quality Services, où nous verrons comment mettre en place un référentiel de données d’entreprise et d’un système de qualité de données tout cela dans une démarche de Master Data Manageme … More

Tour d’horizon de SQL Server 2012 Master Data Services et Data Quality Services, où nous verrons comment mettre en place un référentiel de données d’entreprise et d’un système de qualité de données tout cela dans une démarche de Master Data Management.

Publié dans SQL Server

La marche de Jarvis

Comment en arrive-t-on en business Intelligence à parler de la marche de Jarvis (aussi appelée algorithme d’emballage ou encore algorithme du papier cadeau) ?

C’est très simple : Je suis parti d’une table contenant les coordonnées géographiques des villes françaises, et je me suis interrogé sur la possibilité à partir de ces villes de construire les polygones représentant les départements (voire les régions, puis la France)

J’ai donc cherché à construire le plus grand polygone contenant un nuage de points, autrement dit, le polygone convexe circonscrit. Je me suis donc rendu sur une page dédiée à l’algorithmique géométrique d’un cours de l’école polytechnique de Montreal.

J’ai repris l’algorithme et corrigé une erreur sur :
– calculer l’angle entre l’horizontale et la droite reliant ce point à chaque autre.
Il faut remplacer l’horizontale par le vecteur défini par le point précédent trouvé et le point en cours de calcul.

J’ai dû également supprimé les cas limites induits par l’utilisation des types Float, la fonction Arccosinus étant peu décidée à me renvoyer des valeurs pour des données entrantes supérieures à 1 ou inférieures à -1

C’est à ce moment-là que je me suis rendu compte que de toute façon l’algorithme ne me donnerait pas le résultat voulu. Mais j’ai quand même souhaité aller au bout de la démarche.

Procédure Stockée :

.SQLCode { font-size: 13px; font-weight: bold; font-family: monospace;; white-space: pre; -o-tab-size: 4; -moz-tab-size: 4; -webkit-tab-size: 4; } .SQLComment { color: #00AA00; } .SQLString { color: #AA0000; } .SQLFunction { color: #AA00AA; } .SQLKeyword { color: #0000AA; } .SQLOperator { color: #777777; }

CREATE PROCEDURE [dbo].[DisplayPolygone] @SqlEntrant AS VARCHAR(max)
AS
DECLARE @xmin AS FLOAT
DECLARE @xminsuiv AS FLOAT
DECLARE @xsuiv AS FLOAT
DECLARE @xsuiv1 AS FLOAT
DECLARE @ymin AS FLOAT
DECLARE @yminsuiv AS FLOAT
DECLARE @ysuiv AS FLOAT
DECLARE @ysuiv1 AS FLOAT
DECLARE @str AS NVARCHAR(max)
DECLARE @stralim AS NVARCHAR(max)
DECLARE @angle AS FLOAT
DECLARE @angle1 AS FLOAT
DECLARE @xprec AS FLOAT
DECLARE @yprec AS FLOAT

CREATE TABLE #Geogr (Coordonnées GEOGRAPHY)

SET @stralim = 'Insert into #Geogr ' + @SqlEntrant

EXEC sp_executesql @stralim

SET @str = ''
SET @angle = 5000

SELECT @ymin = min([Coordonnées].Lat)
FROM #Geogr

SELECT TOP 1 @xmin = [Coordonnées].Long
FROM #Geogr
WHERE [Coordonnées].Lat = @ymin

SET @str = 'Select geometry::STGeomFromText(''POLYGON((' + cast(@xmin AS VARCHAR(50)) + ' ' + cast(@ymin AS VARCHAR(50))

DECLARE ParcoursPoint CURSOR
FOR
SELECT [Coordonnées].Long
,[Coordonnées].Lat
FROM #Geogr
WHERE [Coordonnées].Lat @ymin
OR [Coordonnées].Long @xmin;

OPEN ParcoursPoint

FETCH NEXT
FROM ParcoursPoint
INTO @xsuiv1
,@ysuiv1

WHILE @@FETCH_STATUS = 0
BEGIN
IF @angle > acos((@xsuiv1 - @xmin) / sqrt((@xsuiv1 - @xmin) * (@xsuiv1 - @xmin) + (@ysuiv1 - @ymin) * (@ysuiv1 - @ymin)))
BEGIN
SET @angle = acos((@xsuiv1 - @xmin) / sqrt((@xsuiv1 - @xmin) * (@xsuiv1 - @xmin) + (@ysuiv1 - @ymin) * (@ysuiv1 - @ymin)))
SET @xminsuiv = @xsuiv1
SET @yminsuiv = @ysuiv1
END

FETCH NEXT
FROM ParcoursPoint
INTO @xsuiv1
,@ysuiv1
END

CLOSE ParcoursPoint

DEALLOCATE ParcoursPoint

SET @xsuiv = @xminsuiv
SET @ysuiv = @yminsuiv
SET @str = @str + ',' + cast(@xsuiv AS VARCHAR(50)) + ' ' + cast(@ysuiv AS VARCHAR(50))
SET @xprec = @xmin
SET @yprec = @ymin

WHILE (
@xmin @xsuiv
OR @ymin @ysuiv
)
BEGIN
SET @angle = 500

DECLARE ParcoursPoint CURSOR
FOR
SELECT [Coordonnées].Long
,[Coordonnées].Lat
FROM #Geogr
WHERE [Coordonnées].Lat @ysuiv
OR [Coordonnées].Long @xsuiv;

OPEN ParcoursPoint

FETCH NEXT
FROM ParcoursPoint
INTO @xsuiv1
,@ysuiv1

WHILE @@FETCH_STATUS = 0
BEGIN
IF (((@xsuiv1 - @xsuiv) * (@xsuiv - @xprec) + (@ysuiv1 - @ysuiv) * (@ysuiv - @yprec)) / (sqrt((@xsuiv1 - @xsuiv) * (@xsuiv1 - @xsuiv) + (@ysuiv1 - @ysuiv) * (@ysuiv1 - @ysuiv)) * sqrt((@xsuiv - @xprec) * (@xsuiv - @xprec) + (@ysuiv - @yprec) * (@ysuiv - @yprec)))) <= 1
AND (((@xsuiv1 - @xsuiv) * (@xsuiv - @xprec) + (@ysuiv1 - @ysuiv) * (@ysuiv - @yprec)) / (sqrt((@xsuiv1 - @xsuiv) * (@xsuiv1 - @xsuiv) + (@ysuiv1 - @ysuiv) * (@ysuiv1 - @ysuiv)) * sqrt((@xsuiv - @xprec) * (@xsuiv - @xprec) + (@ysuiv - @yprec) * (@ysuiv - @yprec)))) >= - 1
BEGIN
SET @angle1 = ACOS(((@xsuiv1 - @xsuiv) * (@xsuiv - @xprec) + (@ysuiv1 - @ysuiv) * (@ysuiv - @yprec)) / (sqrt((@xsuiv1 - @xsuiv) * (@xsuiv1 - @xsuiv) + (@ysuiv1 - @ysuiv) * (@ysuiv1 - @ysuiv)) * sqrt((@xsuiv - @xprec) * (@xsuiv - @xprec) + (@ysuiv - @yprec) * (@ysuiv - @yprec))))

IF @angle > @angle1
BEGIN
SET @angle = @angle1
SET @xminsuiv = @xsuiv1
SET @yminsuiv = @ysuiv1
END
END

FETCH NEXT
FROM ParcoursPoint
INTO @xsuiv1
,@ysuiv1
END

CLOSE ParcoursPoint

DEALLOCATE ParcoursPoint

SET @xprec = @xsuiv
SET @yprec = @ysuiv
SET @xsuiv = @xminsuiv
SET @ysuiv = @yminsuiv
SET @str = @str + ',' + cast(@xsuiv AS VARCHAR(50)) + ' ' + cast(@ysuiv AS VARCHAR(50))
END

SET @str = @str + ',' + cast(@xmin AS VARCHAR(50)) + ' ' + cast(@ymin AS VARCHAR(50)) + '))'',4326)'

EXEC sp_executesql @str
GO

Quelques exemples :

La france sans la Corse :

Le Nord :

Conclusion :

Cet algorithme ne sert à rien dans notre cas. Il faudrait représenter les villes comme elles-mêmes étant des polygones et faire un union.

Publié dans SQL Server

Exporter les packages SSIS stockés sur MSDB vers un répertoire physique

Le fameux coup du serveur de production complètement désynchronisé avec votre serveur de développement.

Et vous voulez redescendre tous les packages SSIS sur votre environnement de développement.

Voilà donc une petite procédure toute simple, basée sur DTUTIL et qui fait appel à la récursivité pour construire l’arborescence des répertoires de la base MSDB vers notre répertoire de destination et des curseurs (Il est sûrement possible de s’en sortir avec du « Select @strsql =  @strsql+…)

On pourra également définir le dossier de destination de l’export comme paramètre d’entrée de la procédure stockée.

A noter que les packages en niveau de protection « Server Storage » ne peuvent pas être copiés (Il est sûrement possible de changer le niveau de protection avec la commande ENCRYPT de DTUTIL avant l’export, à vous de jouer…)

La commande xp_cmdshell doit être active au niveau du serveur (Un petit coup de sp_configure xp_cmdshell, 1 GO RECONFIGURE si besoin en ayant préalablement activer les propriétés avancées)


Create proc [dbo].[PS_DEPLOY_ALL_PACKAGES_FROM_DTS_TO_FILE]
as
Declare @srcpackagename as varchar(max)
Declare @foldertocreate as varchar(max)
Declare @strsql as nvarchar(max)
Declare @folderdest as varchar(max)
set @strsql= »
set @folderdest=‘f:\’
EXEC [master].[sys].[xp_cmdshell] ‘rmdir f:\msdb /s /q’
;WITH foldertable
(folder,folderid, nblevel)
as
(select cast(foldername as varchar(max)) as folder,folderid,as nblevel
From [msdb].[dbo].[sysssispackagefolders]
Where parentfolderid=‘00000000-0000-0000-0000-000000000000’
union all
Select cast(b.folder+‘\’+a.foldername as varchar(max)) as folder,a.folderid as folderid,nblevel+1
From [msdb].[dbo].[sysssispackagefolders] a
inner join foldertable b
on a.parentfolderid=b.folderid)
select * into #TMP_PACKAGE from foldertable;
DECLARE srcpackage Cursor
FOR
SELECT Distinct ‘MSDB’+isnull(‘\’+F.folder+‘\’,‘\’)+L.[name],‘MSDB’+isnull(‘\’+F.folder+‘\’,‘\’)
FROM [msdb].[dbo].[sysssispackages] L
left join #TMP_PACKAGE F
ON L.[folderid]=F.[folderid]
WHERE L.[packageformat]=0;
OPEN srcpackage
FETCH NEXT FROM srcpackage INTO @srcpackagename,@foldertocreate
WHILE @@FETCH_STATUS = 0
BEGIN
set @strsql=@strsql+‘;EXEC [master].[sys].[xp_cmdshell]  »md « ‘+@folderdest+@foldertocreate+‘ » »,NO_OUTPUT;EXEC [master].[sys].[xp_cmdshell]  »dtutil /DTS « ‘+@srcpackagename +‘ » /COPY FILE; »‘+@folderdest+@srcpackagename+‘.dtsx » /Q >>’+@folderdest+‘MSDB\log.txt »,NO_OUTPUT’
–exec sp_executesql @strsql
FETCH NEXT FROM srcpackage INTO @srcpackagename,@foldertocreate
END
exec sp_executesql @strsql
CLOSE srcpackage
DEALLOCATE srcpackage
Drop table #TMP_PACKAGE


Publié dans Integration Services
Microsoft
Communauté
PASS
Follow La BI et les outils Microsoft on WordPress.com