Archive

Articles taggués ‘SSIS’

Réaliser un système décisionnel avec SQL Server 2008 R2

Sébastien Fantini, expert Microsoft au sein d’Homsys, publie un des premiers ouvrages en français sur la nouvelle suite BI de Microsoft : « Business Intelligence avec SQL Server 2008 R2 – Maîtrisez les concepts et réalisez un système décisionnel ».

Il s’adresse à tous les membres d’une équipe décisionnelle : chef de projet, architecte, développeur ETL, développeur de rapports, assistance à la maîtrise d’ouvrage (AMOA). Les concepts clés du décisionnel sont détaillés tout au long du livre et mis en application concrètement au travers d’un cas. Ainsi, au cours des différents chapitres, le lecteur va utiliser les différents outils de la suite SQL Server pour bâtir progressivement le système décisionnel d’une société virtuelle, Distrisys. L’ouvrage regorge de solutions concrètes et professionnelles et de bonnes pratiques issues des retours d’expérience de l’auteur. Sont abordés les sujets suivants : – L’architecture des serveurs et le choix des licences – La modélisation de l’entrepôt de données – La conception du cube Analysis Services – La réalisation des différents types de flux d’alimentation ETL avec Integration Services – L’utilisation d’Excel et de PowerPivot pour exploiter les données décisionnelles – La réalisation de rapports opérationnels et décisionnels avec Reporting Services.

Nouveauté juillet 2010 aux Editions ENI – Lien Amazon

La gestion des logs avec SSIS

Pouvoir être en mesure de suivre la bonne exécution des traitements batch SSIS est primordiale.

Plusieurs solutions permettent de répondre à ce besoin de suivi :

  1. La méthode manuelle : Management Studio propose un historique d’exécution des jobs
  2. L’utilisation de tâches SQL permettant de renseigner une table de log
  3. L’utilisation des logs standards SSIS

La solution 2. est très souvent rencontrée sur les projets par simple méconnaissance de la 3.

Cet article décrit donc comment mettre en place en quelques minutes un suivi des traitements SSIS performant.

L’activation des logs s’effectue pour chaque package dans le menu SSIS\Enregistrement (Logging en version anglaise)

Les étapes à réaliser sont les suivantes :

  1. Choisir dans la liste déroulante type de fournisseur, où seront stockés les logs (base de données, fichier XML,…) puis cliquer sur le bouton Ajouter. Personnellement, je préconise le stockage SQL Server qui permet une exploitation aisée de ces données
  2. Cocher la case à cocher devant le nom du package
  3. Activer la case à cocher devant le fournisseur SQL Server
  4. Sélectionner la base de données hébergeant la table de log

clip_image002

Remarque : Il n’est pas possible de choisir le nom de la table dans laquelle les logs seront stockés. SSIS 2005 les stocke dans la table sysdtslog90, SSIS 2008 dans sysssislog.

L’onglet Détails permet ensuite de spécifier le niveau de finesse dans le suivi des traitements :

Afin d’éviter des logs trop volumineux, je recommande de tracer uniquement les événements suivants :

  • OnPreExecute : Trace le début d’exécution des différentes tâches présentes dans le niveau Flux de Contrôle
  • OnPostExecute : Trace la fin d’exécution des différentes tâches présentes dans le niveau Flux de Contrôle
  • OnError : Trace toutes les erreurs survenues aux niveaux Flux de contrôle et Flux de données

clip_image002[5]

Les principaux champs de la table de logs sont les suivants :

  • Event : événement qui a généré le log (OnPreExecute, OnPostExecute ou OnError)
  • Computer : ordinateur qui l’a exécuté
  • Operator : utilisateur qui l’a exécuté (permet par exemple de différencier une exécution automatique effectuée par l’agent SQL Server d’une exécution manuelle de rattrapage)
  • Source : étape du flux qui a généré le log
  • SourceId : Identifiant de l’élément (package, tâche de contrôle…) ayant généré le log
  • executionId : identifiant unique de l’exécution
  • Starttime : début de l’événement qui a généré le log
  • Endtime : fin de l’événement qui a généré le log
  • Message : détails de l’événement (notamment les messages d’erreurs sur l’événement OnError)
    En quelques clics nous avons ainsi paramétré le stockage de l’information relative à l’exécution des flux SSIS. Ces données peuvent maintenant être requêtées en SQL ou utilisées via du reporting.

    A noter qu’une ligne est écrite dans la table de log pour chaque événement: début d’une tâche, fin d’une tâche ou erreur. Les données doivent donc être manipulées pour obtenir une ligne du type: nom de la tâche, date de début, date de fin et statut d’exécution.

    Homsys propose ainsi un ensemble de tableaux de suivi développés sous Reporting Services. Cet aspect sera présenté dans un prochain article…

