/*********************************************************/ /*Titre: Comparaison.sas */ /*Date: 01/03/07 */ /*Auteur: Pascal Lemetayer (Support Clients SAS) */ /*Sujet: Ce programme crée les données d'exemple et */ /* réalise la fusion entre 2 tables avec 2 */ /* méthodes différentes. Le but étant de mettre en */ /* avant les performances de chacune des méthodes. */ /* Il est en rapport avec l'article 'Le code Hash' */ /* de 'A la une du support' de Mars 2007. */ /* */ /*********************************************************/ /*Création des tables de données de test*/ %let large_obs = 500000; data work.small ( keep = keyvar small: ) work.large ( keep = keyvar large: ) ; array keys(1:500000) $1 _temporary_; length keyvar 8; array smallvar [20]; retain smallvar 12; array largevar [682]; retain largevar 55; do _i_ = 1 to &large_obs ; keyvar = ceil (ranuni(1) * &large_obs); if keys(keyvar) = ' ' then do; output large; if ranuni(1) < 1/5 then output small; keys(keyvar) = 'X'; end; end; run; /*******************************************************/ /* comparaison des méthodes de fusion de tables */ /*******************************************************/ /******************METHODE CLASSIQUE********************/ /*Afin de fusionner les deux tables, il est */ /*indispensable de les trier préalablement en fonction */ /*de la variable keyvar */ proc sort data=work.small; by keyvar; run; proc sort data=work.large; by keyvar; run; data work.match_merge; merge work.large (in=a) work.small (in=b); by keyvar; if a; run; /************ METHODE HASHING *************************/ /* Avec le Hashing aucun tri ou indexation n'est */ /* nécessaire. */ data work.hash_merge (drop=rc i); /* Création de la table en mémoire */ declare hash h_small (); /* Définition de la structure de la table en mémoire */ length keyvar smallvar1-smallvar20 8; array smallvar(20); rc = h_small.DefineKey ( "keyvar" ); rc = h_small.DefineData ( "smallvar1","smallvar2","smallvar3","smallvar4", "smallvar5","smallvar6","smallvar7","smallvar8", "smallvar9","smallvar10","smallvar11","smallvar12", "smallvar13","smallvar14","smallvar15","smallvar16", "smallvar17","smallvar18","smallvar19","smallvar20" ); rc = h_small.DefineDone (); /* Remplissage de la table en mémoire à partir */ /* de la table work.small */ do until ( eof_small ); set work.small end = eof_small; rc = h_small.add (); end; /* Fusion des tables */ do until ( eof_large ); set work.large end = eof_large; /*Initialisation des variables manquantes */ do i=lbound(smallvar) to hbound(smallvar); smallvar(i) = .; end; rc = h_small.find (); output; end; run;