PracticU

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

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

איך מתבצע JOIN בפועל - חלק 1
השיעור פותח סדרה על שלושת אלגוריתמי ה-Join שהדאטאבייס בוחר מביניהם: Nested Loops, Merge Join ו-Hash Join. כאן מכירים את השניים הראשונים, ורואים איך מזהים אותם בתוכנית.
השלבים העיקריים
1. Nested Loops: לכל שורה בטבלה החיצונית סורקים את הטבלה הפנימית. הדאטאבייס בוחר את הטבלה הקטנה יותר כחיצונית, ולכן סדר הכתיבה בשאילתה לא קובע. בלי אינדקסים מספר האיטרציות שווה למספר השורות בטבלה A כפול מספר השורות בטבלה B.
2. Merge Join: מתאים לטבלאות ממוינות לפי עמודת התנאי. שני המצביעים מתקדמים שורה אחרי שורה, והשוואת הערכים קובעת מה מתחבר. זה מהיר בהרבה מ-Nested Loops, אבל דורש מיון.
3. דוגמה ל-Nested Loops: טבלה זמנית שנוצרה מ-Employees, ללא אינדקס ובת 9 שורות, מחוברת ל-Orders שבה כ-830 שורות לפי EmployeeID. התוכנית מראה סריקה של הטבלה הקטנה וגישה לטבלה Orders לכל שורה, כי Orders ממוינת לפי OrderID ולא לפי EmployeeID.
4. דוגמה ל-Merge Join: מחברים את Employees ו-Orders לפי EmployeeID. לטבלה Employees יש מפתח מקובץ לפי EmployeeID, ולטבלה Orders יש אינדקס על העמודה הזאת. שתי הטבלאות ממוינות לפי התנאי, והדאטאבייס בוחר Merge Join.
אחרי השיעור אפשר לזהות בתוכנית מתי הדאטאבייס משתמש בלולאה מקוננת ומתי במיזוג של טבלאות ממוינות.
השיעור הבא בקורס: איך מתבצע JOIN בפועל - חלק 2

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

  1. 00:00

    שלוש אפשרויות ה-JOIN של הדאטאבייס

  2. 00:58

    הכרת Nested Loop Join

  3. 02:37

    Merge Join על טבלאות ממוינות

  4. 03:15

    אלגוריתם Merge Join צעד אחר צעד

  5. 04:31

    דוגמה ל-Nested Loop על טבלה זמנית

  6. 06:19

    קריאת תוכנית העבודה של ה-Join

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

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

  1. 00:02

    שלום לכולם, שיעורנו כרגע הוא המשך לשיעור קודם בנושא של execution plan, בשיעור היום אנחנו נתמקד בשלוש אפשרויות תצוגה, שלוש אפשרויות גרפיות המעידות על שלוש אלגוריתמים שונים, שלושה אלגוריתמים שונים בביצוע הפעולה של join.

  2. 00:21

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

  3. 00:48

    שלושת האפשרויות הללו זו האפשרות זו התוכנית שתתבחר בהתאם לנתונים בהתאם לסלקטיביות בהתאם לפרמטרים נוספים כפי שאנחנו נראה בהמשך בשיעורנו הקרוב ואנחנו נתמקד בשתי האפשרויות הראשונות Nested Loop ו-Nerge Joint.

  4. 01:04

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

  5. 01:21

    בשיעור הבא אנחנו נתעסק בנושא של ה-Hash Joint. הלאה ונתחיל בנושא של Nested Loop. נתחיל תחילה בהגדרות ולצורך כך ערכתי את המצגת הבאה נסטד לופ להלן אלגוריתם כפסדו קוד כפי שהוא מתבצע בתוך הדאטאבס for each row in table A אנחנו סורקים את טבלת A אנחנו נעדיף לסרוק את הטבלה הקטנה יותר כך שהדאטאבס לא מתייחס באמת לסדר

  6. 01:48

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

  7. 02:08

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

  8. 02:40

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

  9. 03:06

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

  10. 03:30

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

  11. 04:02

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

  12. 04:22

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

  13. 04:35

    בואו ונראה דוגמה כיצד זה קורה. נתחיל תחילה בנסטד לופ. נסטד לופ ג'וין בין שתי טבלאות. אנחנו נבצע ראשית מיצוא איזושהי טבלה. my table for nested loop ניצור טבלה מתוך employees למה אנחנו רוצים ליצור את זה כיוון שאני רוצה ליצור טבלה שאין עליה כרגע אינדקס לקחתי את כל המיקודים בתוך טבלת employees ברגע שהכנסתי אותם לתוך my table for nested

  14. 05:05

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

  15. 05:32

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

  16. 05:50

    אימפלואי איי די. ברגע שאנחנו שולפים את הנתון הזה, שימו לב שאנחנו שולפים רק את הנתונים מתוך הטבלה הקטנה, מתוך ה-Nested Loop.

  17. 06:02

    כרגע לא מעניין אותי המידע עצמו, כל מה שמעניין אותי זה בעצם ה-Estimated Execution Plan, תוכנית העבודה, ולכן אני לוחץ על קונטרול L. מה שאנחנו יכולים לראות כאן בפלט שלפנינו זה סריקה של שתי הטבלאות, כפי שציינו בחלק של ה-From Close Join בין שתי הטבלאות.

  18. 06:19

    תחילה, החלק העליון, Full Tidal Scan לטבלה הקטנה, טבלה שאותה יצרנו של התשע שורות my table for nested roof אותה טבלה שיצרנו ממנה אנחנו מקבלים תשע שורות כפי שאנחנו יכולים לראות כאן estimated number of rows שלפנו תשע שורות

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

ההרצאה הקודמת: מבוא Execution Plan

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

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

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

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

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