PracticU

איך מתבצע JOIN בפועל - חלק 2

בלי כתוביותעם כתוביות
PracticU › קורס DBA אפליקטיבי - שפת SQL למתחילים › איך מתבצע JOIN בפועל - חלק 2
מילון מושגים:
Join - פעולת SQL שמשלבת שורות משתי טבלאות או יותר על בסיס קשר ביניהן.
אלגוריתם - רצף מוגדר של צעדים לפתרון בעיה או לביצוע משימה, שאפשר לממש בקוד.
האש - פונקציה שממירה מידע לערך קצר באורך קבוע. שינוי קטן בקלט משנה את התוצאה, והיא חד-כיוונית.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
שאילתה - בקשה למסד נתונים לשלוף, להוסיף, לעדכן או למחוק נתונים, לרוב בשפת SQL.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
אינדקס - מבנה במסד נתונים שמאיץ חיפוש ושליפה. גם מספר המציין מיקום של איבר במערך.

איך מתבצע JOIN בפועל - חלק 2
השיעור מציג את האלגוריתם השלישי, Hash Join, ומשווה אותו לשניים הקודמים. שלושת האלגוריתמים נבחרים לפי מצב הטבלאות והאינדקסים.
השלבים העיקריים
1. בניית טבלת הגיבוב: הדאטאבייס לוקח את הטבלה הקטנה ומכניס כל שורה לטבלת hash, לפי ערך של פונקציית hash על עמודת הג'וין. כל שורה נשמרת במקום שהפונקציה מחזירה לה.
2. סריקת הטבלה הגדולה: הדאטאבייס עובר פעם אחת על הטבלה הגדולה. לכל שורה הוא מחשב את אותה פונקציה, מגיע ישירות למקום המתאים בטבלת ה-hash ומזהה את ההתאמה.
3. דוגמה: בשאילתה של Employees ו-Orders נבחר לשלוף גם את OrderDay. העמודה הזאת אינה באינדקס של EmployeeID, ולכן הדאטאבייס ניגש לטבלה בכל מקרה. התוכנית משתמשת במפתח הפרימרי של Orders, ומשתמשת ב-Hash Match לחיבור.
4. מתי זה מתאים: כשאין מיון מתאים על עמודת הג'וין, כשהטבלה הקטנה קטנה יחסית, והטבלה הגדולה מלאה בנתונים. טבלת ה-hash מונעת מעבר מקונן על כל הטבלה.
סיכום שלושת האלגוריתמים
- Nested Loops כשאין אינדקסים או כשאחת הטבלאות קטנה מאוד.
- Merge Join כששתי הטבלאות ממוינות לפי עמודת הג'וין.
- Hash Join כשאין מיון מתאים, והטבלה הגדולה נסרקת פעם אחת בלבד.
אחרי השיעור אפשר לקרוא תוכנית עם Hash Match ולהסביר למה הדאטאבייס בחר בו.

פרקי ההרצאה: איך מתבצע JOIN בפועל - חלק 2

  1. 00:00

    בחירת אלגוריתם JOIN לפי מצב הטבלאות

  2. 01:18

    אלגוריתם Hash Join ו-Hash Table

  3. 01:51

    בניית Hash Table מהטבלה הקטנה

  4. 02:44

    חיפוש ישיר בטבלה הגדולה לפי Hash

  5. 03:44

    הדגמת Hash Join ב-SQL Server

  6. 04:39

    הוספת עמודות מהטבלה הגדולה ל-Join

  7. 05:53

    תקורה של טבלה זמנית בתוכנית העבודה

תמלול ההרצאה: איך מתבצע JOIN בפועל - חלק 2

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

  1. 00:02

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

  2. 00:26

    יצרנו טבלה בשם itable for nested לו ומכיוון שאינה ממויינת ואין בגינה שום אינדקס אז הדאטאבס בחר להשתמש ב-join שיש בו overhead גדול מאוד כיוון שהוא צורך מעבר על שתי הטבלאות זו כפול זו אולם אין לו ברירה מאחר שטבלה זו לא הייתה ממויינת כאשר בחרנו

  3. 00:48

    לעבוד עם טבלאות ממויינות טבלת employees וטבלת orders שתיהן ממויינות בגין העמודה employeeid בעוד שב-employees employeeid הוא קלאסטרד אינדקס כלומר הוא ממויין ומכיל את כל הנתונים בגינותה שורה.

  4. 01:04

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

  5. 01:27

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

  6. 01:50

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

  7. 02:13

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

  8. 02:39

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

  9. 02:51

    לטבלה הגדולה יותר ברגע שאנחנו נפעיל עליה שוב פעם את הפונקציה של ה-Hash Function אנחנו נגיע בגישה ישירה למקום הרלוונטי והמתאים בטבלה ועם מקום מספר 2 הערך 2 בטבלה הממוזגת השנייה הגדולה על ידי שימוש ב-hash function אנחנו נגיע בדיוק לאותו אותה שיכוון

  10. 03:15

    אותנו לערך של 2 בטבלה שאיתה אנחנו מבצעים join כנ"ל לגבי 2 כנ"ל לגבי 3 לגבי כל אחד ואחד מהערכים שלי גם אחד ברגע שאנחנו נפעיל עליהם את הפונקציה של ה-hash function אנחנו נגיע בגישה ישירה למקום שבו כרגע שמור לנו הערך מתוך הטבלה שאיתה אנחנו מבצעים join.

  11. 03:44

    בואו נראה כיצד הדברים הללו עובדים בפועל, נחזור לתוך הsql server. אנחנו כאמור מדברים כאן על hash join ונריץ את אותה שאילתה כפי שיצרנו אותה מקודם, כפי שיצרנו ב-merge-loop אולם עם שינוי קטן.

  12. 04:01

    שימו לב לדוגמה הבאה: Select first name, seek last name, seek city. נוסיף גם את region כפי שציינו אבל אנחנו מוסיפים כאן עמודה נוספת.

  13. 04:12

    בתרגול הקודם אנחנו בחרנו עמודות רק מטבלת employees שכפי שאני ציינתי היא מאונדקסת אבל כ-clustered index. כאן אנחנו בוחרים גם נתונים מתוך טבלת orders.

  14. 04:24

    נבחר את order day אפשר גם להוסיף את order ID אבל once בחרנו מספיק עמודה אחת מתוך orders שזו טבלה גדולה מאוד. והיא כבר לא מאונדקסת כ-clustered index, כלומר שהמידע נמצא לי ב-cash שאני יכול כבר להביא אותו.

  15. 04:41

    כאן כבר אנחנו נגלה להפתעתנו דבר אחר. From employees orders where employees.employeeid שווה ל-orders.employeeid השאילתה לפנינו השאילתה מוכנה שימו לב היא זהה לחלוטין לשאילתה שראינו בה מרג'לו.

  16. 05:00

    אולם כאן אנחנו הוספנו שתי עמודות שהן מתוך טבלת orders. זו טבלה גדולה וזה דבר אחד ודבר נוסף שמאפיין אותה ששני הנתונים הללו אינם כרגע כ-clustered index כלומר הם לא נמצאים ב-clustered index לפי Employee ID ולכן אנחנו נדרשים ללכת ולהביא אותם מתוך הטבלה

  17. 05:22

    עצמה ואשר על כן שימוש באינדקס כאן של Employee ID לעומת שימוש באינדקס ב-orders.employee ID לא עוזר לי כי זה שהשתמשתי באינדקס שלי עם pre-id עזר לי לבצע את המצ'ינג, את הג'וינט ביניהם.

  18. 05:41

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

  19. 05:59

    אז אני מלכתחילה כבר לא משתמש בג'וינט, לא משתמש באינדקס, יוצר לעצמי את ה-Temporary Table כפי שראינו את ה-Hash Table. קונטרול L על מנת לקבל את ה-Execution Plan כפי שהסברנו ואנחנו מגלים את הדבר הבא.

  20. 06:18

    ראשית כל Clustered Index לא השתנה ללא שינוי אנחנו עדיין עובדים על תגרת Employees וכיוון שהיא Clustered וממוינת ממנה אנחנו שולפים את התנאי שאיתו אנחנו עושים join,

לקורס המלא: קורס SQL ו‑DBA אפליקטיבי

ההרצאה הקודמת: איך מתבצע JOIN בפועל - חלק 1

ההרצאה הבאה: Reporting Services - דוח בסיסי

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

  • Qlik Join - חלק 1
  • ביצוע בפועל של ההתקפה - buffer overflow
  • שליפת קטגוריה עם כל המוצרים שלה - MongoDB Join

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

  • קורס NoSQL - MongoDB
  • קורס SSIS
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI