<?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; datamart</title>
	<atom:link href="http://www.formations-sas.fr/category/datamart/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>SAS SPDE description et exemple de PGM SAS SPDE</title>
		<link>http://www.formations-sas.fr/datamart/000352/sas-spde-spds.html</link>
		<comments>http://www.formations-sas.fr/datamart/000352/sas-spde-spds.html#comments</comments>
		<pubDate>Tue, 01 Dec 2009 10:42:51 +0000</pubDate>
		<dc:creator>SAS BI</dc:creator>
				<category><![CDATA[Autoformation SAS]]></category>
		<category><![CDATA[datamart]]></category>
		<category><![CDATA[Exemple programme SAS]]></category>
		<category><![CDATA[Formation Programmeur SAS]]></category>
		<category><![CDATA[Formation SAS]]></category>
		<category><![CDATA[Optimisation SAS]]></category>
		<category><![CDATA[architecture SMP]]></category>
		<category><![CDATA[moteur de donnée]]></category>
		<category><![CDATA[performance requête]]></category>
		<category><![CDATA[SAS]]></category>
		<category><![CDATA[SAS Scalable Performance Data Engine]]></category>
		<category><![CDATA[SAS SPDE]]></category>
		<category><![CDATA[SAS SPDS]]></category>

		<guid isPermaLink="false">http://www.formations-sas.fr/?p=352</guid>
		<description><![CDATA[Exemple de programme SAS SPDE (SPDS) Avant Propos. Le but de cet article n&#8217;est pas de se substituer à une formation appliquée de SAS SPDE, mais de présenter ce fabuleux produit, même si les techniciens SAS avancés seront surement capable de s&#8217;en contenter pour comprendre, assimiler et utiliser SAS SPDE. Cet article ne prétends pas [...]]]></description>
			<content:encoded><![CDATA[<h1>Exemple de programme <strong>SAS SPDE</strong> (<strong>SPDS</strong>)</h1>
<h2><strong>Avant Propos.</strong></h2>
<p>Le but de cet article n&#8217;est pas de se substituer à une formation appliquée de SAS SPDE, mais de présenter ce fabuleux produit, même si les techniciens SAS avancés seront surement capable de s&#8217;en contenter pour comprendre, assimiler et utiliser SAS SPDE.</p>
<p>Cet article ne prétends pas non plus à se substituer à la documentation officielle de SAS Institute sur SAS SPDE, un lien vers celle-ci (documentation en anglais) se trouve en bas de la page.</p>
<h2><strong>Description générale de SAS SPDE</strong></h2>
<p>SAS SPDE est un moteur de gestion de données SAS, SAS SPDS est un serveur à part entière de gestion des données et au fonctionnant proche de SAS SPDE. SAS SPDE est intégré au module SAS Base comme moteur de gestion des données .</p>
<p>Aujourd&#8217;hui intégré au produit / module SAS Base, son nom à été changé en SAS SPDE.</p>
<p>Ce moteur de données SAS offre des performances exceptionnelles et trouve sa raison d&#8217;être dans le besoin de performances accrues lors de requêtes sur des tables de très gros volumes. C&#8217;est à dire des tables allant de 512 méga à plusieurs terra octets.</p>
<p>En synthèse, si on souhaite pouvoir lancer une requête contenant plusieurs critères sur une table de plusieurs terra octets et obtenir une réponse en quelques secondes, alors la solution SAS SPDE  est une solution appropriée.</p>
<p>SAS SPDE est donc l&#8217;un des procédé d&#8217;optimisation, il en existe bien d&#8217;autre,  pour l&#8217;accès à des données décisionnelles, données d&#8217;entreprise, de fortes volumétrie et nécessitant des performances accrues en terme de temps de réponse à des requêtes.</p>
<h2><strong>Description technique de SAS SPDE</strong></h2>
<p><strong>Pourquoi SAS SPDE est encore plus rapide que SAS Base, qui déjà offre des performance hors du commun ?</strong></p>
<p><span id="more-352"></span>Le principe de fonctionnement du moteur SAS SPDE tire profit des architectures SMP <span id="main" style="visibility: visible;"><span id="search" style="visibility: visible;">(Symmetric Multiprocessing). Dans cette architecture, </span></span>les processeurs partagent le bus d&#8217;accès à la mémoire vive, communiquent entre eux et peuvent travailler en parallèle.</p>
<p>Et enfin ajoutons également une batterie de disque dur rapide sur lesquels seront réparti un partitionnement des grosses table SAS.</p>
<h2><strong>Simplification et synthèse :</strong></h2>
<p>Pour effectuer une requête sur une table de 4 terra-octets, sur une machine possédant 16 processeurs et 9 disques durs :</p>
<p>SAS SPDE, avec les doigts de l&#8217;administrateur  <img src='http://www.formations-sas.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  partitionne la table (partie donnée) en 6 blocs et implémente chacun de ces blocs sur un disque dur différent, crée un descripteur nommé méta-data sur un autre disque dur, qui contiendra les informations sur la table et enfin utilisera les deux derniers disques durs afin d&#8217;y stocker les fichiers d&#8217;index.</p>
<p>Un choix de la taille du partitionnement, par exemple 128 Mo, donnera un total de 32 blocs poue cette table de 4 terra-octets, et ces blocs seront répartit sur les 6 disques durs prévue à cet effet via l&#8217;allocation faite lors du libname.</p>
<p>Ensuite lors de la requête 1 ou 2 des CPU travailleront sur les fichiers d&#8217;index, une dizaine sur les blocs de donnée, 1 sur les méta-data et le reste sur le tri automatique à la volée sur l&#8217;éventuelle classification induite par des group by.</p>
<p>SAS SPDE ne nécessite plus l&#8217;utilisation de la PROC SORT, en effet, les données sont triées automatiquement à la volée en cas de besoin.</p>
<p>Tout ce petit monde travaillera en parallèle et communiquera ensemble afin de fournir un résultat très rapide et cohérent à l&#8217;utilisateur.</p>
<h2><strong>Programme SAS d&#8217;exemple sur SAS SPDE</strong></h2>
<p>Se programme à pour vocation et vous fournir des informations synthétique sur la syntaxe générale à utiliser lors d&#8217;un travail sur des données à faire gérer par le moteur de donnée SAS SPDE.</p>
<p>Le programme ci dessous proposé, ne prétend pas vous fournir toutes les informations sur le produit SAS SPDE, mais une base sérieuse afin de vous permettre de commencer à travailler avec SAS SPDE. Attention toutefois, lors de l&#8217;utilisation de SAS SPDE, les performances ne peuvent être significative que si votre machine possède plusieurs processeurs et plusieurs disques durs. La connexion à ces derniers via fibre optique est un plus.</p>
<p>Cet exemple de programme SAS, utilise les modules SAS : SAS Base, SAS SPDE, SAS SQL et SAS MACRO.</p>
<pre><span style="font-size: medium;">/* Options d'otimisation et de conte rendu */
options fullstimer bufno=16 bufsize=16384;

/* Exemple d'utilisation du moteur SAS SPDE */
/* définition et mise en place de l'accès via LIBNAME */

libname mon_spde spde "D:\SAS Divers\SAS_SPDE/disk1/metadata"
 datapath  = ("D:\SAS Divers\SAS_SPDE/disk2/userdata"
 "D:\SAS Divers\SAS_SPDE/disk3/userdata")
 indexpath = ("D:\SAS Divers\SAS_SPDE/disk4/userindexes"
 "D:\SAS Divers\SAS_SPDE/disk5/userindexes")
 ;  /* temp=yes; Attention ! Cette option vide les libnames
 de SPDE à la fin de la session SAS. */

/* MACRO itérative pour la création d'une table SAS
 de 400 variables et d'environ 80 000 observations */
options nomprint nosymbolgen;
/* Définition, compilation et stockage temporaire */
%macro test(deb=1,fin=200);
 data mon_spde.test_spde(index=(total /unique)asyncindex=yes partsize=24);
 %do i = &amp;deb %to &amp;fin;
 %do inc = 1 %to 399;
 a&amp;inc = &amp;i * &amp;inc;
 total=sum(of a:);
 output;
 %end;
 %end;
 run;
%mend test;

/* Appel de la macro pour création de la table */
%test ;

/* Requête de création d'une table via une
 selection d'observations sur critères .. */
proc sql;
create table mon_spde.select_spde as
 select * from mon_spde.test_spde
 where total between 400000 and 5000000
 and a1 &gt;= 5 and a1 &lt;= 63;
quit;

/* MACRO Itérative exemple en SAS Base */
options nomprint nosymbolgen;
%macro test(deb=1,fin=200);
 data toto(index=(total /unique));
 %do i = &amp;deb %to &amp;fin;
 %do inc = 1 %to 399;
 a&amp;inc = &amp;i * &amp;inc;
 total=sum(of a:);
 output;
 %end;
 %end;
 run;
%mend test;

%test ;

proc sql;
create table select_toto as
 select * from toto
 where total between 400000 and 5000000
 and a1 &gt;= 5 and a1 &lt;= 63;
quit;

/* Copie  d'une table de SAS base vers SAS SPDE */
proc copy in = work out = mon_spde;
 select toto;
run;
/* Copie  d'une table de SAS base vers SAS SPDE,
 bien plus performant que la PROC COPY */
proc append base=mon_spde.toto(asyncindex=yes partsize=24)
 data=work.toto;
run;

/* Compte rendu du contenu d'une biblithèque SAS SPDE */
proc contents data=mon_spde._all_;
run;</span></pre>
<h2><strong>Note :</strong></h2>
<p>A noter que la PROC APPEND offres des performances accrues par rapport à la PROC COPY de l&#8217;ordre de facteur 10, toutefois pour la copie de beaucoup de table se trouvant sur la même bibliothèque, l&#8217;écriture de la PROC COPY est beaucoup plus simple. Mais comme toujours en SAS il existe des solutions à tout problème et ici nous pourrions, par exemple, encapsuler la proc append dans une macro et automatiser le transfert de toutes les tables contenues dans un libname x d&#8217;un moteur SAS Base vers un Moteur SAS SPDE.</p>
<h2><strong>Documentation :</strong></h2>
<p>Pour les longs discours et pour plus de détails sur SAS SPDE, voir la documentation officielle de SAS Institute, version SAS 9.2 : <a title="SAS SPDE - SAS SPDS" href="http://support.sas.com/documentation/cdl/en/engspde/61887/PDF/default/engspde.pdf" target="_blank"><strong>Scalable Data Performance Engine</strong></a></p>
<p>Copyright de l&#8217;article © P.Maubert 2009</p>
]]></content:encoded>
			<wfw:commentRss>http://www.formations-sas.fr/datamart/000352/sas-spde-spds.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>