Les modèles de package SSIS

Fonctionnalité souvent méconnue et sous utilisée : SSIS (SQL Server Integration Services) permet de créer des modèles de package qui intègrent les éléments récurrents d’un projet.

Pourquoi utiliser des modèles de package :

Un modèle de package pourra par exemple contenir les éléments suivants :

  • Cartouche d’en tête documentant le flux (description du flux, date de création, auteur…)
  • Activation des logs d’audit des traitements
  • Connexion vers les bases de données du projet
  • Variables communes (nom du serveur DWH, chemin de stockage des fichiers sources, chemin de l’archivage…)
  • Utilisation du fichier de configuration qui permet l’alimentation dynamique des variables communes
  • Propriété delayValidation valant True afin d’éviter les ralentissements à l’ouverture des packages

La mise en place de ces éléments permet ainsi un gain de temps intéressant, une homogénéisation des différents développements (les variables communes auront le même nom dans l’ensemble des packages) ainsi qu’un risque d’anomalie réduit (erreur de paramétrage des connexions, du fichier de configuration…).

Comment développer un package modèle ?

Un package modèle est un package SSIS standard dans lequel les éléments communs auront été implémentés. Ce package doit ensuite être copié dans le répertoire :

C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\ProjectItems\DataTransformationProject\DataTransformationItems

Comment utiliser un package modèle :

L’utilisation du modèle de package s’effectue via les étapes suivantes :

Cliquer droit sur le projet puis Ajouter\Nouvel Element :

clip_image002

Utiliser un modèle de package Etape 1

Ajouter l’élément Package_model_SSIS :

clip_image004

Utiliser un modèle de package Etape 2

Categories: Trucs & astuces Tags: , , ,

La gestion des doublons avec SSIS

Plusieurs techniques existent permettant de détecter et traiter des lignes en doublon avec Microsoft SQL Server Integration Services (SSIS).

La plupart des ressources sur le web proposent de gérer ce point uniquement avec du SQL dans la source de données, certaines proposent même de passer par des tables temporaires.

Je vous propose ici une solution rapide à mettre en œuvre tout en bénéficiant des avantages de SSIS en termes de maintenance, de performance et de lisibilité en phase de développement.

Cette solution répond au besoin suivant :

  • Ma table cible doit être alimentée avec des lignes uniques par rapport à une clé,
  • Dans le cas où des doublons sont rencontrés, l’une des lignes doit être conservée,
  • Les doublons peuvent être identifiés et éventuellement stockés dans une table de rejet.

Ce cas est notamment rencontré lorsque l’on charge un référentiel client. Souvent, la base client doit être la plus complète possible mais dans le cas où la donnée serait dupliquée, on ne souhaite ni dupliquer le client ni perdre la trace de son existence. On appliquera alors une règle fonctionnelle permettant de déterminer la version du client à conserver en cas de doublon (le numéro de création le plus élevé ou la date de mise à jour la plus récente par exemple).

clip_image002

1 : Contrôle de doublon avec conservation de l’une des lignes du doublon

1) DOUBLON : Source contenant potentiellement des doublons

2) Contrôle doublon : Recherche effectuée avec les paramétrages spécifiques suivants :

a. Onglet Général : « Rediriger les lignes en erreur vers la sortie sans correspondance »

b. Onglet Connexion : requête sur la même table que la source DOUBLON permettant de renvoyer l’ensemble des lignes qui ne sont pas en doublon et, pour les lignes en doublon, la ligne qui devra être conservée. La requête est construite comme suit :

select CLE, max(COND) COND from doublon group by CLE

Où CLE correspond à la ou les colonnes constituant la clé sur laquelle le test d’unicité est effectué, COND correspond au critère permettant de choisir la ligne à conserver en cas de doublon (numéro de création, date de mise à jour…). Selon les cas, le Max peut être remplacé par un Min.

c. Onglet Colonne : Faire la jointure sur la ou les colonnes CLE et COND

3) Le flux de sortie « Sortie de recherche avec correspondance » fournit les lignes non doublonnées ainsi que la ligne devant être conservée en cas de doublon.

4) Le flux de sortie « Sortie de recherche sans correspondance » fournit les lignes qui sont doublonnées, qui pourront ensuite être insérées dans une table de rejet.

Remarque : Dans le cas où la présence de doublons doit interrompre le chargement, on pourra implémenter un compteur de nombre de lignes sur la branche « sortie sans correspondance » qui, s’il est différent de 0 bloquera la suite de l’exécution.

