<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Formation SAS - Stage SAS - BI - Data warehouse - Datamart &#187; Tuyaux, Conseils SAS</title>
	<atom:link href="http://www.formations-sas.fr/category/formation-programmeur-sas/tuyaux-conseils-sas/feed" rel="self" type="application/rss+xml" />
	<link>http://www.formations-sas.fr</link>
	<description>SAS : Formation &#38; Stage &#124; Systèmes Decisionnels</description>
	<lastBuildDate>Wed, 23 Jun 2010 09:33:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Détection des doublons avec SAS</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000471/detection-des-doublons-avec-sas.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000471/detection-des-doublons-avec-sas.html#comments</comments>
		<pubDate>Tue, 12 Jan 2010 11:07:37 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>
		<category><![CDATA[detection]]></category>
		<category><![CDATA[doublon]]></category>
		<category><![CDATA[SAS]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=471</guid>
		<description><![CDATA[SAS &#8211; Détection des doublons. Le but ici est de vous fournir un programme simple pour vous permettre de rechercher les doublons que vous pourriez avoir dans une de vos table SAS.   Nous utilisons pour cela la proc SQL de SAS.   On commence par afficher les informations de la table avec deux petites particularités :   [...]]]></description>
			<content:encoded><![CDATA[<h1>SAS &#8211; Détection des doublons.</h1>
<p style="text-align: justify;">Le but ici est de vous fournir un programme simple pour vous permettre de <strong>rechercher les doublons</strong> que vous pourriez avoir dans une de vos table SAS.  </p>
<p>Nous utilisons pour cela la <strong>proc SQL de SAS</strong>.  </p>
<p>On commence par afficher les informations de la table avec deux petites particularités :  </p>
<p>On regroupe les observations sur un critère que vous devez déterminer, ici on à choisi : &laquo;&nbsp;<strong>Nom</strong>, <strong>prenom</strong>, <strong>ville</strong>, <strong>region</strong>, <strong>pays</strong>&nbsp;&raquo; c&#8217;est l&#8217;objet de la partie <strong>GROUP BY</strong>.  </p>
<p>Ensuite on demande à SAS de nous retourner toutes les lignes aggrégées de la table dont le nombre de tuples &laquo;&nbsp;Nom, prenom, ville, region, pays&nbsp;&raquo; est supérieur à 1. C&#8217;est la clause <strong>HAVING</strong>. <span id="more-471"></span>  </p>
<p>Le résultat renverra toutes les lignes possédant au moins <strong>un doublon</strong>, l&#8217;ensemble des variables de la table plus le &laquo;&nbsp;<strong>nombre</strong>&nbsp;&raquo; d&#8217;occurences pour chaque tuple.</p>
<p><code><br />
/* ****************************************** */<br />
/* Site : http://www.formations-sas.fr - 2010 */<br />
/*                                            */<br />
/* PGM = Détection des doublons sur Table SAS */<br />
/*                                            */<br />
/* Auteur : Pascal MAUBERT                    */<br />
/* ****************************************** */</code></p>
<p><strong>proc sql;<br />
   title &#8216;Recherche des doublons&#8217;;<br />
   select *, count(*) as nombre<br />
      from table_double_sas<br />
      group by Nom, prenom, ville, region, pays<br />
      having count(*) &gt; 1;<br />
quit;</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000471/detection-des-doublons-avec-sas.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Limiter les étapes DATA</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000463/limiter-les-etapes-data.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000463/limiter-les-etapes-data.html#comments</comments>
		<pubDate>Fri, 04 Dec 2009 09:28:42 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>
		<category><![CDATA[consommation]]></category>
		<category><![CDATA[CPU]]></category>
		<category><![CDATA[I/O]]></category>
		<category><![CDATA[limiter etape data]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[performances]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=463</guid>
		<description><![CDATA[Limiter les étapes DATA Dans la série optimisation et tuyaux, voici le premier d&#8217;une série de conseil pour l&#8217;optimisation de vos programme SAS. Pour des raisons de simplification et de méconnaissance du produit SAS, nous avons tous débuté en créant une multitude d&#8217;étape data inutiles. Ces étapes sont coûteuses aussi bien en terme de CPU [...]]]></description>
			<content:encoded><![CDATA[<h1>Limiter les étapes DATA</h1>
<p>Dans la série optimisation et tuyaux, voici le premier d&#8217;une série de conseil pour l&#8217;optimisation de vos programme SAS.</p>
<p>Pour des raisons de simplification et de méconnaissance du produit SAS, nous avons tous débuté en créant une multitude d&#8217;étape data inutiles. Ces étapes sont coûteuses aussi bien en terme de CPU qu&#8217;en terme d&#8217;I/O (accès disques entrée/sorties ou Input/Output).</p>
<p>Quand une table est d&#8217;une grande volumétrie, essayez de ne la lire qu&#8217;une seule fois et de créer toutes les tables dépendantes en un seul passage, vous gagnerez toutes les lectures successives de cette table SAS.</p>
<pre>/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/*                                            */
/* Tuyaux - Performances, Optimisation SAS    */
/* <strong>GAIN : CPU - IO</strong>                            */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

<strong>/* ACCEPTABLE */</strong>
data tablea;
 set db.master;
 if flag1;
run;

data tableb;
 set db.master;
 if flag1 and age &lt; 21;
run;

data tablec;
 set db.master;
 if flag1 and age &gt;= 21;
run;

<strong>/* PLUS EFFICACE */</strong>
data tablea tableb tablec;
 set db.master;
 if flag1 then do;
    output tablea;
    if age &lt; 21 then output tableb;
    else             output tablec;
 end;

run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000463/limiter-les-etapes-data.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Changer une variable Caractère en Numérique SAS.</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000344/changer-une-variable-caractere-en-numerique-sas.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000344/changer-une-variable-caractere-en-numerique-sas.html#comments</comments>
		<pubDate>Tue, 03 Nov 2009 19:57:23 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=344</guid>
		<description><![CDATA[Changer une variable Caractère en Numérique SAS. Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 (avancé I) et bien souvent oubliées par les stagiaires. Donc voici un rappel de la méthode &#171;&#160;propre&#160;&#187;, du changement d&#8217;une variable [...]]]></description>
			<content:encoded><![CDATA[<h1>Changer une variable Caractère en Numérique SAS.</h1>
<p>Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 (avancé I) et bien souvent oubliées par les stagiaires.</p>
<p>Donc voici un rappel de la méthode &laquo;&nbsp;propre&nbsp;&raquo;, du changement d&#8217;une variable de type caractère en variable de type numérique.</p>
<p>Utilisation pour la démonstration, d&#8217;une table SAS &laquo;&nbsp;COMPANY&nbsp;&raquo; fournie en standard dans le libname &laquo;&nbsp;SASHELP&nbsp;&raquo; : <strong>sashelp.company</strong>.</p>
<p>Nous allons changer ici la variable &laquo;&nbsp;<span style="font-size: medium;">DEPTHEAD</span>&nbsp;&raquo; de type caractère et de longueur 15 en une variable de type numérique et d&#8217;une longueur de 3, sans changement du nom de la variable.</p>
<p>Par défaut une variable numérique en SAS fait 8 de longueur et cela n&#8217;est pas toujours nécessaire, aussi si vous avez beaucoup de variable numérique et un nombre d&#8217;observation important, il est de bon ton, pour des raisons d&#8217;optimisation, de dimensionner correctement les variables numériques.</p>
<p>L&#8217;instruction length permet d&#8217;effectuer cela.</p>
<p>Théoriquement impossible, nous allons voir que la solution est assez facile à mettre en œuvre.</p>
<pre><span style="font-size: medium;">/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* SAS V9                                     */
/*                                            */
/* Comment convertir une variable caractère   */
/* en numérique.                              */
/*                                            */
/* Procéder en trois étapes :                 */
/* 1 Utilisez l'option dataset RENAME         */
/* 2 Utilisez la fonction de changement de    */
/*   type                                     */
/* 3 Supprimez la variable intermédiaire      */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

data test_change_type(drop=new_var);
 set sashelp.company(rename=(DEPTHEAD=new_var));
 length DEPTHEAD 3.;
 DEPTHEAD=input(new_var,$15.);
run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000344/changer-une-variable-caractere-en-numerique-sas.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changer une variable Numérique en Caractère</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000337/changer-une-variable-numerique-en-caractere.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000337/changer-une-variable-numerique-en-caractere.html#comments</comments>
		<pubDate>Sat, 10 Oct 2009 17:53:42 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=337</guid>
		<description><![CDATA[Changer une variable Numérique en Caractère en SAS. Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 et bien souvent oublié par les stagiaires. Donc voici un rappel de la méthode &#171;&#160;propre&#160;&#187;, du changement d&#8217;une variable de [...]]]></description>
			<content:encoded><![CDATA[<h1>Changer une variable Numérique en Caractère en SAS.</h1>
<p>Ce problème est un problème très simple, il est souvent rencontré lors des développements en SAS. Les informations nécessaires sont généralement fournies lors des formations SAS AVC1 et bien souvent oublié par les stagiaires.</p>
<p>Donc voici un rappel de la méthode &laquo;&nbsp;propre&nbsp;&raquo;, du changement d&#8217;une variable de type numérique en variable de type caractère.</p>
<p>Utilisation pour la démonstration, d&#8217;une table SAS &laquo;&nbsp;COMPANY&nbsp;&raquo; fournie en standard dans le libname &laquo;&nbsp;SASHELP&nbsp;&raquo; : <strong>sashelp.company</strong>.</p>
<p>Nous allons changer ici la variable &laquo;&nbsp;N&nbsp;&raquo; de type numérique et de longueur 8 en une variable de type caractère et d&#8217;une longueur de 12, sans changement du nom de la variable.</p>
<p>Théoriquement impossible, nous allons voir que la solution est assez facile à mettre en œuvre.</p>
<pre><span style="font-size: medium;">
/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* SAS V9                                     */
/*                                            */
/* Comment convertir une variable numérique   */
/* en caractère ?                             */
/*                                            */
/* Procéder en trois étapes :                 */
/* 1 Utilisez l'option dataset RENAME         */
/* 2 Utilisez la fonction de changement de    */
/*   type                                     */
/* 3 Supprimez la variable intermédiaire      */
/*                                            */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */

data test_change_type(drop=new_var);
 set sashelp.company(rename=(n=new_var));
 n=put(new_var,12.);
run;

/* ****************************************** */
/* Site : http://www.formations-sas.fr - 2009 */
/* Auteur : Pascal MAUBERT                    */
/* ****************************************** */</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000337/changer-une-variable-numerique-en-caractere.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SAS Optimisation Transaction Ajout et Mise à jour</title>
		<link>http://www.formations-sas.fr/formation-programmeur-sas/000366/sas-optimisation-transaction-ajout-maj.html</link>
		<comments>http://www.formations-sas.fr/formation-programmeur-sas/000366/sas-optimisation-transaction-ajout-maj.html#comments</comments>
		<pubDate>Sat, 05 Sep 2009 17:18:52 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>
		<category><![CDATA[ajout maj]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[SAS]]></category>
		<category><![CDATA[sas base]]></category>
		<category><![CDATA[traitement transaction]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=366</guid>
		<description><![CDATA[SAS Optimisation Transaction Ajout et Mise à jour Avant propos Cet article à pour de présenter une démarche d&#8217;optimisation pour un traitement de type Transaction pour l&#8217;ajout ou la mise à jour de données SAS. Ce genre de problématique étant récurrent, il m&#8217;a semblé utile de vous fournir l&#8217;exemple détaillé ci-dessous. Cet exemple se base [...]]]></description>
			<content:encoded><![CDATA[<h1>SAS Optimisation Transaction Ajout et Mise à jour</h1>
<h2>Avant propos</h2>
<p>Cet article à pour de présenter une démarche d&#8217;optimisation pour un traitement de type Transaction pour l&#8217;ajout ou la mise à jour de données SAS.</p>
<p>Ce genre de problématique étant récurrent, il m&#8217;a semblé utile de vous fournir l&#8217;exemple détaillé ci-dessous.</p>
<p>Cet exemple se base sur des faits réels rencontrés lors d&#8217;une mission d&#8217;optimisation pour le compte du client &laquo;&nbsp;La Redoute&nbsp;&raquo;, lors de mon passage au service Consulting de chez SAS Institute. Le chiffres fournis sont approximatifs et n&#8217;engage en rien la responsabilité de qui que ce soit.</p>
<h2>Problème :</h2>
<p>Redoute : 25 000 000 de lignes de commandes par jour et un temps de traitement sous SAS MVS avoisinant les 22 heures.</p>
<p>Bien sur, <strong>panique </strong>et demande d&#8217;intervention pour un <strong>audit d&#8217;optimisation</strong>.</p>
<p><strong>Étude cynématique </strong>: par téléphone, par courrier et par internet réception des lignes de commande stockées dans DB2. La nuit Unload DB2 vers un fichier plat pour incorporation dans SAS. Lecture des lignes de commandes, tentative de mise à jour de la base SAS avec les lignes de commandes et en cas de rejet ajout de celles-ci dans la base SAS. Temps de traitement abominable.</p>
<h2><strong>Synthèse des Solutions</strong></h2>
<p>Deux cas se présentent :</p>
<ol>
<li>On connait sous DB2 la nature de la transaction &laquo;&nbsp;ligne de commande&nbsp;&raquo; ajout ou modification</li>
<li>On ne la connait pas</li>
</ol>
<p><strong>Dans ces deux cas une solution performante existe.</strong></p>
<p>La première la plus simple, ne sera pas détaillé dans cet article, simplement on transmet issu de DB2 dans l&#8217;unload une variable de type flag avec A pour ajout et M pour mise à jour. Sous SAS on éclate le fichier en deux tables SAS une pour les ajouts qui seront traités par la PROC APPEND et l&#8217;autre pour les mises à jour qui seront traités avec une étape DATA / MERGE.</p>
<p>Pour le deuxième cas un peu plus pointu, voici ci-dessous un exemple de programme <span id="more-366"></span>fournissant une solution optimisée pour ces traitements transactions AJOUT / MAJ.</p>
<p>Plutôt que le programme SAS, je vous fournit le compte rendu d&#8217;exécution sur une machine de base et exécuté sous Windows Vista SAS V9.</p>
<p><strong>Machine</strong> : Sans marque AMD 7750 x2, RAM 4 Go, HD SATA 500 Go, Windows Vista 64 bits SAS V 9.00.</p>
<p>Attention les temps d&#8217;exécution peuvent paraître excellent, mais la machine n&#8217;est pas partagée et les tables d&#8217;exemple sont petites et surtout elles n&#8217;ont que 6 variables, dans la vraie vie c&#8217;est plutôt de 200 à 500 variables.</p>
<p>Toutefois, La Redoute avec cette solution à ramenée son temps de traitement de 22 à moins de 3 heures.</p>
<p><strong>Tables d&#8217;exemple :</strong></p>
<ul>
<li>Base : toto1 &#8211; 5 000 000 de lignes et 6 variables</li>
<li>Transaction : toto2 &#8211; 525 000 lignes et 6 variables</li>
<li>TP &#8211; MAJ : maj &#8211; 175 001 lignes et 6 variables</li>
<li>TP &#8211; Ajout : add &#8211; 349 999 lignes et 6 variables</li>
<li>Temps d&#8217;exécution total réel (elaps) : 9.53 secondes</li>
</ul>
<p><strong>Extrait de la Log :</strong></p>
<pre><span style="font-size: small;">379  /* ****************************************** */
380  /* Site : http://www.formations-sas.fr - 2009 */
381  /* SAS V9 : Optimisation                      */
382  /*                                            */
383  /* Comment optimiser un traitement de         */
384  /* transaction en SAS.                        */
385  /*                                            */
386  /* Auteur : Pascal MAUBERT                    */
387  /* ****************************************** */
388
389  options compress=no bufno=8 bufsize=9220 fullstimer msglevel=i;
390
391  /* Création de la table de base exemple */
392  data toto1(index=(i /unique));
393   do i = 1 to 5000000;
394      j=i*2;
395      y=j*3.14;
396      orig='A';
397      k=i*j;
398      total=sum(of i j y k);
399      output;
400   end;
401  run;

Note: La table WORK.TOTO1 a 5000000 observations et 6 variables.
Note: Index simple i défini.
Note: L'étape DATA used (Total process time):
 temps réel                   3.96 secondes
 temps processeur utilisateur 2.48 secondes
 temps processeur système     0.99 secondes
 Mémoire                            68348k

402
403  /* Création de la table de Transaction exemple */
404  data toto2(index=(i /unique));
405   do i = 1500000 to 12000000 - 1 by 20;
406      aj=i*2/2;
407      ay=aj*3.14/3.14;
408      aorig='B';
409      ak=i*aj/aj;
410      total=sum(of i aj ay ak);
411      output;
412   end;
413  run;

Note: La table WORK.TOTO2 a 525000 observations et 6 variables.
Note: Index simple i défini.
Note: L'étape DATA used (Total process time):
 temps réel                   0.32 secondes
 temps processeur utilisateur 0.23 secondes
 temps processeur système     0.09 secondes
 Mémoire                            12940k

414
415  /*  Début du traitement hebdomadaire, chez vous sur les unload DB2 */
416  /*  Création des tables MAJ et ADD */
417  data maj
418       add(rename=(aj=j aorig=orig ay=y ak=k));
419   merge toto1(in=a keep=i)
420         toto2(in=b);
421   by i;
422   if b and a     then output maj;
423   if b and not a then output add;
424   else delete;
425  run;

INFO : Index i sélectionné pour traitement de la clause BY.
INFO : Index i sélectionné pour traitement de la clause BY.
Note:  5000000 observations copiées de la table WORK.TOTO1.
Note:  525000 observations copiées de la table WORK.TOTO2.
Note: La table WORK.MAJ a 175001 observations et 6 variables.
Note: La table WORK.ADD a 349999 observations et 6 variables.
Note: L'étape DATA used (Total process time):
 temps réel                   3.89 secondes
 temps processeur utilisateur 3.58 secondes
 temps processeur système     0.29 secondes
 Mémoire                            268k

426
427  /* Traitement de la table MAJ */
428  data toto1;
429   set maj(drop=aj ay ak); /* Le drop si Variables non MAJ */
430   modify toto1 key=i /unique ;
431   i=i;
432   *j=aj;
433   *y=ay;
434   orig=aorig;
435   *k=ak;
436   if _iorc_=0 then replace;
437   else do; _error_=0; output; end;
438  run;

Note:  175001 observations copiées de la table WORK.MAJ.
Note: Table WORK.TOTO1 mise à jour.  175001 observations recopiées, 0 observations ajoutées et 0 observations supprimées.
Note: L'étape DATA used (Total process time):
 temps réel                   0.90 secondes
 temps processeur utilisateur 0.60 secondes
 temps processeur système     0.26 secondes
 Mémoire                            151k

439
440  /*  Traitement de la table ADD */
441  Proc append data=add base=toto1;
442  run;

Note: Ajout de WORK.ADD to WORK.TOTO1.
INFO : Processus d'ajout rapide d'un moteur en cours d'utilisation.
INFO: la méthode de lecture par bloc du moteur est en cours d'utilisation.
INFO: la méthode d'écriture par bloc du moteur est en cours d'utilisation.
Note:  349999 observations copiées de la table WORK.ADD.
Note: 349999 observations added.
Note: La table WORK.TOTO1 a 5349999 observations et 6 variables.
Note: La procédure APPEND used (Total process time):
 temps réel                   0.46 secondes
 temps processeur utilisateur 0.31 secondes
 temps processeur système     0.15 secondes
 Mémoire                            8639k

443
444  /* ****************************************** */
445  /* Site : http://www.formations-sas.fr - 2009 */
446  /* Auteur : Pascal MAUBERT                    */
447  /* ****************************************** */

</span></pre>
<p><span style="font-size: small;">Et maintenant selon la formule consacrée : A vos claviers <img src='http://www.formations-sas.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
</span></p>
<p><span style="font-size: small;"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/formation-programmeur-sas/000366/sas-optimisation-transaction-ajout-maj.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Longueur utilisée d’une variable SAS : Numérique, Alphanumérique</title>
		<link>http://www.formations-sas.fr/datamart/000313/longueur-variable-sas.html</link>
		<comments>http://www.formations-sas.fr/datamart/000313/longueur-variable-sas.html#comments</comments>
		<pubDate>Thu, 21 May 2009 22:09:03 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[BO programmeur SAS]]></category>
		<category><![CDATA[datamart]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[Tuyaux, Conseils SAS]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=313</guid>
		<description><![CDATA[Longueur utilisée d’une variable SAS : Numérique, Alphanumérique. Dans la problématique d’optimisation des applications SAS, des traitements et de la charge machine, nous sommes parfois amené à effectuer des recherches afin d’optimiser les programmes SAS et les bases de données SAS. Un des points important est la volumétrie que représentent ces données. En effet, lorsque des [...]]]></description>
			<content:encoded><![CDATA[<h2><strong>Longueur utilisée  d’une variable SAS : Numérique,  Alphanumérique.</strong></h2>
<p align="justify">Dans la problématique d’<strong>optimisation</strong> des <strong>applications SAS</strong>, des  <strong>traitements</strong> et de la <strong>charge machine</strong>,  nous sommes parfois amené à effectuer des recherches afin d’<strong>optimiser</strong> les <strong>programmes SAS</strong> et les <strong>bases de données SAS</strong>.</p>
<p align="justify">Un des points important est la <strong>volumétrie</strong> que représentent ces  données. En effet, lorsque des bases de données stockent de <strong>grande quantité de données</strong>, des dizaines voire des  centaines <strong>de millions de lignes</strong>, il  devient très <strong>rentable</strong> et <strong>judicieux</strong> de se pencher sur l’<strong>optimisation</strong> des  traitements, programmes SAS, mais également  sur les bases de données SAS.</p>
<p align="justify">Or si SAS nous  fournit une <strong>gestion simplifiée</strong> de la création et de la <strong>gestion de ses tables</strong>, il n’en demeure pas moins,  qu’un peu de <strong>travail d’optimisation</strong> reste à la charge  du <strong>concepteur</strong> de l’<strong>architecture des données</strong>. Cela devient encore plus vrai dans  le monde du <strong>décisionnel</strong>, monde dans lequel les données, stockées sous forme de  <strong>data Warehouse</strong> ou de <strong>datamarts</strong>, atteignent  des volumes très important et ou <strong>le temps d’analyse est conséquent</strong>.</p>
<p align="justify">Hormis les <strong>problématiques de bien fondé</strong> de telle ou telle  variable dans une table, de <strong>la normalisation des tables</strong> qui n’est pas<span id="more-313"></span> envisageable dans le <strong>BI</strong> ou le <strong>décisionnel</strong>, il nous reste  un point important d’<strong>optimisation</strong>, c’est la longueur  de <strong>stockage des variables</strong>.</p>
<p align="justify">Par défaut, les <strong>variables SAS</strong>,  n’ont pas besoin d’être définies, <strong>déclarées</strong>, leur création est <strong>automatiquement</strong> effectuée lors de leur <strong>assignation  de valeur</strong>.</p>
<p align="justify">Dans le cas d’une définition automatique d’une <strong>variable  numérique</strong>, SAS attribue une longueur par défaut de <strong>8 positions numérique</strong>. Or comme  vous pouvez le voir ci-dessous dans le<strong> tableau présenté</strong> (plate-forme MVS/Z/OS),  il est bien rare d’avoir besoin d’une <strong>si grande  longueur</strong> de variable.</p>
<p><strong>Table 10.1  Variable Length and Largest Exact Integer  Length in Bytes</strong></p>
<p><strong>Significant Digits  Retained Largest Integer Represented Exactly</strong></p>
<p><strong>2          2          256</strong></p>
<p><strong>3          4          65,536</strong></p>
<p><strong>4          7          16,777,216</strong></p>
<p><strong>5          9          4,294,967,296</strong></p>
<p><strong>6          12        1,099,511,627,776</strong></p>
<p><strong>7          14        281,474,946,710,656</strong></p>
<p><strong>8          16        72,057,594,037,927,936</strong></p>
<p align="justify">SAS nous fournit  en standard, via le <strong><a href="http://www.formations-sas.fr/formation-sas/000211/formation-sas-base-prog1.html" target="_self">module SAS Base</a></strong>,  un grand nombre de <strong>fonctions</strong>, telles  que : Fonctions de <strong>tableaux</strong>, fonctions de <strong>caractères</strong>, fonctions de  <strong>devises</strong>, fonctions de <strong>dates</strong> et de <strong>temps</strong>, fonctions de <strong>statistiques</strong>, fonctions  de <strong>gestion de fichiers</strong>, fonctions  <strong>financières</strong>, fonctions de <strong>macro</strong>, fonctions <strong>mathématiques</strong>, fonctions de  <strong>probabilité</strong> de <strong>quantile</strong>, fonctions <strong>aléatoires</strong>, fonctions de <strong>trigonométrie</strong>, fonctions de <strong>variable</strong>, fonctions de <strong>Web</strong> …</p>
<p align="justify">Or si il est facile pour les variables de <strong>type caractères</strong>,  de connaître la <strong>longueur utilisée</strong> d’une variable à l’aide de la fonction chaine <strong>LENGTH()</strong>, il n’en est pas de même  pour les variables de type <strong>numérique</strong>.</p>
<p align="justify">Toutefois nous n’allons  pas en rester là, et ce que SAS n’a  pas fait pour nous, <strong>nous allons le  faire nous même</strong>. Avant de vous  donner notre solution, nous allons  nous mettre dans un cas d’école simple  afin de <strong>rappeler le contexte à nos amis débutant en SAS</strong>.</p>
<p align="justify">Les informaticiens <strong>maîtrisant déjà SAS</strong>,  nous vous conseillons de <strong>passer directement à la solution</strong>.</p>
<p align="justify">Pour les autres, afin de vous  aider à mieux comprendre voici un petit programme  qui crée une table SAS nommée  test_var, en environnement <strong>SAS MS Windows</strong>.</p>
<p align="justify">
<pre class="Style1"><span style="font-size: medium;">data test_var;
  a=1;
  dt='27dec2008'd;
  b="un  deux";
  c=scan(b,1)!!"  / "!!scan(b,2)!!".";
run;</span></pre>
<p>Alors à la lecture de ce <strong>programme  SAS</strong>, il serait <strong>plausible de penser</strong> que :</p>
<p>a : variable  numérique longueur 1</p>
<p>dt :  variable numérique longueur 9</p>
<p>b : variable  alphanumérique longueur 7</p>
<p>c : variable  alphanumérique longueur 11, soit b +  blanc / blanc et point.</p>
<p>Soit un total  pour les lignes de la table de <strong>28  octets</strong>, bytes, positions, digit, c …</p>
<p>Eh bien  <strong>NON</strong> !</p>
<p>La longueur totale de la ligne  est de <strong>427</strong> c.</p>
<p>Et elle pourrait  être réduite à <strong>25</strong> c.</p>
<p align="justify">Soit un  <strong>différentiel de 402</strong> c, ce qui ne représente rien ou pas grand chose pour une table de <strong>200 000  lignes</strong> avec si peu de variables,  multipliez par 20 le nombre de variable, par 100 le nombre de ligne et alors le <strong>gain  sera colossale</strong>, non seulement en <strong>volumétrie</strong>, mais lors des <strong>traitements</strong> de ces  <strong>données</strong> SAS par des programmes, vous <strong>économiserez</strong> sur le temps de <strong>lecture</strong>,  sur le temps de <strong>transfert</strong> sur le <strong>réseau</strong>, sur le volume de <strong>mémoire</strong> nécessaire,  le temps <strong>CPU</strong>, le temps d’<strong>analyse</strong> et enfin le temps pour l’<strong>écriture</strong> des données  si vous écrivez une table en sortie.</p>
<p align="justify">Voici les  explications correspondantes à cette longueur  surprenante de 427 c.</p>
<div>
<ul>
<li> La variable fait  8 position alors que 3 (longueur  minimum en environnement MS Windows) aurait suffit</li>
<li> La variable dt  fait 8 alors que 4 aurait suffit (date SAS  = nb jours écoulés depuis 1-1-1960).</li>
<li> La variable b est  sans surprise</li>
<li> En revanche la  variable c fait 404 c et là les débutants s’arrachent les cheveux, en fait si  vous aviez suivis notre cours SAS de  base vous sauriez que par défaut certaines fonctions caractère et notamment la  fonction scan, attribue automatique une longueur  de 200 c lors de son exécution à la variable résultante.</li>
</ul>
<p><strong>Voici une  variante de solution pour le problème exposé :</strong></div>
<pre class="Style1"><span style="font-size: medium;">data test_var2;
  length  a 3 dt 4 b $ 7 c $ 11;
  a=1;
  dt='27dec2008'd;
  b="un deux";
  c=scan(b,1)!!"  / "!!scan(b,2)!!".";
run;</span></pre>
<p align="justify">
<p align="justify"><strong>b</strong> n’est définit  dans l’instruction length, que pour <strong>garder l’ordre des variables SAS</strong> dans la table test_var2 par rapport à test_var.</p>
<p align="justify">Les fonctions : <strong>trim</strong>(), <strong>left</strong>(), <strong>compress</strong>() ne  fonctionnement pas pour ce problème (scan). Essayez-le par vous même pour vérifier.</p>
<p align="justify">Bien vous vous doutez bien qu’en général,  <strong>une table SAS</strong> ne possède pas qu’une  ligne et connue par vous, il va donc  falloir <strong>mettre au point</strong> un petit programme afin de déterminer la <strong>longueur maximale  utilisée</strong> dans notre table.</p>
<p align="justify">Pour cela nous allons  utiliser la procédure   <strong>SAS SQL</strong>.</p>
<p align="justify">Commençons par le plus simple,  déterminer la plus grande longueur utilisée d’une <strong>variable de type caractère</strong>,  soit <strong>alphanumérique</strong> dans une table SAS.</p>
<pre class="Style1"><span style="font-size: medium;">PROC SQL;
  select max(length(b))  as lg_b,  max(length(c)) as lg_c
  from  test_var2 ;
Quit ;</span></pre>
<p align="justify">
<p align="justify">Il nous reste  maintenant à atteindre <strong>le but de cet article</strong> d’<strong>optimisation</strong> SAS, faire la même chose sur les <strong>variables  numériques</strong>, sachant que SAS ne nous  proposent pas l’équivalent de LENGTH().</p>
<p align="justify">L’<strong>astuce</strong> est la  suivante, calculer le <strong>logarithme  népérien base 10</strong> des variables et <strong>arrondir à l’entier supérieur</strong> le résultat  obtenu et bien sur ne retenir que la <strong>valeur maximale trouvée</strong> dans la table. Ajoutons encore une variable  à notre table de départ.</p>
<pre class="Style1"><span style="font-size: medium;">data test_var3;
  length  a 3 dt 4 b $ 7 c $ 11;
  a=11;
  dt='27dec2008'd;
  b="un deux";
  c=scan(b,1)!!"  / "!!scan(b,2)!!".";
  d=123456789;
run;</span></pre>
<p>Et maintenant  calculons le résultat :</p>
<pre class="Style1"><span style="font-size: medium;">PROC SQL;
  select max(ceil(log10(a))) as lg_a, max(ceil(log10(dt))) as lg_dt, max(ceil(log10(d))) as lg_d
  from  test_var3 ;
Quit ;</span></pre>
<p align="justify">
<p align="justify">Ici dans notre  exemple, la fonction MAX() n’est pas utile, mais elle  devient indispensable dans une table de plus d’une ligne.</p>
<p align="justify">Le  résultat est : <strong>2, 5, 9</strong>.</p>
<p align="justify">Aidé du<strong> tableau des longueurs</strong>, dans <strong>le companion de votre environnement</strong>, vous avez tout pour<strong> optimiser les longueur de variable</strong>.</p>
<p align="justify"><strong>A vous de jouer</strong> avec SAS!</p>
<p align="justify">Au fil du temps et selon notre disponibilité, nous mettrons à votre disposition ces quelques exemples que nous fournissons lors de nos formations SAS.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/datamart/000313/longueur-variable-sas.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

