PracticU

טבלת SSIS - Lineage

בלי כתוביותעם כתוביות
PracticU › קורס SSIS › טבלת SSIS - Lineage
מילון מושגים:
SSIS - רכיב של SQL Server לבניית תהליכי ETL להעברה ולעיבוד של נתונים בין מקורות.
ETL - תהליך של חילוץ נתונים ממקורות, עיבודם והטענתם ליעד כמו מחסן נתונים (Extract, Transform, Load).
Join - פעולת SQL שמשלבת שורות משתי טבלאות או יותר על בסיס קשר ביניהן.
מפתח ראשי - עמודה או צירוף עמודות שמזהים באופן ייחודי כל שורה בטבלת מסד נתונים.
לוג - רישום מתועד של אירועים ופעולות שמתרחשים במערכת או בתוכנה, המשמש למעקב ולאיתור תקלות.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
רשומה - שורה בטבלת מסד נתונים שמרכזת את כל השדות של פריט אחד, למשל כל הפרטים של לקוח יחיד.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.

טבלת SSIS - Lineage
תהליך ETL שרץ מדי פעם מול דאטאבייס תפעולי צריך לדעת איזה נתונים השתנו מאז הריצה הקודמת. כאן מציגים טבלת Lineage, שמתעדת את זמן הריצה האחרון של כל טבלה, ובעזרתה שולפים רק את השינויים מטבלאות Temporal.
הרעיון
1. הבעיה: בטבלה רגילה ה-ETL רואה רק את המצב האחרון, כי שינויים קודמים נדרסו. בטבלת Temporal אפשר לראות גם היסטוריה, באמצעות JOIN עם טבלת ההיסטוריה או FOR SYSTEM_TIME ALL, אבל שליפת כל ההיסטוריה בכל ריצה מיותרת, כי חלק מהנתונים כבר הועברו לדאטה וויירהאוס.
2. טבלת Lineage: טבלה פשוטה עם LineageKey (identity ומפתח ראשי), TableName (varchar 128) ו-LastCutoffTime. היא משמשת לוג של הרצות ה-ETL.
3. דוגמה מהשטח: בדאטאבייס הדוגמה של מיקרוסופט, Worldwide Importers, יש טבלה מסוג Integration ETL Cutoff, ואצלם נשמרים גם תחילת התהליך וסופו. הדובר בוחר שתי עמודות בלבד.
4. בתחילת כל ETL: שולפים את LastCutoffTime האחרון של הטבלה, ואז מביאים רק רשומות עם StartDate גדול מהמועד הזה. את הרשומות הנוכחיות אפשר לשלוף מטבלת Products, ואת ההיסטוריות מטבלת ההיסטוריה, בשאילתת UNION עם תנאי WHERE.
5. בסוף כל ETL: מוסיפים שורה לטבלת Lineage עם שם הטבלה ו-SYSDATETIME של הריצה, כדי שהריצה הבאה תדע מאיפה להמשיך.
מה ההבדל בין סוגי השליפה
1. AS OF: נקודת זמן אחת.
2. FROM ... TO: בלי גבולות הטווח.
3. BETWEEN: עם גבולות.
4. CONTAINED IN: רק רשומות שכל התוקף שלהן בטווח.
הדובר מעדיף שאילתה מפורשת עם WHERE StartDate > על פני הפסוקית של FOR SYSTEM_TIME, כי ככה שולפים בדיוק מה שהשתנה מאז הריצה האחרונה.
שימו לב
1. טבלת היסטוריה לא מראה מה השתנה בין שורה לשורה, ולכן צריך להשוות בין השורות של אותו ProductID.
2. ללא טבלת Lineage אי אפשר לדעת מה כבר נגזר, ולכן מתעדים כל ריצה.
בסוף השיעור אפשר לתכנן ETL אינקרמנטלי: לקרוא את זמן החיתוך האחרון, לשלוף רק את מה שהשתנה, ולעדכן את הלוג.
השיעור הבא בקורס: Mirror & Staging

