none
עדכון שינויים ל-DATA WAREHOUSE RRS feed

  • שאלה

  • היי.

    אני רוצה לממש DATA WAREHOUSE שיעודכן לפי שינויים מ-DB המקור.

    כלומר - אני לא רוצה להעביר את כל ה-DATA בכל תהליך העברה, אלא רק את השינויים מההעברה הקודמת. ואני רוצה שכל שינוי יועבר יחסית בצורה מיידית - או תזמון של כל דקה\מס' מועט של דקות או אפילו ON-LINE.

    אסביר את עצמי באמצעות מקרה דומה לשלי בשביל הדוגמא: אני מעביר ביצועי מבחן, ועושה JOIN לטבלת "לויין" של קורסים ע"מ לקבל את שם הקורס. אני צריך שכל עדכון לטבלה - INSERT, UPDATE, DELETE יועבר למחסן הנתונים. אני צריך העברת שינויים בלבד (לא מחיקת כל הנתונים ב-DWH והבאתם מחדש), ושזה יקרה כמה שיותר ON-LINE.

    התחלתי לנסות עבודה עם SSIS, עם PACKAGE פשוט יחסית, ונתקלתי בבעיה של היכולת לזהות ולהעביר שינויים (UPDATE לשורה קיימת בטבלת מקור, ולא רק INSERT-ים. או בעייה חמורה יותר - עדכונים בטבלאות הלווין).

    אפשרות לפתרון שמצאתי - שימוש ב-Slowly Changing Dimension Transformation ב-SSIS.

    עדיין, במקרים של Fixed attribute / Changing attribute לא ברור לי איך שינויים בטבלת לווין מתעדכנים - או איך בכלל מתקבל טריגר לעדכון.

    דוגמא אם שם הקורס משתנה (בטבלת הלווין) - איך מתקבל טריגר לעדכון מחסן הנתונים?

    והאם ישנם פתרונות נוספים למקרה שלי - ב-SSIS, בכלים אחרים או אפילו ב-SQL טהור.

    תודה.


    itaigitt, http://copypastenet.blogspot.com
    יום ראשון 20 פברואר 2011 11:46

תשובות

  • הי איתי,

    ישנם דרכים רבות לבצע את מה שאתה מעוניין לעשות ולא הייתי משתמש ב- SSIS ע"מ לנהל את השינויים אלה רק את העברת הנתונים.

    אפשרות אחת כללית:

    1. לנהל טריגרים על טבלאות המקור שירשמו כל שינויי בטבלה המקורית, לטבלת הניהול בסעיף 2.

    2. טבלת ניהול, יותר נכון טבלת LOG, שרושמת את הנתונים הבאים:

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

    3. פונקציה/ פרוצדורה שבקריאה אליה יודעת להביא את כל השינויים מאז "הפעם האחרונה".

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

    זה בגדול התהליך, במידה ותרצה דוגמאות צור איתי קשר אני ישלח לך במייל

    יום טוב


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:53
    יום ראשון 20 פברואר 2011 13:23
  • הי איתי,

    אני ינסה לגעת בכל הנקודות:

    1. לגבי SCD זה כלי מצויין לזהות שינויים, אכן בעזרת buisness key אך ברגע שזה יהיה מופעל אתה צריך לשים לב למדיניות הגיבויים אחרת ה- transaction log שלך יגדל ויגדל ....

    2. לא הייתי ממליץ לך להוסיף עמודה, זה פתרון "זול" ויכול לגרום להרבה בעיות ביצועיים וגם בעיות בניהול.

    3. יש פיתרונות מובנים לזיהוי שינויים כגון SCD אך במקרה שלך אתה צריך לזהות שינוי ביישות לוגית, היינו מורכבת מכמה טבלאות ולכן תצטרך לממש את הפתרון אע"פ שהוא פשוט.

    4. בעניין ה - SSIS הייתי ממליץ בחום כפתרון להעברת נתונים, אחרי שזיהיתי מה צריך להעביר.

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

    יום טוב,

     


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:54
    יום שני 21 פברואר 2011 07:28
  • אפשר לטפל בזה באמצעות פקודת Merge שבה מגדירים מה לעשות עם מה שהשתנה או שנמחק או שהתווסף, תוך השוואה בין שתי הטבלאות.

    למיטב זכרוני גם ב-SSIS יש אובייקט שמבצע Merge.

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


    Geri Reshef http://gerireshef.wordpress.com
    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:54
    יום ראשון 20 פברואר 2011 18:14
  • הי,

    ע"מ לזהות את השינויים שבוצעו ב- Source בסביבת 2005 אין מנוס מטריגרים על טבלת ה- Source.

    כל העיניין זה איך אני מזהה מה השתנה? ככה אני מצמצם את פעולת ה- Merge רק לרשומות הרלוונטיות ולא עבור כל הרשומות בטבלה.

    לדעתי הדרך הקלה ביותר זה triggers על ה- Source ואני לא רואה קיצורי דרך בעניין הזה.

    בהצלחה 


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:54
    יום ראשון 20 פברואר 2011 18:56
  • אם אתה משתמש ב SQL 2008 ב source כדאי לך להסתכל על CDC - Change Data Capture

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

    SCD עלול להיות כבד מאוד בטבלאות גדולות, ועשוי להשפיע על מערכות המקור.

    בברכה,

    אסף פרנקל

    Senior Architect, Microsoft Consulting Services

    המידע שקיבלת במסגרת תכתובת זו הינו מידע כללי בלבד ואין לראות ו\או להסתמך על מידע כאמור כייעוץ ו\או תחליף לייעוץ מכל סוג שהוא ו\או להסתמך עליו לעניין כלשהו.

     

    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:54
    יום שני 21 פברואר 2011 08:17

