Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/03/2011, 11h25   #1
Invité de passage
 
Inscription : mars 2011
Messages : 1
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : mars 2011
Messages : 1
Points : 0
Points : 0
Par défaut Problème taille des tables.

Bonjour tout le monde,

Je ne suis pas sur de poster au bon endroit, veuillez donc m'excuser d'avance au cas où.

Je ne sais pas si quelqu'un a déjà observé ce souci sous SAS/(SHARE?) (proche de celui de Microsoft Access où il faut compacter la base régulièrement pour flusher l'ensemble des données non utilisées mais réellement bien effacées).

En effet, pour éviter les problèmes de lecture/écriture, l'option choisie (peut-être à tort à cause du métier) est de passer par une procédure sql pour supprimer une ligne et une autre pour insérer une nouvelle ligne.

Le souci, est que lors de ces différentes opérations, la table finit par grossir de façon exagérée. Ainsi que les triggers, je veux dire par là que si on a supprimer une ligne avec un champ incrémental à 10 par exemple, le chiffre 10 n'est plus disponible, malgré la suppression. La ligne suivant sera donc 11...

La solution est pour l'instant, de passer par un data set, style data toto set toto. Ce qui a pour effet de réduire la taille de la table toto de 3Go à 300Mo. Comme si on a "compacté" sous Access pour ceux qui connaissent le souci sous Access...

Connaîtriez vous une solution qui permettrait de "compacter" la base ? Car le data set, s'il a pour effet de réduire la taille en flushant les données inutiles, c'est une opération longue car le moteur SAS parcourt ligne à ligne la table initiale de 3Go qui en fait, n'est que de 300Mo après lecture...

C'est un truc assez étrange, si vous avez une idée, solution, ou une documentation, je suis preneur et vous remercie bien d'avance =)

Pour info, la librairie est en option compress=binary


Michel
CoriS-FrosT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 11h54   #2
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
Si tu veux compacter tes tables de façon automatique il n'y a que COMPRESS=YES lorsque les tables ont plutôt plus de variables alphanumériques et COMPRESS=BINARY lorsque les tables ont plutôt plus de variables numériques.

tu peux dimensionner correctement tes champs également.

Ensuite, tu peux gérer plus finement les observations à supprimer mais je ne suis pas certain que la sueur générée soit payante.

Quant à SAS / SHARE, c'est un module spécifique pour le partage des tables en écriture...
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/03/2011, 12h18   #3
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
Autre possibilité, supprimer les variables inutiles.

De souvenir ce thème à déjà été abordé dans des précédents sujets, en cherchant un peu sur le forum tu devrais trouver des infos plus précises.

Manoutz
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 12h23   #4
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Je n'ai peut-être rien compris, mais j'ai l'impression qu'il ne s'agit pas forcément du problème classique de gain de place.
Si j'ai suivi, les suppressions d'observations via la proc SQL ne sont que des suppressions logiques (cf. la fonction ATTRN et les distinctions subtiles entre les comptages d'observations dans une table). Et que du coup, la table enfle démesurément en mémoire alors que son nombre d'observations logiques reste stable.
L'étape DATA remet tout ça à plat puisqu'elle n'écrit que les observations qui ne sont pas marquées pour une suppression logique.

Je n'ai pas encore eu le temps de faire des tests pour vérifier cette analyse ; mais si c'était le cas, il faudrait chercher un moyen de forcer le SQL à une suppression physique de l'observation et non logique (mais du coup, on reviendrait à un processus coûteux en temps, j'imagine).
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/03/2011, 11h53   #5
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Bonjour,

Je viens de faire le test suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 
/*Suppression à l'aide d'une étape data*/
DATA t;
do i=1 TO 1000000;
	k=i;
	ou1="sdfqsdfsqdfsdf";
	ou2="sdfqsdfsqdfsdf";
	ou3="sdfqsdfsqdfsdf";
	ou4="sdfqsdfsqdfsdf";
	ou5="sdfqsdfsqdfsdf";
	output;
end;
run;
 
 
DATA t; SET t;
WHERE k < 10000;
run;
DATA _null_;
   dsid=open("t");
   NOBS=attrn(dsid,"NOBS");
   NLOBS=attrn(dsid,"NLOBS");
   put "delete etape data" nobs= nlobs;
run;
 
/*suppression des données en sql avec un delete*/
DATA t;
do i=1 TO 1000000;
	k=i;
	ou1="sdfqsdfsqdfsdf";
	ou2="sdfqsdfsqdfsdf";
	ou3="sdfqsdfsqdfsdf";
	ou4="sdfqsdfsqdfsdf";
	ou5="sdfqsdfsqdfsdf";
	output;
end;
run;
proc sql;
DELETE FROM t 
WHERE k > 10000;
quit;
DATA _null_;
   dsid=open("t");
   NOBS=attrn(dsid,"NOBS");
   NLOBS=attrn(dsid,"NLOBS");
   put "delete sql " nobs= nlobs;
run;
/*suppression des données en sql : création d'une nouvelle table*/
 
DATA t;
do i=1 TO 1000000;
	k=i;
	ou1="sdfqsdfsqdfsdf";
	ou2="sdfqsdfsqdfsdf";
	ou3="sdfqsdfsqdfsdf";
	ou4="sdfqsdfsqdfsdf";
	ou5="sdfqsdfsqdfsdf";
	output;
end;
run;
proc sql;
CREATE TABLE t AS
SELECT * 
FROM t 
WHERE k < 10000;
quit;
DATA _null_;
   dsid=open("t");
   NOBS=attrn(dsid,"NOBS");
   NLOBS=attrn(dsid,"NLOBS");
   put "delete create table sql " nobs= nlobs;
run;
le delete en sql : les données sont supprimées logiquement et non physiquement.
Pour supprimer les données physiquement il faut recréer la table.
Sauf si il y a des options qui nous permettrons de le faire avec un delete sql.
Exécuter le code ci-dessus et regarder à chaque étape la taille des tables à partir de l'explorateur windows.

Cordialement
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/03/2011, 11h24   #6
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
REMOVE permet la suppression physique d'une observation. Il faut utiliser MODIFY et non SET dans ce cas.

http://support.sas.com/documentation...a000202648.htm
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/03/2011, 09h21   #7
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
http://support.sas.com/documentation...a001392994.htm

Note: For PROC SQL tables, SAS deletes the data in the rows but retains the space in the table.

La proc SQL ne libère pas l'espace dans la table après suppression.
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/03/2011, 14h33   #8
Membre habitué
 
Femme Géraldine CADE DESCHAMPS
Support Clients SAS (France et Europe)
Inscription : février 2010
Messages : 62
Détails du profil
Informations personnelles :
Nom : Femme Géraldine CADE DESCHAMPS
Localisation : France

Informations professionnelles :
Activité : Support Clients SAS (France et Europe)
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 62
Points : 139
Points : 139
Bonjour,

C'est en effet le fonctionnement normal et documenté de l'instruction DELETE.

Pour que les suppressions logiques soient appliquées physiquement, il y a 2 solutions :
- relire en étape DATA :
data MaTable ; set MaTable ;
- ou bien trier la table
proc sort data=MaTable.

Géraldine Cade-Deschamps
Géraldine_Cade_SAS est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 16h23   #9
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour.
J'ajouterai une 3e solution à la liste de Géraldine : la proc Copy.
En effet, comme je viens de le lire dans une doc (ce qui m'a fait repenser à cette discussion) :
Citation:
In the world of PROC COPY, a true copy of a data set means exactly that — take this data set in this library and create a new
data set in another library that contains exactly the same attributes and observations. Exactly the same observations are in the
output data set with one slight difference: all the deleted observations are removed and not copied to the output data set.
Mais malheureusement la proc Copy ne peut copier qu'une table de même nom d'une bibliothèque à une autre ; et on ne peut pas truander en indiquant sous deux noms logiques (librefs) différents le même emplacement physique.

Alors continuons le même article et glissons à la proc APPEND : là on tient quelque chose qui fonctionne.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DATA t;
do i=1 TO 1000000;
    k=i;
    ou1="sdfqsdfsqdfsdf";
    ou2="sdfqsdfsqdfsdf";
    ou3="sdfqsdfsqdfsdf";
    ou4="sdfqsdfsqdfsdf";
    ou5="sdfqsdfsqdfsdf";
    output;
end;
run;
proc sql;
DELETE FROM t
WHERE k > 10000;
quit;
PROC APPEND DATA=work.t BASE=work.t2 FORCE ;
RUN ;
On obtient une copie rétrécie de la table. Certes c'est une copie, mais il n'est pas coûteux en temps de virer l'existant et de renommer la copie (un tour de magie classique) :
Code :
1
2
3
4
PROC DATASETS LIB=work NOLIST ;
  DELETE t ;
  CHANGE t2=t ;
RUN ; QUIT ;
Est-ce qu'au final on ira plus vite qu'en faisant une étape DATA ? il faudra bien sûr tester sur les vraies données.
A tester.

Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/04/2011, 18h10   #10
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
si tu enleves des lignes tu dois egalement en ajouter de temps en temps non?

tu peux mettre REUSE=YES sur la table et voir ce qui ce passe coté taille de fichier.

cela devrait marcher meme pour du SHARE
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 14h27   #11
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
Oui cela fonctionne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
proc sql;
   CREATE TABLE UTPE.TESTLOAD(compress=yes reuse=yes)
   (i num
   ,a char(20)
   )
   ;
 
quit;
 
Ajout de 100 000 observations, taille : 3 219 456
 
DELETE de 100 000 observations, taille : 3 219 456
 
Ajout de 100 000 observations, taille : 3 260 416
xav
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h19.


 
 
 
 
Partenaires

Hébergement Web