Frage

Was ist die effizient Art und Weise einen Tisch in SAS fallen?

Ich habe ein Programm, das eine große Anzahl von Tabellen Loops und fällt, und würde gerne wissen, ob es ein Unterschied in der Leistung zwischen PROC SQL ist; und DATENSÄTZE PROC; für eine einzelne Tabelle zu einem Zeitpunkt fallen ..

Oder wenn es eine andere Art und Weise vielleicht ???

War es hilfreich?

Lösung

Wenn es angemessen ist, um das Betriebssystem auszulagern, die vielleicht schnellste sein. Ansonsten scheinen meine unwissenschaftlich Beobachtungen, dass die Drop-Tabelle zu deuten darauf hin, in proc sql schnellsten ist. Das überraschte mich, wie ich proc datasets erwartet schnellste zu sein.

In dem folgenden Code erstellen I 4000 Dummy-Datensätze dann versuchen, sie alle mit verschiedenen Methoden zu löschen. Die erste ist mit SQL und auf meinem System dauerte etwa 11 Sekunden, um die Dateien zu löschen.

Die nächsten beiden arbeiten beide proc datasets. Der erste erstellt eine DELETE-Anweisung für jeden Datensatz und dann löscht. Die zweite gibt nur eine Decke Kill-Befehl alles im Arbeitsverzeichnis zu löschen. (Hatte ich diese Technik erwartet, dass die schnellsten zu sein). Beide proc Datensätze Routinen berichtet etwa 20 Sekunden, um alle 4000 Dateien zu löschen.

%macro create;
proc printto log='null';run;
%do i=1 %to 4000;
data temp&i;
x=1;
y="dummy";
output;run;
%end;
proc printto;run;
%mend;

%macro delsql;
proc sql;
%do i=1 %to 4000;
drop table temp&i;
%end;
quit;
%mend;

%macro deldata1;
proc datasets library=work nolist;
   %do i=1 %to 4000;
   delete temp&i.;
   %end;
run;quit;
%mend;

%macro deldata2;
proc datasets library=work kill;
run;quit;
%mend;

option fullstimer;
%create;
%delsql;

%create;
%deldata1;

%create;
%deldata2;

Andere Tipps

Ich habe versucht, mit dem OS-Lösch-Ansatz zur Geige.

mit dem X-Befehl Löschen kann nicht empfohlen werden. Es dauerte immer

Ich habe dann versucht, mit dem Systemkommando in einem datastep:

%macro delos;
data _null_;
do i=1 to 9;
delcmd="rm -f "!!trim(left(pathname("WORK","L")))!!"/temp"!!trim(left(put(i,4.)))!!"*.sas7*";
rc=system(delcmd);
end;
run;
%mend;

Wie man sehen kann, hatte ich meine Löschungen in 9 separate Löschbefehle zu teilen. Der Grund dafür ist, ich bin mit Platzhalter „*“ und das zugrunde liegende Betriebssystem (AIX) erweitert diese zu einer Liste, die auch wird dann groß für sie zu handhaben ...

Das Programm baut grundsätzlich einen Löschbefehl für jede der neun Dateigruppen „temp [1-9] *. SAS7 *“ und gibt den Befehl.

Mit der Makro-Funktion erstellen, die von cmjohns beantworten 4000 Datentabellen zu erstellen, I, in nur 5 Sekunden mit diesem Ansatz löschen.

So ein direktes Betriebssystem löschen ist der schnellste Weg zur Massen löschen, wie ich erwartet habe.

Wir diskutieren Tabellen oder Datensätze?

Tabellen bedeuten, Datenbanktabellen. Um loszuwerden, diese in einem schnellen Weg, proc SQL Pass-Through-Anlage unter Verwendung würde die schnellste sein. Insbesondere, wenn Sie einmal in die Datenbank verbinden und alle Tabellen fallen, dann trennen.

Wenn wir Datensätze in SAS diskutieren, würde ich argumentieren, dass beide proc sql und proc Datensätze extrem ähnlich sind. Aus anwendungstechnischer Sicht, gehen sie beide durch den gleichen Abzug einen Systembefehl zu erstellen, die eine Datei löscht. Alle Tests Ich habe von SAS Benutzergruppen oder Präsentationen gesehen haben immer vorgeschlagen, dass die Verwendung eines Verfahrens über den anderen marginal ist und auf der Grundlage von vielen Variablen ab.

Wenn es zwingend notwendig, dass Sie die absolute schnellste Weg, haben die Datensätze / Tabellen zu löschen, können Sie nur testen müssen. Jede Installation und Konfiguration von SAS ist unterschiedlich genug Tests zu rechtfertigen.

In Bezug auf der schnellen, ohne extrem große Daten, ich mag wetten, dass es wenig Unterschied zwischen ihnen. Wenn permanente SAS Datensätze Handhabung jedoch, wie ich PROC DATENSÄTZE zu verwenden, anstatt PROC SQL, einfach, weil ich besser Manipulieren permanente Datensätze mit der SAS-entworfen Methode fühle und nicht die SQL-Implementierung

Einfache Lösung für temporäre Tabellen, die in ähnlicher Weise benannt sind:

Wenn alle Ihre Tabellen mit demselben Präfix beginnen, zum Beispiel p1_table1 und p1_table2, dann wird der folgende Code wird jede Tabelle löschen mit, dass mit p1 beginnt

proc datasets; delete p1: ; run;

proc löschen ist eine weitere, wenn auch nicht dokumentiert, Lösung ..

http://www.sascommunity.org/wiki/PROC_Delete

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top