
הטקסט המלא של הדקות הראשונות בהרצאה «איך מתבצע JOIN בפועל - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, שיעורנו כרגע הוא המשך לשיעור קודם בנושא של execution plan, בשיעור היום אנחנו נתמקד בשלוש אפשרויות תצוגה, שלוש אפשרויות גרפיות המעידות על שלוש אלגוריתמים שונים, שלושה אלגוריתמים שונים בביצוע הפעולה של join.
כפי שאנחנו יודעים join זו פעולה שצורכת משאבים רבים בעבודת מעבד רבה של חיבור בין שתי טבלאות, בבחירת התהליך הנכון בדרך בביצוע ג'וין הדאטה בס עומד בפני שלוש אפשרויות כפי שאנחנו נראה בדוגמאות שלהלן הדאטה בס יכול לבצע נסטד לופ ג'וין יש לופ ג'וין נוסף שנקרא מרג' ג'וין ואפשרות אחרונה שנקראת האש ג'וין אחת מני
שלושת האפשרויות הללו זו האפשרות זו התוכנית שתתבחר בהתאם לנתונים בהתאם לסלקטיביות בהתאם לפרמטרים נוספים כפי שאנחנו נראה בהמשך בשיעורנו הקרוב ואנחנו נתמקד בשתי האפשרויות הראשונות Nested Loop ו-Nerge Joint.
באפשרויות הללו אנחנו נראה כיצד אנחנו מזהים אותן, ומהו מידע שאנחנו יכולים להוציא מתוך התצוגה של ה-Execution Plan, וכיצד הן עוזרות לי על מנת לכתוב שאילתות בצורה נכונה יותר, בצורה טובה יותר ובצורה יעילה יותר.
בשיעור הבא אנחנו נתעסק בנושא של ה-Hash Joint. הלאה ונתחיל בנושא של Nested Loop. נתחיל תחילה בהגדרות ולצורך כך ערכתי את המצגת הבאה נסטד לופ להלן אלגוריתם כפסדו קוד כפי שהוא מתבצע בתוך הדאטאבס for each row in table A אנחנו סורקים את טבלת A אנחנו נעדיף לסרוק את הטבלה הקטנה יותר כך שהדאטאבס לא מתייחס באמת לסדר
הכתיבה שלנו בפועל אלא הדאטאבס יבחר את הטבלה הקטנה ובעבור כל שורה בטבלת A הוא הוא יסרוק את כל השורות בטבלה B. יסרוק את השורות בטבלה B. מה שאנחנו מבינים שבנסטדלופ אנחנו לא מתייחסים לאינדקס כזה או אחר.
הג'וין של נסטדלופ יתבצע רק במצב שבו אין לנו אינדקס לא על טבלה A ולא על טבלה B. במצב כזה אנחנו נעדיף לסרוק את שתי הטבלאות מה שמביא אותנו בעצם לכמות איטרציות השווה למספר השורות בטבלה A כפול מספר השורות בטבלה B. זה הנסטדלופ וזה יתרונותיו שאנחנו בעצם עובדים על שתי טבלאות שאינן מנויינות, אינן מאומדקסות ובכל זאת אנחנו מוצאים ביניהן
ג'וינט. נתקדם לאפשרות הבאה, אפשרות של מרג' ג'וינט. בעוד שהנסטדלופ עבד על טבלאות שאינן מנויינות, כאן אנחנו מדברים על טבלאות שהן מנויינות, במידה והן לא ממויינות ראשית מתבצע תהליך של סורטינג מיון של טייבל A, לאחר מכן מיון של טייבל B ובסוף כאשר שתי הטבלאות הן ממויינות או לחלופין שתי הטבלאות
מאומדקסות כקלאסטרד אינדקס ולכן העמודה שאותה עליה אנחנו עושים תנאי הג'ויין היא כרגע מאומדקסת כלומר טבלה ממויינת כך שאנחנו מייתרים את השלב הזה אז נכנס האלגוריתם הבא for שוב סורקים את הטבלה הראשונה שהדאטאבס בוחר ואינה בהכרח לפי סדר כתיבה כפי שכבר ציינתי.
אנחנו מבצעים בדיקה מול טבלה B אבל עכשיו אנחנו כבר ממויינים אז אין לנו צורך לסרוק את כל טבלה B כפי שעשינו בנסטד לופ אלא אנחנו בודקים רואו לעומת רואו. במידה ומצאנו שהעמודה הערך הנבדק בעמודה נבדקת גדול בטבלת A לעומת טבלת B, אז אנחנו מקדמים את טבלת B. אנחנו מתקדמים לשורה הבאה בטבלת B. במידה ואנחנו מוצאים שהם שווים אז זה מצוין, זה בדיוק כמו שאנחנו רצינו.
Accept the row, קבל את השילוב הזה. מצאנו את התנאי התקיים, תנאי הג'וינט בין העמדות בין טבלת A לטבלת B התקיים, ולכן אנחנו שולטים אותם. במידה ולא, קדם את השורה הבאה בטבלת A. זה מה שאנחנו עושים במרג' ג'וין.
מרג' ג'וין הרבה הרבה יותר יעיל והרבה יותר מהיר מנסטד לופ, אולם חסרונו הוא שאנחנו יכולים להשתמש בו רק כאשר הטבלאות, כפי שציינתי, ממוינות.
בואו ונראה דוגמה כיצד זה קורה. נתחיל תחילה בנסטד לופ. נסטד לופ ג'וין בין שתי טבלאות. אנחנו נבצע ראשית מיצוא איזושהי טבלה. my table for nested loop ניצור טבלה מתוך employees למה אנחנו רוצים ליצור את זה כיוון שאני רוצה ליצור טבלה שאין עליה כרגע אינדקס לקחתי את כל המיקודים בתוך טבלת employees ברגע שהכנסתי אותם לתוך my table for nested
loop לשלב של טבלה שכרגע אני עצרתי אני סמוך ובטוח שהטבלה עצמה אין עליה כרגע אינדקס אין עליה פריימרי key ואז אנחנו יכולים לבצע את הג'וין מולה הצעתי, שלפתי, יש לנו את הטבלה ואנחנו יכולים כבר להתקדם כרגע לבצע ג'וינט בין טבלת מייטייבל נסטד לופ לעומת טבלת אורדר.
פרו מייטייבל נסטד לופ ג'וינט עם טבלת אורדר מדובר על טבלה קטנה של תשע שורות לעומת טבלה גדולה של שמונה מאות שורות. הג'וינט ביניהם מתבצע לפי העמודה של אימפלואי איי די.
אימפלואי איי די. ברגע שאנחנו שולפים את הנתון הזה, שימו לב שאנחנו שולפים רק את הנתונים מתוך הטבלה הקטנה, מתוך ה-Nested Loop.
כרגע לא מעניין אותי המידע עצמו, כל מה שמעניין אותי זה בעצם ה-Estimated Execution Plan, תוכנית העבודה, ולכן אני לוחץ על קונטרול L. מה שאנחנו יכולים לראות כאן בפלט שלפנינו זה סריקה של שתי הטבלאות, כפי שציינו בחלק של ה-From Close Join בין שתי הטבלאות.
תחילה, החלק העליון, Full Tidal Scan לטבלה הקטנה, טבלה שאותה יצרנו של התשע שורות my table for nested roof אותה טבלה שיצרנו ממנה אנחנו מקבלים תשע שורות כפי שאנחנו יכולים לראות כאן estimated number of rows שלפנו תשע שורות