כל התגובות

  • הי איתי,

    ישנם דרכים רבות לבצע את מה שאתה מעוניין לעשות ולא הייתי משתמש ב- SSIS ע"מ לנהל את השינויים אלה רק את העברת הנתונים.

    אפשרות אחת כללית:

    1. לנהל טריגרים על טבלאות המקור שירשמו כל שינויי בטבלה המקורית, לטבלת הניהול בסעיף 2.

    2. טבלת ניהול, יותר נכון טבלת LOG, שרושמת את הנתונים הבאים:

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

    3. פונקציה/ פרוצדורה שבקריאה אליה יודעת להביא את כל השינויים מאז "הפעם האחרונה".

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

    זה בגדול התהליך, במידה ותרצה דוגמאות צור איתי קשר אני ישלח לך במייל

    יום טוב


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:53
    יום ראשון 20 פברואר 2011 13:23
  • היי אסף.

    יש לי כרגע DB הראשי (מקור) וטבלת יעד ב-DWH. יש לי SP שיודעת להביא את הנתונים מ-DB המקור. יש לי PACKAGE פשוטה יחסית, שיודעת לקרוא את ה-SP ולקחת את העמודות הרלוונטיות - לפי שדה חיווי בטבלת המקור הראשית של הערוץ הזה. כמו כן, יצרת (בעזרתך) יצרתי ג'וב שמפעיל את ה-PACKAGE הנ"ל.

    מה חסר? כמה דברים:

    1. ניהול שינויים ומחיקות בטבלת המקור הראשית.
    2. ניהול שינויים בטבלאות לווין לטבלה הראשית (אלו שנתונים מהם מגיעים ב-JOIN לטבלה הראשית).
    לכן, נראה ששימוש ב-Slowly Changing Dimension Transformation ב-PACKAGE יכול להיות כיוון מבחינתי.
    לא?


    itaigitt, http://copypastenet.blogspot.com
    יום ראשון 20 פברואר 2011 13:29
  • הי איתי,

    slowely changing dimentions זו מטודה של טרנספורמציה, היינו כבר גזרתה נתונים והם ב- Data flow אתה לא יכול להשתמש בזה כ- source.

    דבר איתי אני יתן לך כוון ואח"כ נעלה ב- post זו סוגיה ארוכה.

    ערב טוב,


    אסף שלם
    יום ראשון 20 פברואר 2011 15:20
  • אפשר לטפל בזה באמצעות פקודת Merge שבה מגדירים מה לעשות עם מה שהשתנה או שנמחק או שהתווסף, תוך השוואה בין שתי הטבלאות.

    למיטב זכרוני גם ב-SSIS יש אובייקט שמבצע Merge.

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


    Geri Reshef http://gerireshef.wordpress.com
    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:54
    יום ראשון 20 פברואר 2011 18:14
  • הי,

    ע"מ לזהות את השינויים שבוצעו ב- Source בסביבת 2005 אין מנוס מטריגרים על טבלת ה- Source.

    כל העיניין זה איך אני מזהה מה השתנה? ככה אני מצמצם את פעולת ה- Merge רק לרשומות הרלוונטיות ולא עבור כל הרשומות בטבלה.

    לדעתי הדרך הקלה ביותר זה triggers על ה- Source ואני לא רואה קיצורי דרך בעניין הזה.

    בהצלחה 


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:54
    יום ראשון 20 פברואר 2011 18:56
  • בוקר טוב ותודה לכל העונים!

    ראשית, שכחתי לרשום שאני עובד על MSSQL 2008.

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

    את העקרון של השימוש ב-SCD נראה לי שהבנתי פחות או יותר, יש לי כמה שאלות פתוחות עדיין:

    1. לפי מה שאני הבנתי, ה-SCD אמור לזהות מה-DATA FLOW SOURCE מה השתנה ומה לא באמצעות ה-Business Keys. האם הבנתי נכון?
    2. ה-DATA FLOW SOURCE שלי היא בעצם פרוצדורה שמביאה לי נתונים מ-DB המקור. בעקרון זה SELECT על טבלה כלשהי, למשל טבלה של ביצועי מבחן, וכמובן שיש JOIN-ים לטבלאות אחרות, משם אני אביא את שם התלמיד, שם הקורס וכו'. איך בשאילתא הזו, אני אמור לדעת מה השתנה? אני חשבתי על עמודת חיווי, לה קראתי IsExportToDW. היא תעודכן ב-DB המקור ללא קשר לחבילה, ותשונה ל-0 (=צריך להעביר) במקרה של הכנסה, עדכון (ואולי גם מחיקה). מה דעתכם?
    3. באופן כללי, לא נראה לי שהמקרה שלי הוא משהו מהפכני שלא קרה עד היום..... אני מניח שחייב להיות איזה פתרון מובנה. אני פשוט חדש ב-SSIS ואני לא כ"כ מכיר.....
    4. אגב, אני לא נעול על פתרון רק באמצעות SSIS. אני יודע שפתרון לדוגמא כמו שלי יכול להתבצע בכמה דרכים, אפילו באמצעות SQL "רגיל" (ודבר כזה כבר עשיתי בעבר). מה שמושך אותי בכל זאת להשתמש ב-SSIS זה היתרונות הכלליים שלו - שהוא מובנה (ואמור לתת פתרונות למקרים כמו שלי - ככה אני מקווה....), שאם אצטרך הוא יודע לטפל ב-SOURCE-ים שאינם SQL SERVER וכו'.
    שוב תודה, איתי.


    itaigitt, http://copypastenet.blogspot.com
    יום שני 21 פברואר 2011 07:11
  • הי איתי,

    אני ינסה לגעת בכל הנקודות:

    1. לגבי SCD זה כלי מצויין לזהות שינויים, אכן בעזרת buisness key אך ברגע שזה יהיה מופעל אתה צריך לשים לב למדיניות הגיבויים אחרת ה- transaction log שלך יגדל ויגדל ....

    2. לא הייתי ממליץ לך להוסיף עמודה, זה פתרון "זול" ויכול לגרום להרבה בעיות ביצועיים וגם בעיות בניהול.

    3. יש פיתרונות מובנים לזיהוי שינויים כגון SCD אך במקרה שלך אתה צריך לזהות שינוי ביישות לוגית, היינו מורכבת מכמה טבלאות ולכן תצטרך לממש את הפתרון אע"פ שהוא פשוט.

    4. בעניין ה - SSIS הייתי ממליץ בחום כפתרון להעברת נתונים, אחרי שזיהיתי מה צריך להעביר.

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

    יום טוב,

     


    אסף שלם
    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:54
    יום שני 21 פברואר 2011 07:28
  • היי אסף.

    עוד כמה שאלות של "צעיר" :-)

    1. מדיניות הגיבויים של מה?
    2. למה את ה נגד פתרון של עמודה? גם לפי מה שרקאתי זה פתרון שהרבה פעמים אין מנוס ממנו.... טריגרים זה נראה לי פתרון יותר "מפחיד" - כשלון של משהו יכול להכשים INSERT או פעולות אחרות - שכלל לא קשורות ל-DWH וזה בטח לא משהו שאני רוצה....
    3. העניין שה-SOURCE שלי מורכב מכמה טבלאות הוא אחד האתגרים שלי - כי הרי לא רק שינוי בטבלה המרכזית (טבלת ביצועי מבחן) צריך לגרום לשינוי - אלא גם שינויים בטבלאות הלווין. (למרות שב-SCD אם אני בוחר לשמור היסטוריה אז אין חשש מזה - כי רשומות ישנות ישארו עם הערכים הישנים וחדשות יקבלו את הערכים המעודכנים. לא?) מה אתה מתכוון שאתה אומר שאצטרך לממש את הפתרון? האם יש עוד מימוש מעבר ל-SCD ול-PACKAGE?


    itaigitt, http://copypastenet.blogspot.com
    יום שני 21 פברואר 2011 07:55
  • אם אתה משתמש ב SQL 2008 ב source כדאי לך להסתכל על CDC - Change Data Capture

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

    SCD עלול להיות כבד מאוד בטבלאות גדולות, ועשוי להשפיע על מערכות המקור.

    בברכה,

    אסף פרנקל

    Senior Architect, Microsoft Consulting Services

    המידע שקיבלת במסגרת תכתובת זו הינו מידע כללי בלבד ואין לראות ו\או להסתמך על מידע כאמור כייעוץ ו\או תחליף לייעוץ מכל סוג שהוא ו\או להסתמך עליו לעניין כלשהו.

     

    • סומן כתשובה על-ידי Meir Pinto יום שלישי 22 פברואר 2011 07:54
    יום שני 21 פברואר 2011 08:17
  • הי איתי,

    יהיה קשה לנהל דיון של שעה פחות או יותר דרך הפורום, בגדול:

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

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

    1. לנהל שינויים, ע"י טריגר או עמודה נוספת מה שנוח לך ובסוף תגלה ש - trigger יותר נוח.

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

    3. שליפת הרשומות הרלוונטיות ועדכון ביעד.

     

     

     


    אסף שלם
    יום שני 21 פברואר 2011 08:23
  • שוב תודה לכולם על העזרה והסבלנות.

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

    שאלה אחת, בנושא שכבר הוזכר פה, לגבי פקודת Merge:

    קראתי על הפקודה הזו, בין השאר בפוסט מצוין בבלוג של גרי רשף (http://gerireshef.wordpress.com/2010/06/07/%D7%A9%D7%99%D7%9E%D7%95%D7%A9-%D7%91%D7%A4%D7%A7%D7%95%D7%93%D7%AA-merge-%D7%9C%D7%A2%D7%93%D7%9B%D7%95%D7%9F-%D7%98%D7%91%D7%9C%D7%AA-slowly-changing-dimension/?blogsub=confirming#subscribe-blog).

    אני מניח שבמקרה שלי אין מה להשתמש בה, כי ה-SCD עושה את העבודה, לא? ואם כן משתמשים בה למרות ה-SCD, איפה היא אמורה להיכנס פה?


    itaigitt, http://copypastenet.blogspot.com
    יום שני 21 פברואר 2011 08:29