L'utilitaire comm sous Unix. Intégration de données en delta dans une base de données


1- Introduction

Lors de l'intégration de données, comme les données de marché etc..., depuis des fichiers plats reçus à intervalles réguliers, les progiciels et les développements avec les outils ETL comme Informatica, Genio, DataStage... ont souvent tendance pour détecter les nouvelles données et les données modifiées entre le fichier N-1 et le fichier N à réaliser l'intégration selon deux méthodes :

integration de donnees en delta de fichiers

Grossièrement la cinématique de la comparaison est la suivante :

Ces traitements sont encore "acceptables" lorsque la volumétrie des fichiers reçus est faible (quelques dizaines ou centaines de lignes). Lorsque les fichiers contiennent des dizaines ou centaines de milliers de lignes, ces opérations ligne à ligne en base de données deviennent très coûteuses en performances (voir la métaphore de la boulangère sur les traitements en ligne à ligne : Performances SQL, traitements ensemblistes et ligne à ligne, la métaphore de la boulangère »).

Citation d'un argument avancé pour ne pas optimiser un traitement batch : "c'est pas grave c'est la nuit que ça se passe". Même si le traitement se déroule la nuit, pourquoi ne pas faire efficace.

Il existe un utilitaire Unix trop peu utilisé mais très puissant pour générer un fichier ne contenant que le delta entre un fichier N et un fichier N-1 (nouvelles données et données modifiées entre N et N-1). Cet utilitaire est le binaire comm.

Lorsque les données modifiées ou nouvelles sont relativement faibles entre 2 fichiers, l'utilitaire comm va soulager fortement les données lues par le programme et/ou le traitement réalisé en base : le gain en performances est exceptionnel, quelques heures parfois.

Cet article présente l'utilitaire comm, disponible sur la plupart des plateformes Unix/Linux, à travers un cas pratique.

2- L'utilitaire comm

2-1- Syntaxe et usage

La syntaxe de comm est très basique

comm [-123] file1 file2
-1 : Supprime dans la sortie les lignes n'existant que dans le fichier 1.
-2 : Supprime dans la sortie les lignes n'existant que dans le fichier 2.
-3 : Supprime dans la sortie les lignes identiques existant dans le fichier 1 et le ficher 2.

Code retour : 0 en cas de succès, >0 en cas d'erreur rencontrée.

2-2- Pré-requis

Quelques pré-requis sont indispensables :

Lorsque les données dans le fichier ne sont pas déjà triées, 2 options :

Les fichiers traités étant déjà triés, la consommation mémoire utilisée par l'utilitaire comm est quasi négligeable. Les fichiers sont lus et le fichier résultant est écrit par paquets.

3- Exemple pratique

Dans l'exemple pratique, la plateforme est un OS Sun SPARC Solaris 9 32 bits. Les fichiers previous.bcp et new.bcp sont respectivement les fichiers de données reçus la veille et le jour en cours.

La structure du fichier est un fichier ASCII avec comme séparateur de colonnes le caractère |

%> tail -1 previous.bcp
1|Jun  6 2009 12:00AM|OTCCHARAC_INTERFACES|SOPCHAR060|3| |1|3|Jun  6 2009  4:14PM 

Pour détecter les nouvelles lignes et les lignes modifiées dans le fichier new.bcp par rapport au fichier previous.bcp :

%> comm -32 new.bcp previous.bcp > load.bcp
%> cat load.bcp
1|Jun  6 2009 12:00AM|OTCSCHEDL_INTERFACES|SOPSCHE063|0| |0|1|                             
1|Jun  6 2009 12:00AM|OTCCHARAC_INTERFACES|SOPCHAR060|3| |1|3|Jun  6 2009  7:19PMM

L'option -3 retire les lignes identiques dans les fichiers previous.bcp (fichier 2) et new.bcp (fichier 1).

L'option -2 retire les lignes uniques au fichier previous.bcp (fichier 2).

Le fichier load.bcp obtenu avec comm ne contient ainsi que le delta et les données nécessaires à traiter. Au lieu de charger et traiter 600 000 lignes, il n'y a bien souvent qu'une petite dizaine ou une petite centaine de lignes à charger en base pour traitement.


Annexe

Historique

Version Date Commentaires
1.0 12/2009 Version initiale

Liens

SQLPAC : Performances SQL, traitements ensemblistes et ligne à ligne, la métaphore de la boulangère
Sun Solaris 9 BOL : man comm
Sun Solaris 9 BOL : man sort