Autres solutions permettant de traiter des doublons :

  • Utilisation du composant MSDN : http://msdn.microsoft.com/fr-fr/library/ms160916%28SQL.90%29.aspx (je ne l’ai personnellement pas testé).
  • Utilisation de la tâche de Tri et de l’option « Supprimer les lignes avec valeurs de tri en double » : L’avantage de cette solution est sa simplicité de mise en œuvre, son inconvénient est qu’elle ne permet pas de récupérer les lignes en doublon.
  • Utilisation des composants multidiffusion, agrégation, jointure pour reproduire un fonctionnement identique à la requête SQL présente dans le lookup de la solution présentée ci-dessus. L’avantage de cette solution est qu’elle est uniquement basée sur l’utilisation de composants SSIS, son inconvénient est qu’elle est un peu plus longue à développer et ses performances sont un peu moins bonnes.
Categories: Trucs & astuces Tags: ,

SSIS : Lenteurs extrêmes à l’ouverture/exécution de BIDS

Vous avez peut-être déjà rencontré un problème d’extrème lenteur à l’ouverture de BI Developement Studio (BIDS), lors de développement de flux SSIS.

Symptômes :

Le problème se manifeste par un « blocage technique » de Visual Studio (avec perte de la main) d’une durée de 8 à 15 minutes lorsque :

  • l’on ouvre un fichier de flux SSIS (*.dtsx)
  • l’on lance une exécution de flux SSIS (*.dtsx) en mode debug, (l’attente déclenchant généralement un timeout sur le « fork » du processus de debug de Visual Studio cf. ci-après)

Ce blocage est indépendant du processus (normal) de vérification des lots du package, qui intervient une fois les 8/15 minutes de blocage technique passées.

Ce problème persiste :

  • au changement de user
  • au changement de machines
  • à la bascule des fichiers et/ou bases de données en local

Le retard à l’exécution est parfois tellement important que le « fork » du thread de debug par rapport au thread de Visual Studio, passe en « time out », provoquant le message d’erreur suivant :

071708_1347_SSISLenteur1

Une fois que le « fork » a échoué une fois, toute les autres tentatives échoueront venant s’ « empiler » par process ID :

071708_1347_SSISLenteur2

Pour qu’un nouveau test d’exécution de flux en mode debug soit de nouveau effectif, il faut réinitialiser les paramètres utilisateur de Visual Studio :

  • Menu Démarrer -> Exécuter -> ‘devenv /resetsettings

Analyse :

Une analyse poussée du problème a permis de se rendre compte :

  • lorsque le problème se manifeste, une connexion HTTP est effectuée vers un serveur distant de Microsoft (crl.microsoft.com) visible avec la commande MS-DOS NETSTAT
  • cette connexion est bloquée en attente de réponse (statut SYN_SENT) (voir la copie d’écran ci-jointe)
  • au bout des 10 à 15 minutes d’attente cette connexion se ferme et le fichier s’ouvre/s’exécute -> cette connexion en attente est à l’origine du problème
  • CRL veut dire « Certificate Revocation List« , et cette connexion automatique est une vérification de licence/certificat
  • une ouverture/exécution de flux à partir d’une connexion avec un compte local (hors domaine) sur les machines concernées par le problème, ne pose pas de souci -> avec un compte local la vérification de licence n’est pas effectuée

pic1

Il semble donc qu’il s’agisse soit d’un problème de domaine utilisateur, soit de proxy/firewall qui refuse la connexion HTTP vers le site de vérification de licence.
Le compte local doit être considéré comme « suffisamment sûr » par Microsoft pour ne pas effectuer de vérification de certificat.

En attendant, l’installation du SP2 de SQL-Server 2005 sur le poste ne change rien au problème ci-dessus.

Solution/Palliatif :

Au final on peut désactiver cette vérification de certificat en effectuant les opérations suivantes :

  1. Dans les options avancées d’Internet Explorer décocher les cases « Vérification de révocations des certificats »
  2. Changer la valeur de la base de registre [HKEY_USERS\S-1-5-20\Software\Microsoft\Windows\CurrentVersion\WinTrust\Trust Providers\Software Publishing]< de ‘23c00‘ à ‘23e00

(source : http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=125768 )

Ces manipulations, semblent corriger définitivement le problème (par contre la première est à effectuer pour chaque utilisateur utilisant le poste). En attente d’une plus ample utilisation pour confirmation.
Les utilisateurs appartenant à des domaines sont probablement configurés pour faire ces vérifications de certificats par défaut, tandis que les utilisateurs locaux ne les font pas, ce qui peut expliquer les différences que nous constations.

Sources :

Categories: Trucs & astuces Tags: , , , ,

Utilisation de la tâche de chargement en bloc sous SSIS

La tâche SSIS (Microsoft SQL Server Integration Services) de chargement en bloc est utile pour charger un fichier plat dans une table d’une base de données dans les 2 cas suivants:

  • Le chargement d’un fichier volumineux
  • Le chargement d’un fichier à champs fixes contenant un nombre de colonnes important (ce qui permet un gain de temps non négligeable en phase de développement)

