
JOIN עם טבלת ההיסטוריה או FOR SYSTEM_TIME ALL, אבל שליפת כל ההיסטוריה בכל ריצה מיותרת, כי חלק מהנתונים כבר הועברו לדאטה וויירהאוס.LineageKey (identity ומפתח ראשי), TableName (varchar 128) ו-LastCutoffTime. היא משמשת לוג של הרצות ה-ETL.LastCutoffTime האחרון של הטבלה, ואז מביאים רק רשומות עם StartDate גדול מהמועד הזה. את הרשומות הנוכחיות אפשר לשלוף מטבלת Products, ואת ההיסטוריות מטבלת ההיסטוריה, בשאילתת UNION עם תנאי WHERE.SYSDATETIME של הריצה, כדי שהריצה הבאה תדע מאיפה להמשיך.WHERE StartDate > על פני הפסוקית של FOR SYSTEM_TIME, כי ככה שולפים בדיוק מה שהשתנה מאז הריצה האחרונה.ProductID.הטקסט המלא של הדקות הראשונות בהרצאה «טבלת SSIS - Lineage» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בשיעור הקודם ראינו את המנגנון שנקרא Temporal Table. Temporal Table משמעותו היכולת שלנו בעצם לשמור נתונים שמתפלגים בעצם לשתי טבלאות, כאשר טבלה אחת שומרת לנו את ה-current, ואילו טבלה נוספת מקבילה לה, ואותו מבנה, שומרת לנו את כל הנתונים ההיסטוריים.
ג'וין בין שני הטבלאות הללו או שליפה נכונה יכולה להביא לנו בעצם מידע שיציג לנו את כל הנתונים לאורך התפלגות ההיסטוריה כולה.
בדוגמה שבה ראינו, אם נשלוף כאן מתוך טבלת Select All מטבלת Products, נקבל את כל הנתונים הנכונים והאחרונים שיש לנו כרגע בתוך הטבלה המעודכנים ביותר עם התאריך Updated הנכון ביותר.
Product ID, Unit Price ו-Product Name. אבל אם נרצה להביא גם את הנתונים ההיסטוריים, אז אני אוכל לשלוף את אותה שאילתא ולעשות join יחד עם הטבלת ההיסטוריה של ה-product history.
שתי הטבלאות הללו ביחד נותנות לי מענה על מנת לדעת, אם אני רוצה גם לראות את זה כאן, אז נמיין לפי השדה הראשון, אז נותנות לי בעצם מענה היסטורי מלא עבור כל ההשתנות במהלך השנים.
ב-product ID מספר 1 אנחנו יכולים לראות שהשם השתנה במהלך הזמנים. אני אמיין כאן לפי העמודה של הproduct ID כדי לקבל את אותו product ID מספר 1 ביחד ואחרי זה למיין לפי ה-start date שהמיקום שלו זה מספר 4, אז אני אוכל בעצם לשלוף את כל הנתונים ככה שהם מסודרים לי בצורה
היסטורית כיצד הם השתנו במהלך השנים כל אחת מהרשומות הרלוונטיות לאותם שנים. אני לא מקבל חיווי מה השתנה.
כדי לדעת מה השתנה אני צריך להצליב בין שתי השורות, כלומר, כדי לדעת מה השתנה בין כאן לכאן, אז אני צריך להצליב ביניהם ולראות שמה שהשתנה כאן זה אותו Product ID.
אבל אין ספק, כל צורה שהשתנתה לנו במהלך הזמן מקבלת חיווי בצורה של שורה נוספת בתוך הדאטאבס. השאלה שלי היא, כשאנחנו באים לגזור את הנתונים, לבצע תהליך ETL של גזירת נתונים לתוך ה-Data Warehouse, אנחנו נדרשים לדעת אילו רשומות אנחנו רוצים לגזור.
במקרה הזה נסתכל רגע על התפלגות של זמנים שקורית לנו בתוך הדאטאבס. נצייר לעצמנו איזשהו ציר של זמן. במהלך ציר של זמן הזה מדי פעם מתבצעים שינויים בתוך הדאטאבס.
מתבצעים עדכונים, מתבצעים מחיקות, מתבצעים הוספות של עמודות נוספות וכו' וכו'. כל פעם יש לנו בעצם אוסף של שינויים שקורים בתוך הדאטאבס, כשאנחנו בעצם מדברים כאן על בסיס נתונים תפעולי, על דאטאבס אופרשיונל, OP, דאטאבס שהוא חי, נושם, יש בו בעצם
שינויים דחופים של טרנזקציות, אנשים מתקשרים, עורכים פרטים, משנים נתונים בתוך הדאטאבס. לאורך הזמן יש שינויים. מדי פעם, ובצורה בלתי תלויה, צורה שאיננה מקושרת לקצב השינויים, קורא תהליך ETL. מתבצעים גזירה של הנתונים תהליך ETL שבו הוא גוזר את הנתונים ומעביר אותם לתוך הדאטה וייראוס.
גוזר את הנתונים ומעביר אותם לתוך הדאטה וייראוס. גזירת הנתונים עצמם שופכת אותנו לתוך משפך שהמנגנון שלו כאן נקרא Slowly Change Dimension כפי שראינו, שהוא יודע להסתכל על הנתונים עצמם ולהחליט מה מהם הוא מעביר וכיצד הוא דורס את הנתונים או שומר היסטוריה בתוך הדאטה ווירהאוס.
השאלה שעליה אנחנו רוצים לעמוד כרגע זה כאשר מתבצעת הגזירה של הנתונים כאן במקומות הללו, אילו נתונים אנחנו רואים בעת הגזירה. אם יש לנו טבלאות רגילות, אז אנחנו רואים רק את הנתונים האחרונים.
אז בתהליך ה-ETL הגזירה הזה כאן שלפנינו, הנתונים שאני רואה זה את הנתונים האחרונים שהשתנו. אין לי שום אפשרות לראות את הנתונים הללו ולא את הנתונים הללו ולא את הנתונים הללו מאחר והם כבר נדרסו במהלך השינויים.
אני רואה את תמונת המצב האחרונה שקיימת בתוך הדאטאבס. זה מה שרואה ה-ETL. אולם אם נעבוד בדאטאבס שהטבלאות שבו הם טמפורל טייבל, תהיה לנו אפשרות כשאנחנו גוזרים את הנתונים גם ללכת ולתשאל בצורה היסטורית אחורה כדי לקבל את כל המידע שלנו.
כשאני הגעתי לכאן ותשאלתי עכשיו את הנתונים של טבלת פרודקט, יכולתי ללכת ולראות מה המצב הנוכחי העדכני ביותר last updated, אבל יכולתי גם ללכת ולראות מהם הנתונים אחורה אם אני עושה join יחד עם טבלת ההיסטוריה, או שאני כותב ומשתמש בפסוקית שהיא יותר טבעית לשליפת נתונים מתוך
טמפורל טייבל שהיא נקראת for system time all לקחת נתונים אבל שהזמן שלהם הוא לאורך כל ההיסטוריה כולה בעצם גוזרים לי את כל הנתונים ההיסטוריים האם זה מה שאנחנו רוצים כשאנחנו עובדים בתהליך ה-ETL?
לא בטוח שאנחנו רוצים את הכל אנחנו רוצים בעצם את כל הנתונים שהשתנו רק בטווח הזה החל מה-ETL האחרון ממועד ריצת ה-ETL האחרון אנחנו רוצים לקבל את הזמן הזה, מתי רץ ה-ETL האחרון, ובכל פעם שאנחנו רצים, אנחנו רוצים לשלוף את כל הנתונים החל ממועד של אותו זמן.
כיצד אנחנו מממשים זאת? הדרך לממש זאת, על ידי זה שאנחנו יוצרים טבלה, זה מנגנון שנקרא לינדג'. אנחנו באמת יוצרים טבלה.
על פי רוב הטבלה הזאת תיקרא באמת לינדג', טבלה שמייצגת לנו איזושהי שושלת, איזושהי היסטוריה של ההשתנות של הערכים עצמם.
בתוך הטבלה הזאת יש לנו באמת את ה-Linage Key, שהוא מסוג של ה-Identity והוא ה-Primary Key. הוא בעצם שומר לנו, בעצם מזהה חד-ערכי של אותה רשומה.
ובטבלת לינאג' כל מה שאנחנו רוצים לשמור זה בעצם את שם הטבלה,