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 :

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 »).
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.
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.
Quelques pré-requis sont indispensables :
Lorsque les données dans le fichier ne sont pas déjà triées, 2 options :
%> cat 1.txt | sort > 2.txt
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.
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.
| Version | Date | Commentaires |
|---|---|---|
| 1.0 | 12/2009 | Version initiale |
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