سؤال

ما هو أكثر فعال طريقة لإسقاط جدول في SAS؟

لدي برنامج يقوم بتكرار وإسقاط عدد كبير من الجداول، وأرغب في معرفة ما إذا كان هناك اختلاف في الأداء بين PROC SQL؛ومجموعات بيانات PROC؛لإسقاط جدول واحد في وقت واحد.

أو إذا كان هناك طريقة أخرى ربما؟؟؟

هل كانت مفيدة؟

المحلول

إذا فمن المعقول أن الاستعانة بمصادر خارجية لنظام التشغيل، والتي قد تكون أسرع. خلاف ذلك، يبدو أن ملاحظاتي غير علمية تشير إلى أن الجدول انخفاض في proc sql هو الأسرع. هذا فاجأني كما كنت أتوقع proc datasets أن تكون أسرع.

في التعليمات البرمجية أدناه، أنا خلق 4000 مجموعات البيانات وهمية ثم محاولة حذف كل منهم مع أساليب مختلفة. الأول هو مع مزود وعلى استغرق نظام بلدي حوالي 11 ثانية لحذف الملفات.

ووالمقبلين على حد سواء استخدام proc datasets. أول يخلق بيان الحذف لكل مجموعة البيانات ومن ثم حذف. والثاني يصدر مجرد أمر بطانية قتل لحذف كل شيء في دليل العمل. (I كان يتوقع هذه التقنية لتكون أسرع). كل من مجموعات البيانات بروك الروتينية ذكرت حوالي 20 ثانية لحذف جميع الملفات 4000.

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

نصائح أخرى

حاولت العبث بأسلوب حذف نظام التشغيل.

لا يمكن التوصية بالحذف باستخدام الأمر X.استغرق الأمر للأبد!

ثم حاولت بعد ذلك باستخدام أمر النظام في خطوة بيانات:

%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 أوامر حذف منفصلة.السبب هو أنني أستخدم أحرف البدل، "*"، ويقوم نظام التشغيل الأساسي (AIX) بتوسيعها إلى قائمة، والتي تصبح بعد ذلك كبيرة جدًا بحيث يتعذر التعامل معها...

يقوم البرنامج بشكل أساسي بإنشاء أمر حذف لكل مجموعة من مجموعات الملفات التسعة "temp[1-9]*.sas7*" ويصدر الأمر.

باستخدام وظيفة إنشاء الماكرو من إجابة cmjohns لإنشاء 4000 جدول بيانات، يمكنني حذفها في 5 ثوانٍ فقط باستخدام هذا الأسلوب.

لذا فإن الحذف المباشر لنظام التشغيل هو أسرع طريقة للحذف الجماعي، كما توقعت.

ونحن نناقش جداول أو قواعد البيانات؟

والجداول يعني جداول قاعدة البيانات. للتخلص من هذه بطريقة سريعة، وذلك باستخدام بروك SQL منشأة المار سيكون أسرع. على وجه التحديد ما اذا كان يمكنك الاتصال بقاعدة البيانات مرة واحدة وإسقاط كافة الجداول، ثم قطع الاتصال.

إذا نناقشه قواعد البيانات في SAS، وأنا أزعم أن كل من SQL بروك ومجموعات البيانات بروك مماثلة للغاية. من وجهة نظر الطلب، وكلاهما تذهب من خلال نفس الخصم لخلق أمر نظام يقوم بحذف ملف. جميع التجارب لقد رأيت من مجموعة مستخدمي SAS أو العروض واقترح دائما أن استخدام أسلوب واحد على الآخر هو هامشي وبناء على العديد من المتغيرات.

إذا لا بد من أن يكون لديك طريقة المطلقة أسرع لإسقاط قواعد البيانات / الجداول، قد يكون لديك فقط لاختباره. كل تثبيت والإعداد للSAS مختلفة بما يكفي لتبرير الاختبار.

في مجال الذي هو أسرع، باستثناء بيانات كبيرة للغاية، وأود أن الرهان أن هناك فارق كبير بينهما. عند التعامل مع قواعد البيانات SAS دائمة، ومع ذلك، أود أن استخدام قواعد البيانات PROC بدلا من PROC SQL، وذلك ببساطة لأنني أشعر مجموعات البيانات دائمة أفضل التلاعب باستخدام طريقة تصميم SAS، وليس تنفيذ SQL

والحل بسيط للجداول المؤقتة التي تتم تسمية بالمثل:

وإذا كان كل من الجداول الخاصة بك تبدأ مع نفس البادئة، على سبيل المثال p1_table1 وp1_table2، ثم التعليمة البرمجية التالية سيتم حذف أي جدول مع الذي يبدأ ب P1

وproc datasets; delete p1: ; run;

وحذف بروك هو آخر، وإن كان لا يحملون وثائق، والحل ..

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top