clip_image002

Tâche d’insertion en bloc

    Son utilisation n’étant pas toujours triviale, voici une description des différentes étapes à suivre :

  • 1) Création d’une connexion vers le fichier texte à charger
  • 2) Utilisation de la tâche d’insertion en bloc (présente dans le flux de contrôle)
  • 3) Paramétrage de l’onglet Connexion de la tâche d’insertion en bloc
  • 4) Paramétrage de l’onglet Options de la tâche d’insertion en bloc
Etape 3) Paramétrage de l’onglet Connexion de la tâche d’insertion en bloc:

image Tâche d’insertion en bloc – Onglet Connexion

  • Connexion : Choisir la connexion vers la base de données dans laquelle les données seront chargées.
  • DestinationTable : Choisir le nom de la table dans laquelle les données seront insérées. La table devra contenir l’ensemble des colonnes présentes dans le fichier.
  • File : Connexion vers le fichier plat source.
  • Format : Spécifier la valeur Utiliser un fichier pour charger un fichier dont le format est décrit dans un fichier de format .fmt. Pour les fichiers au format délimité sélectionner le format Spécifier.

Options pour les fichiers au format champs fixes :

  • FormatFile : Définir le chemin d’accès vers le fichier .fmt décrivant le format du fichier.

Options pour les fichiers au format délimité :

  • RowDelimiter : Définir les caractères séparateurs de lignes (en général {CR}{LF} en environnement windows).
  • ColumnDelimiter  : Définir les caractères séparateurs de colonnes

clip_image002[5]Le chemin utilisé vers le fichier de format dans la propriété FormatFile doit être au format UNC (Universal Naming Convention): \\NomServeur\Partage.

Etape 4) Paramétrage de l’onglet Option de la tâche d’insertion en bloc

clip_image006

Tâche d’insertion en bloc – Onglet Options

  • Options : Décocher les différents contrôles.
  • SortedDate : Laisser la valeur non renseignée par défaut.
  • MaxErrors : Laisser la valeur 0
  • CadePage : Spécifier la valeur RAW
  • DataFileType : Spécifier la valeur char
  • BatchSize : Laisser la valeur 0
  • LastRow : Laisser la valeur 0
  • FirstRow : Laisser la valeur 1 (sauf si le fichier contient un en-tête qui ne doit pas être chargé)

Exemple de fichier .fmt:

Le fichier .fmt permet de décrire le format du fichier à charger. Il liste les colonnes contenues dans le fichier ainsi que leurs caractéristiques. Sa construction est en général rapide à partir d’un document excel décrivant les colonnes du fichier (pour ceux qui le souhaitent, j’ai un exemple de fichier permettant la génération automatique de fichier fmt à partir de formules excel).

Voici un exemple de fichier .fmt  simple :

10.0

2

1 SQLCHAR 0 3 «  »       1 CH1 French_CI_AS

2 SQLCHAR 0 5 « \r\n » 2 CH2 French_CI_AS

  • La première ligne correspond à la version SQL Server utilisée (10.0 pour la version 2008, 9.0 pour la version 2005, 8.0 pour la version 2000 et 7.0 pour la version SQL 7…)
  • La deuxième ligne précise le nombre de colonnes présentes dans le fichier
  • Les lignes suivantes décrivent chaque colonne du fichier en précisant : la position de la colonne, SQLCHAR, 0, le nombre de caractères de la colonne, le numéro de la colonne, le nom de la colonne, la collation (FRENCH_CI_CI_AS).

clip_image002[6]La dernière ligne du fichier doit être un retour à la ligne.

Lclip_image001a génération du fichier fmt peut être également effectuée automatiquement à partir de la table cible en utilisant la commande bcp.

Générer un fichier .fmt à partir de la commande bcp:

Ouvrir une fenêtre d’Invite de commande et exécuter la commande suivante :

bcp NomBaseDeDonnées.Schéma.NomTable format nul -c -f

CHGT_BLOC.fmt -T -S NomServeur\NomInstance

image Exemple d’utilisation de la commande BCP

Conclusion:

Ce composant a l’avantage d’être performant. Il a par contre l’inconvénient d’être difficile à auditer en cas d’erreur. En effet, si le fichier source ne respecte pas strictement le format décrit, le fichier sera rejeté en bloc sans possibilité d’identifier la ligne ou la colonne ayant généré une erreur. Il n’est pas possible également de placer une visionneuse sur les données pour suivre le chargement.

Ce composant n’est donc à utiliser que sur des fichiers dont la structure est connue et bien maîtrisée. Pour des fichiers non volumineux et contenant un nombre de colonnes raisonnables, on préférera utiliser le chargement classique via des sources OLE DB.