BookmarkSubscribeRSS Feed
Hagay
SAS Employee

ב -  SAS יש מספר דרכים להעשיר טבלה ראשית עם נתונים מטבלאות נוספות, לרוב קטנות יותר. הדרך הברורה ביותר היא, כמובן, שאילתת SQL בעזרתה ניתן לחבר מספר טבלאות לפי שדה משותף אחד או יותר. אפשרות נוספת היא בעזרת פורמטים שדיברנו עליהם רבות בעבר המאפשרים לבצע את אותה משימה ע"י הפיכת הטבלאות הקטנות לפורמטים (זוכרים, cntlin) והפעלה של הפורמטים על השדות המקשרים בטבלה הראשית.

 

אפשרות שלישית היא בעזרת מנגנון מיוחד בשם hash object אשר ע"י תחביר מוזר במקצת מאפשר לנו לקשר ביעילות בין טבלה ראשית לטבלת פענוח (אחת או יותר, לרוב קטנות יותר מהטבלה הראשית). היתרון במנגנון הזה הוא הביצועים, במיוחד בהשוואה לשאילתות SQL.

 

לדוגמא, תהליך שנתקלתי בו אצל לקוח כלל מספר join-ים של SQL בין טבלאות קטנות לטבלה ראשית אחת עם כ – 50 שדות (חלקם ארוכים) ומספר מיליוני רשומות. זמן הריצה של התהליך בשיטה זו היה כ - 5 שעות. לאחר כתיבה מחדש שלו כך שיעשה שימוש ב – hash object  במקום ב – join-ים זמן הריצה של התהליך צומצם לכ – 30 דקות.

 

דוגמא פשוטה להמחשה. נניח שיש לנו טבלה גדולה (CARS) וטבלה קטנה יותר (TYPE_HEB) שאנחנו רוצים לחבר ביחד:

data TYPE_HEB;
	length 
		Type	$8
		Type_Heb	$10;
	input type type_heb;
datalines;
Hybrid הברידי
SUV כאילו-שטח
Sedan ליסינג
Sports מיותר
Truck טנדר
Wagon סטיישן
;
run;

data CARS_HEB(drop=rc);
	set SASHELP.CARS;
	length 
		Type_Heb	$10; * We need to define our new column on the main dataset;
	
	if _n_=1 then do; * We only need to declare the hash once;
		declare hash h(dataset: "TYPE_HEB"); * Reading the data from our decoding dataset;
   		rc = h.defineKey('Type'); * The name of common field;
   		rc = h.defineData('Type_Heb'); * The name of the column we want to bring into our main dataset;
   		rc = h.defineDone(); * Telling SAS we finish the hash object definition;
		call missing(type_heb); * Avoiding a nasty NOTE in the log;
	end;

	rc=h.find(); * For each row in the main dataset we try to find a matching row in the decoding dataset;
run;

חגי

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

Discussion stats
  • 0 replies
  • 374 views
  • 1 like
  • 1 in conversation