Utilisation de HASHBYTES pour charger un Entrepôt de données


Une problématique récurrente lors du chargement d’un DWH consiste à savoir quelles lignes seront insérées, updatées ou ignorées.  Deux approches existent:

  • Full SSIS (Utilisation du LookUp et Conditonal Split)
  • Full SQL (Commande MERGE).

L’utilisation de la commande MERGE est pour quelques uns complexe à mettre en place, difficile à maintenir et lente au niveau des performances à cause de la comparaison des valeurs une par une des colonnes susceptibles d’être modifiées.

En effet, imaginons une table avec une dizaine de colonnes de type chaîne de caractères, cela reviens à avoir une clause WHEN dans la commande MERGE qui ressemble à:

On se retrouve avec un code illisible et difficile à maintenir.

Afin d’éviter cela, il existe une méthode pour suivre les modifications de données qui consiste à utiliser la fonction HASHBYTES.

Cette fonction retourne le hachage des données d’entrée dans SQL Server. Le hachage est une opération consistant à transformer une chaîne de taille variable en un code de taille fixe en appliquant un algorithme dans le but d’authentifier ou de stocker ce message.

La syntaxe est la suivante: HASHBYTES (Algorithme de hachage,  Colonnes d’entrée)

    • Algorithme : Identifie l’algorithme de hachage  MD2, MD4, MD5, SHA, SHA1, SHA2_256 ou SHA2_512 à utiliser pour les données d’entrée. Ces algorithmes sont utilisés dans le but de réduire la taille des données à traiter par la fonction de cryptage. Ce condensé est de taille fixe, dont la valeur diffère suivant la fonction utilisée :      
      • MD2 produit un résultat de 128 bits (16 octets)
      • MD4 produit un résultat de 128 bits (16 octets)
      • MD5 produit un résultat de 128 bits (16 octets)
      • SHA produit un résultat 160 bits (20 octets)
      • SHA1 produit un résultat de 160 bits (20 octets)

      SQL Server 2012 Introduit deux algorithmes additionels

      • SHA2_256 produit un résultat de 256 bits (32 octets)
      • SHA2_512 produit un résultat de 512 bits (64 octets)
    • Colonnes d’entrée: Spécifie une expression qui correspond à une chaîne de type caractère ou binaire à hacher. Les valeurs d’entrée autorisées sont limitées à 8 000 octets.

      La valeur de retour de la fonction HASHBYTES est un Varbinary.

      Nous allons maintenant nous pencher sur la façon d’utiliser cette fonction pour le chargement d’un entrepôt de données.

      Etape 1 : Création et chargement Table source  

      Etape 2 : Création de la Dimension 

      A noter: La colonne HashBytesPersonne permettra de stocker les valeurs de hachage des données.

      Etape 3 : Chargement de la Dimension à partir de la source 

      La fonction HASHBYTES(‘MD5’,CONCAT(prenom ,nom ,adresse ,zip_code ,ville ,tel ,email) renvoie le hachage de la concaténation des colonnes prenom, nom, adresse, zip_code, ville, tel, email suivant l’algorithme de hachage MD5.

      Le résultat retourné est unique et identique pour une même combinaison de valeurs. Ce qui permet d’effectuer une comparaison sur une seule colonne et non sur toutes les colonnes sources séparément.

Attention: La fonction HASHBYTES ne peut être utilisée que sur des données de type chaîne de type caractère ou binaire, d’où l’utilisation de la fonction CONCAT qui permet de concaténer toutes les colonnes, tout en transformant les données en type chaîne  permettant ainsi d’éviter le CAST  des données.

Afin de comprendre le gain réel que peut procurer l’utilisation de cette fonction, ci-dessous le résultat de SET STATISTICS IO ON (nombre de page lues) et le SET STATISTICS TIME ON (temps d’exécution) respectifs du MERGE sans et avec HASHBYTES pour un jeu de données de 8 millions de lignes:

 

Sans HASHBYTESTemps d’exécution: 177885 ms

Avec HASHBYTESTemps d’exécution: 104449 ms

Pour conclure, la fonction HASHBYTES est très intéressante à utiliser dans un MERGE de chargement d’une table et permet un gain de temps et de faciliter la maintenance, néanmoins la limitation de 8000 octets est contraignante. Bien que très rare, on peut se retrouver avec des collisions au niveau des données hachées.

Commentez cet article