פרקי ההרצאה: טבלת SSIS - Lineage

  1. 00:00

    חזרה על Temporal Table

  2. 00:57

    שליפת היסטוריה עם join

  3. 02:25

    שינויים לאורך ציר הזמן

  4. 03:18

    גזירת נתונים בתהליך ETL

  5. 04:14

    תמונת מצב אחרונה בטבלה רגילה

  6. 04:50

    שליפה היסטורית מטבלאות Temporal

  7. 05:28

    שינויים מאז ריצת ה-ETL האחרונה

  8. 06:05

    מנגנון טבלת Lineage

תמלול ההרצאה: טבלת SSIS - Lineage

הטקסט המלא של הדקות הראשונות בהרצאה «טבלת SSIS - Lineage» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    בשיעור הקודם ראינו את המנגנון שנקרא Temporal Table. Temporal Table משמעותו היכולת שלנו בעצם לשמור נתונים שמתפלגים בעצם לשתי טבלאות, כאשר טבלה אחת שומרת לנו את ה-current, ואילו טבלה נוספת מקבילה לה, ואותו מבנה, שומרת לנו את כל הנתונים ההיסטוריים.

  2. 00:25

    ג'וין בין שני הטבלאות הללו או שליפה נכונה יכולה להביא לנו בעצם מידע שיציג לנו את כל הנתונים לאורך התפלגות ההיסטוריה כולה.

  3. 00:37

    בדוגמה שבה ראינו, אם נשלוף כאן מתוך טבלת Select All מטבלת Products, נקבל את כל הנתונים הנכונים והאחרונים שיש לנו כרגע בתוך הטבלה המעודכנים ביותר עם התאריך Updated הנכון ביותר.

  4. 00:54

    Product ID, Unit Price ו-Product Name. אבל אם נרצה להביא גם את הנתונים ההיסטוריים, אז אני אוכל לשלוף את אותה שאילתא ולעשות join יחד עם הטבלת ההיסטוריה של ה-product history.

  5. 01:09

    שתי הטבלאות הללו ביחד נותנות לי מענה על מנת לדעת, אם אני רוצה גם לראות את זה כאן, אז נמיין לפי השדה הראשון, אז נותנות לי בעצם מענה היסטורי מלא עבור כל ההשתנות במהלך השנים.

  6. 01:24

    ב-product ID מספר 1 אנחנו יכולים לראות שהשם השתנה במהלך הזמנים. אני אמיין כאן לפי העמודה של הproduct ID כדי לקבל את אותו product ID מספר 1 ביחד ואחרי זה למיין לפי ה-start date שהמיקום שלו זה מספר 4, אז אני אוכל בעצם לשלוף את כל הנתונים ככה שהם מסודרים לי בצורה

  7. 01:44

    היסטורית כיצד הם השתנו במהלך השנים כל אחת מהרשומות הרלוונטיות לאותם שנים. אני לא מקבל חיווי מה השתנה.

  8. 01:55

    כדי לדעת מה השתנה אני צריך להצליב בין שתי השורות, כלומר, כדי לדעת מה השתנה בין כאן לכאן, אז אני צריך להצליב ביניהם ולראות שמה שהשתנה כאן זה אותו Product ID.

  9. 02:06

    אבל אין ספק, כל צורה שהשתנתה לנו במהלך הזמן מקבלת חיווי בצורה של שורה נוספת בתוך הדאטאבס. השאלה שלי היא, כשאנחנו באים לגזור את הנתונים, לבצע תהליך ETL של גזירת נתונים לתוך ה-Data Warehouse, אנחנו נדרשים לדעת אילו רשומות אנחנו רוצים לגזור.

  10. 02:30

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

  11. 02:45

    מתבצעים עדכונים, מתבצעים מחיקות, מתבצעים הוספות של עמודות נוספות וכו' וכו'. כל פעם יש לנו בעצם אוסף של שינויים שקורים בתוך הדאטאבס, כשאנחנו בעצם מדברים כאן על בסיס נתונים תפעולי, על דאטאבס אופרשיונל, OP, דאטאבס שהוא חי, נושם, יש בו בעצם

  12. 03:10

    שינויים דחופים של טרנזקציות, אנשים מתקשרים, עורכים פרטים, משנים נתונים בתוך הדאטאבס. לאורך הזמן יש שינויים. מדי פעם, ובצורה בלתי תלויה, צורה שאיננה מקושרת לקצב השינויים, קורא תהליך ETL. מתבצעים גזירה של הנתונים תהליך ETL שבו הוא גוזר את הנתונים ומעביר אותם לתוך הדאטה וייראוס.

  13. 03:37

    גוזר את הנתונים ומעביר אותם לתוך הדאטה וייראוס. גזירת הנתונים עצמם שופכת אותנו לתוך משפך שהמנגנון שלו כאן נקרא Slowly Change Dimension כפי שראינו, שהוא יודע להסתכל על הנתונים עצמם ולהחליט מה מהם הוא מעביר וכיצד הוא דורס את הנתונים או שומר היסטוריה בתוך הדאטה ווירהאוס.

  14. 04:03

    השאלה שעליה אנחנו רוצים לעמוד כרגע זה כאשר מתבצעת הגזירה של הנתונים כאן במקומות הללו, אילו נתונים אנחנו רואים בעת הגזירה. אם יש לנו טבלאות רגילות, אז אנחנו רואים רק את הנתונים האחרונים.

  15. 04:17

    אז בתהליך ה-ETL הגזירה הזה כאן שלפנינו, הנתונים שאני רואה זה את הנתונים האחרונים שהשתנו. אין לי שום אפשרות לראות את הנתונים הללו ולא את הנתונים הללו ולא את הנתונים הללו מאחר והם כבר נדרסו במהלך השינויים.

  16. 04:36

    אני רואה את תמונת המצב האחרונה שקיימת בתוך הדאטאבס. זה מה שרואה ה-ETL. אולם אם נעבוד בדאטאבס שהטבלאות שבו הם טמפורל טייבל, תהיה לנו אפשרות כשאנחנו גוזרים את הנתונים גם ללכת ולתשאל בצורה היסטורית אחורה כדי לקבל את כל המידע שלנו.

  17. 04:58

    כשאני הגעתי לכאן ותשאלתי עכשיו את הנתונים של טבלת פרודקט, יכולתי ללכת ולראות מה המצב הנוכחי העדכני ביותר last updated, אבל יכולתי גם ללכת ולראות מהם הנתונים אחורה אם אני עושה join יחד עם טבלת ההיסטוריה, או שאני כותב ומשתמש בפסוקית שהיא יותר טבעית לשליפת נתונים מתוך

  18. 05:20

    טמפורל טייבל שהיא נקראת for system time all לקחת נתונים אבל שהזמן שלהם הוא לאורך כל ההיסטוריה כולה בעצם גוזרים לי את כל הנתונים ההיסטוריים האם זה מה שאנחנו רוצים כשאנחנו עובדים בתהליך ה-ETL?

  19. 05:38

    לא בטוח שאנחנו רוצים את הכל אנחנו רוצים בעצם את כל הנתונים שהשתנו רק בטווח הזה החל מה-ETL האחרון ממועד ריצת ה-ETL האחרון אנחנו רוצים לקבל את הזמן הזה, מתי רץ ה-ETL האחרון, ובכל פעם שאנחנו רצים, אנחנו רוצים לשלוף את כל הנתונים החל ממועד של אותו זמן.

  20. 06:02

    כיצד אנחנו מממשים זאת? הדרך לממש זאת, על ידי זה שאנחנו יוצרים טבלה, זה מנגנון שנקרא לינדג'. אנחנו באמת יוצרים טבלה.

  21. 06:12

    על פי רוב הטבלה הזאת תיקרא באמת לינדג', טבלה שמייצגת לנו איזושהי שושלת, איזושהי היסטוריה של ההשתנות של הערכים עצמם.

  22. 06:22

    בתוך הטבלה הזאת יש לנו באמת את ה-Linage Key, שהוא מסוג של ה-Identity והוא ה-Primary Key. הוא בעצם שומר לנו, בעצם מזהה חד-ערכי של אותה רשומה.

  23. 06:35

    ובטבלת לינאג' כל מה שאנחנו רוצים לשמור זה בעצם את שם הטבלה,

לקורס המלא: קורס SSIS אונליין

ההרצאה הקודמת: טבלת Temporal

ההרצאה הבאה: Mirror & Staging

הרצאות קשורות מקורסים אחרים

  • בדיקות טבלת החלטה
  • יצירת טבלת בסיס ב-SQL

קורסים נוספים במסלול

  • קורס DBA אפליקטיבי - שפת SQL למתחילים
  • קורס NoSQL - MongoDB
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI