2015-04-13 7 views
5

Warum dauert es länger, bis SAS ein Dataset aus einer Datenschrittansicht erstellt, z. B. sashelp.vcolumn im Vergleich zur entsprechenden SQL-Tabelle dictionary.columns?Leistung von SASHELP-Ansichten im Vergleich zu SQL-Dictionary-Tabellen

Ich habe einen Test mit fullstimer gemacht und es scheint meinen Verdacht auf Leistungsunterschiede zu bestätigen.

option fullstimer; 

data test1; 
    set sashelp.vcolumn; 
    where libname = 'SASHELP' and 
     memname = 'CLASS' and 
     memtype = 'DATA'; 
run; 

proc sql; 
    create table test2 as 
    select * 
    from dictionary.columns 
    where libname = 'SASHELP' and 
     memname = 'CLASS' and 
     memtype = 'DATA'; 
quit; 

Ein Auszug aus dem Protokoll:

NOTE: There were 5 observations read from the data set SASHELP.VCOLUMN. 
     WHERE (libname='SASHELP') and (memname='CLASS') and (memtype='DATA'); 
NOTE: The data set WORK.TEST1 has 5 observations and 18 variables. 
NOTE: DATA statement used (Total process time): 
     real time   0.67 seconds 
     user cpu time  0.23 seconds 
     system cpu time  0.23 seconds 
     memory    3820.75k 
     OS Memory   24300.00k 
     Timestamp   04/13/2015 09:42:21 AM 
     Step Count      5 Switch Count 0 


NOTE: Table WORK.TEST2 created, with 5 rows and 18 columns. 
NOTE: PROCEDURE SQL used (Total process time): 
     real time   0.03 seconds 
     user cpu time  0.01 seconds 
     system cpu time  0.00 seconds 
     memory    3267.46k 
     OS Memory   24300.00k 
     Timestamp   04/13/2015 09:42:21 AM 
     Step Count      6 Switch Count 0 

Der verwendete Speicher ein wenig höher für SASHELP ist aber der Unterschied nicht sehr groß ist. Beachten Sie die Uhrzeit - es ist 22 mal länger mit Sashelp als mit dem SQL-Wörterbuch. Sicherlich kann es nicht nur an dem relativ geringen Unterschied in der Speichernutzung liegen.

Auf Vorschlag von @ Salva übermittelte ich den Code erneut in einer neuen SAS-Sitzung, dieses Mal den SQL-Schritt vor dem Datenschritt ausführen. Die Speicher und Zeitunterschiede sind sogar noch ausgeprägter:

   | sql  | sashelp 
----------------+-----------+----------- 
real time  | 0.28 sec | 1.84 sec 
user cpu time | 0.00 sec | 0.25 sec 
system cpu time | 0.00 sec | 0.24 sec 
memory   | 3164.78k | 4139.53k 
OS Memory  | 10456.00k | 13292.00k 
Step Count  | 1   | 2 
Switch Count | 0   | 0 
+0

Können Sie Ihre SAS-Sitzung zu schließen, wieder öffnen SAS-Datei, die Reihenfolge der Ausführung ändern (PROC SQL zuerst, dann Daten Schritt-Programm) und poste die Ergebnisse. (Ich weiß die Antwort nicht, aber es wird interessant sein zu sehen). – Salva

+0

@Salva: Bearbeitet. Danke für den Vorschlag. Die Ergebnisse sind in der Tat interessant. –

+0

Schöner Fund. Ich werde es selbst testen, da ich festgestellt habe, dass die Leistung von sashelp, wenn Sie eine große Anzahl von Tabellen/Spalten (Zehntausende) innerhalb Ihrer definierten Libnamen haben, tendenziell abnimmt. Könnte versuchen, sie progressiv hinzuzufügen und sie zeitlich zu steuern, um zu sehen, ob die Leistung des Wörterbuchs in irgendeiner Weise beeinflusst wird. Vielleicht ist der Wörterbuchansatz "schlauer" und beschränkt seine Untersuchungen auf genau die Dateien, von denen er weiß, dass sie gelesen werden müssen ... –

Antwort

3

Einige (wenn nicht alle) dieser ist der Unterschied in der Overhead zwischen SQL und Daten Schritt. Zum Beispiel:

proc sql; 
    create table test2 as 
    select * 
    from sashelp.vcolumn 
    where libname = 'SASHELP' and 
     memname = 'CLASS' and 
     memtype = 'DATA'; 
quit; 

Auch sehr schnell.

Die SAS page about Dictionary Tables gibt einige Informationen, die wahrscheinlich die wichtigste Erklärung ist.

Wenn eine Wörterbuchtabelle abfragt, startet SAS einen Erkennungsprozess , der Informationen sammelt, die an diesem Tisch relevant ist. Abhängig von der Dictionary-Tabelle, die abgefragt wird, kann dieser Discovery-Prozess Bibliotheken durchsuchen, Tabellen öffnen und Ansichten ausführen. Im Gegensatz zu anderen SAS Prozeduren und dem DATA-Schritt kann PROC SQL diesen Prozess um optimieren, indem die Abfrage optimiert wird, bevor der Erkennungsprozess gestartet wird. Daher ist es zwar möglich, mit den SAS-Prozeduren oder dem DATA-Schritt unter Verwendung der SASHELP-Ansichten auf die DICTIONARY-Tabelle zuzugreifen, es ist jedoch oft effizienter, stattdessen PROC SQL zu verwenden.

+0

Danke, Joe. Ich habe versucht, nach Informationen zu suchen, wie SAS die SASHELP-Ansichten zum Vergleich erstellt, aber ich kam zu kurz. Wenn Sie irgendwann darüber hinweg kommen, würde ich es lieben, wenn Sie es zu Ihrer Antwort hinzufügen könnten. Aber in der Zwischenzeit +1 und akzeptiert. –

0

Meiner Erfahrung nach ist die Verwendung der sshelp-Ansichten langsamer als die Verwendung von proc-Datasets. Dies ist um so mehr, wenn Sie eine Menge von Bibliotheken zugewiesen haben, vor allem Externen:

10 proc datasets lib=sashelp noprint; 
11  contents data=class out=work.test2; 
12 quit; 

NOTE: The data set WORK.TEST2 has 5 observations and 40 variables. 
NOTE: PROCEDURE DATASETS used (Total process time): 
     real time   0.01 seconds 
     user cpu time  0.00 seconds 
     system cpu time  0.01 seconds 
     memory    635.12k 
     OS Memory   9404.00k 
     Timestamp   14.04.2015 kl 10.22 
Verwandte Themen