2009-04-29 11 views
12

में एक तालिका छोड़ना एसएएस में एक टेबल ड्रॉप करने के लिए सबसे कुशल तरीका क्या है?एसएएस

मेरे पास एक ऐसा प्रोग्राम है जो बड़ी संख्या में तालिकाओं को छोड़ देता है और छोड़ देता है, और यह जानना चाहेगा कि प्रोक एसक्यूएल के बीच प्रदर्शन अंतर है या नहीं; और प्रोसी डेटा; एक समय में एक ही टेबल छोड़ने के लिए ..

या यदि कोई और तरीका है ???

+1

साथ शुरू होता है को नष्ट करेगा आप * सकता है * बस भौतिक एसएएस तालिका हटा दें एक ऑपरेटिंग सिस्टम कॉल के साथ फाइलें (और इंडेक्स)। मुझे नहीं पता कि यह कैसे करता है, लेकिन मुझे उम्मीद है कि एक कच्ची फाइल सिस्टम-डिलीट सबसे तेज़ है। –

उत्तर

13

यदि ओएस को आउटसोर्स करना उचित है, तो यह सबसे तेज़ हो सकता है। अन्यथा, मेरे अवैज्ञानिक अवलोकनों का सुझाव है कि proc sql में ड्रॉप तालिका सबसे तेज़ है। यह मुझे आश्चर्यचकित करता है क्योंकि मुझे उम्मीद है कि proc datasets सबसे तेज़ होगा।

नीचे दिए गए कोड में, मैं 4000 डमी डेटा सेट बना देता हूं और फिर उन्हें विभिन्न विधियों के साथ हटाने का प्रयास करता हूं। पहला एसक्यूएल के साथ है और फाइलों को हटाने के लिए मेरे सिस्टम पर लगभग 11 सेकंड लग गए।

अगले दो दोनों proc datasets का उपयोग करते हैं। पहला प्रत्येक डेटा सेट के लिए एक डिलीट स्टेटमेंट बनाता है और फिर हटा देता है। दूसरा कार्य निर्देशिका में सब कुछ हटाने के लिए बस एक कंबल मार कमांड जारी करता है। (मैंने इस तकनीक को सबसे तेज़ होने की उम्मीद की थी)। दोनों प्रोसेट डेटासेट्स में सभी 4000 फ़ाइलों को हटाने के लिए लगभग 20 सेकंड की सूचना दी गई है।

%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; 
+0

ओएस को आउटसोर्स करने का आपका मतलब कैसा है? क्या आप एक्स कमांड के माध्यम से मतलब है? –

+3

युप - और यह तेज़ दिखाई देता है, खासकर अगर आप पूरी निर्देशिका को मिटा रहे हैं। उदाहरण के लिए - यह सभी sas डेटासेट को x कमांड का उपयोग कर कार्य निर्देशिका हटा देता है: % मैक्रो ओएसडेल; विकल्प noxwait; % पी =% sysfunc दें (पथनाम (कार्य, एल)); एक्स डेल "और पी। \ Temp * .sas7bdat"; % mend; % osdel; – cmjohns

+0

मेरी पिछली टिप्पणी को सही करने के लिए - मेरा कहना था कि यह "temp" से शुरू होने वाले कार्य फ़ोल्डर में सभी सास डेटा सेट हटा देता है (क्योंकि वह उपसर्ग था जिसका मैंने अपने परीक्षण में मेरे परीक्षण में उपयोग किया था)। – cmjohns

2

हम टेबल या डेटासेट पर चर्चा कर रहे हैं?

टेबल्स डेटाबेस टेबल का तात्पर्य है। इन्हें तेजी से छुटकारा पाने के लिए, एसक्यूएल पास-थ्रू सुविधा का उपयोग करना सबसे तेज़ होगा। विशेष रूप से यदि आप डेटाबेस से कनेक्ट हो सकते हैं और सभी तालिकाओं को छोड़ सकते हैं, तो डिस्कनेक्ट करें।

यदि हम एसएएस में डेटासेट पर चर्चा कर रहे हैं, तो मैं तर्क दूंगा कि दोनों proc sql और proc डेटासेट बेहद समान हैं। एक आवेदन दृष्टिकोण से, वे दोनों एक सिस्टम कमांड बनाने के लिए एक ही कटौती के माध्यम से जाते हैं जो फ़ाइल को हटा देता है। मैंने एसएएस उपयोगकर्ता समूहों या प्रस्तुतियों से देखा है कि सभी परीक्षणों ने हमेशा सुझाव दिया है कि दूसरे पर एक विधि का उपयोग मामूली है और कई चर के आधार पर है।

यदि यह आवश्यक है कि आपके पास डेटासेट/टेबल ड्रॉप करने का सबसे तेज़ तरीका है, तो आपको बस इसका परीक्षण करना होगा। एसएएस का प्रत्येक इंस्टॉलेशन और सेटअप वारंट परीक्षण के लिए काफी अलग है।

+0

सहमत - मुझे बस आश्चर्य हुआ कि क्या एक विधि पूरी तरह से तेज थी ... –

4

मैंने ओएस-डिलीट दृष्टिकोण के साथ परेशान करने की कोशिश की।

एक्स-कमांड के साथ हटाने की अनुशंसा नहीं की जा सकती है। यह हमेशा के लिए लिया!

मैं तो एक 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; 

आप देख सकते हैं, मैं 9 अलग हटाने आदेशों में मेरी हटाए विभाजित करने के लिए किया था। कारण यह है कि, मैं वाइल्डकार्ड का उपयोग कर रहा हूं, "*", और अंतर्निहित ऑपरेटिंग सिस्टम (एईक्स) इन्हें एक सूची में फैलाता है, जो उसके बाद इसे संभालने के लिए बहुत बड़ा हो जाता है ...

कार्यक्रम मूल रूप से एक डिलीट बनाता है प्रत्येक 9 फाइल समूह "temp [1-9] *। sas7 *" के लिए कमांड और कमांड जारी करता है।

4000 डेटा टेबल बनाने के लिए cmjohns उत्तर से मैक्रो फ़ंक्शन बनाने का उपयोग करके, मैं इस दृष्टिकोण का उपयोग करके केवल 5 सेकंड में उन्हें हटा सकता हूं।

तो एक प्रत्यक्ष ऑपरेटिंग सिस्टम हटाएं, जैसा कि मैंने अपेक्षा की थी, बड़े पैमाने पर हटाने का सबसे तेज़ तरीका है।

2

मामले जिनमें से है तेजी से, बहुत बड़े डेटा को छोड़कर में, मैं दांव लगाना होगा उन दोनों के बीच थोड़ा अंतर नहीं है। जब स्थायी एसएएस डेटासेट से निपटने, हालांकि, मैं नहीं बल्कि PROC एसक्यूएल से PROC डेटासेट का उपयोग करना चाहते हैं, क्योंकि मैं बेहतर एसएएस से डिजाइन पद्धति का उपयोग करके स्थायी डेटासेट

2

अस्थायी तालिकाओं के लिए सरल समाधान से छेड़छाड़ महसूस, और नहीं एसक्यूएल कार्यान्वयन कि इसी नाम कर रहे हैं:

यदि आपका टेबल के सभी एक ही उपसर्ग के साथ शुरू करते हैं, उदाहरण के p1_table1 और p1_table2 के लिए, उसके बाद निम्न कोड किसी भी तालिका के साथ p1

proc datasets; delete p1: ; run;

संबंधित मुद्दे