BookmarkSubscribeRSS Feed
EyalGonen
Lapis Lazuli | Level 10

צורך בסיסי ונפוץ הוא לחבר קובץ SAS קטן (נניח שמקורו מאקסל) לטבלת בסיס נתונים גדולה על מנת לסנן את הטבלה הגדולה רק לרשימת הערכים מקובץ ה SAS.

 

האינסטינקט הטבעי הוא ליישם זאת באמצעות SQL Join וזה אכן עובד תקין אלא שזה עובד מאד לאאאאאאטטטטט. מדוע? משום שיש כאן שילוב של טבלאות משני מקורות שונים (קובץ SAS וטבלת בסיס נתונים) אז במקרה הנ"ל כל הטבלה מבסיס הנתונים תורד מקומית לשרת ה SAS וה JOIN יבוצע בשרת ה SAS. ככל שהטבלה בבסי הנתונים גדולה יותר כך הביצועים יהיו גרועים יותר.

 

מה אפשר לעשות? שתי אפשרויות:

אפשרות ראשונה וכנראה הקלה ביותר היא להשתמש באופציה MULTI_DATASRC_OPT=in_clause בפקודת ה libname לבסיס הנתונים. אופציה זו תתרגם את ה JOIN לפקודת IN שכוללת את רשימת הערכים מהקובץ הקטן וזה כבר יעבוד מאד מהר

אפשרות נוספת היא "לתכנת" את האופציה הראשונה בעצמנו בקוד SAS. ראו דוגמה להלן עבור שדה אלפאנומרי (מחרוזת). עבור שדה נומרי ראו דוגמה בהמשך.

 

proc sql noprint;
	select distinct name into :names separated by "','"
	from sashelp.class
	;
quit;

proc sql;
	select *
	from dblib.big_table
	where name in (%unquote(%str(%')%suprerq(names)%str(%')));
quit;

 

proc sql noprint;
	select distinct age into :ages separated by " "
	from sashelp.class
	;
quit;

proc sql;
	select *
	from dblib.big_table
	where age in (&ages);
quit;