
הטקסט המלא של הדקות הראשונות בהרצאה «מבוא Execution Plan» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, שיעורנו היום פותח צוהר לאחד הנושאים המרתקים ביותר בנושא של SQL. הוא הנושא אשר מבדל בין תוכניתן המתחיל לתוכניתן המתקדמת בעל ניסיון. הנושא הזה, אנחנו נקרא לו Execution Plan.
מהו Execution Plan? כיצד אנחנו מתמודדים איתו? כיצד אנחנו מפיקים ממנו מידע ומפיקים ממנו את המרב? את זאת נראה בשיעור הקרוב ובשיעור שלאחר מכן.
Execution Plan בתור הגדרה זוהי תוכנית עבודה, תוכנית הפעולה בה משתמש הדאטאבס על מנת להביא את הנתונים.
אנחנו יכולים לקבל מידע אודות התוכנית עצמה כפי שהתבצעה בפועל, או מידע משוער עבור המידע כפי שהדאטאבס מעריך שהוא התבצע.
מתי מתבצעת תוכנית הפעולה הזאת? אז ראשית כל היא בוודאי מתבצעת כאשר אנחנו שולפים פקודת Select לתוך הדאטאבס. אנחנו מבצעים פקודת Fetching כפקודה של קווירי הבאת הנתונים.
דאטאבייס יושב ומנתח מהי הדרך האופטימלית מבחינת ביצועים ומבחינת שימוש במושבים הקיימים על מנת להביא את הנתונים בצורה היעילה והנכונה ביותר. זה קורה מפקודת סלקט, זה כמובן גם קורה מפקודת אינסרט אבל לא באינסרט פשוט שבהם אנחנו נותנים ערכים values סקלאריים ערכים חד חד ערכיים לתוך הטבלה
אלא כאשר אנחנו משתמשים כמובן בסאב קוויריז תת שאילתא כחלק נקודת הסלקט משתמשים ב-insert as Select, כלומר משתמשים בפקודת סלקט שהפלט שלה מתקבל כ-insert לתוך הטבלה.
מקום נוסף שבו אנחנו משתמשים גם בפקודת EML בחלק של ה-update ו-delete בחלק של ה-well-close, נכון? בעוד שה-well-close הוא אופציונלי עבור פקודות update ו-delete, עבור insert הוא בכלל לא רלוונטי, אולם ברגע שאנחנו רושמים update ו-insert עם well-close, מתבצעת בעצם שליפה מול
הדאטאבייס על מנת לקבל את האוכלוסייה הנכונה, אותה אוכלוסייה שעונה על התנאים הבוליאנים המצוינים בחלק של ה-World Close. כל זאת מביא אותנו למסקנה שבעצם תהליך כתיבה של שאילתא, אחת מני שלושת האפשרויות שציינו Select, Insert או Update ו-Delete, מציגה בפנינו מספר
שלבים אותם עובר הדאטאבייס, החל מהרגע שבו סיימנו לכתוב את השאילתא ועד הרגע שבו אנחנו מקבלים אותה. תחילה קודם כל מתבצע השלב הראשון פארסינג של השאילתה ניתוח וחלוקה של חלקים של השאילתה שאותה כתבנו אוקיי חילקתי אותה ברגע שאני מחלק אותה אז עכשיו אנחנו מבדקים האם היא נכתבה נכון query compilation האם כתבנו אותה בצורה
נכונה ניגשנו לאובייקטים הנכונים עם השם הנכון עם שמות העמודות הנכונות האם סינטקס מדובר כאן בפקודה נכונה יש כאן גם בדיקה של הרשאות, בדיקה של יוזר, בדיקה של אינסטנס, בדיקה של הרבה מאוד משתנה סביבה כולל טבלאות מערכת,
על מנת לוודא שהשאילתה שאותה כתבתי והמידע שאותו אני רוצה לראות, יש לי הרשאות לעשות את זה, אני יכול לעשות את זה. הטבלה כרגע לא נעולה וכל מה שנדרש מאיתנו בשלב הזה זה להתקדם לשלב הבא.
השלב הבא הוא השלב המעניין אותנו, כאן נכנסת תוכנית הפעולה לעבודה ולמקרה query optimization. אנחנו לוקחים את השאילתה, הדאטאבס, בבייגראונד, מאחורה, ברקע לוקח את השאילתה ומטייב אותה נכון ומפרק אותה לחלקים על מנת שנוכל להביא את המידע בצורה האופטימלית.
כאן כבר נעשית בחירה של תוכנית הפעולה, בחירה של ה-execution plan, תוכנית של הבאת הנתונים מתוך הדאטאבס. בשלב הזה זה השלב החכם, זה השלב שבו אנחנו רוצים באמת שיהיה לנו אלגוריתם הכי הכי טוב בדאטאבס שלנו, שידע להביא לנו את הנתונים בצורה האופטימלית ביותר, המהירה ביותר,
על ידי חיסכון במשאבים היעיל ביותר. לאחר שגמרנו את השלב הזה, שאותו שלב הוא עניינו של השיעור שלפנינו, מגיע כבר השלב הטכני, השלב של ה-Fatch, השלב של ה-Query Execution, שלב שבו אנחנו בעצם הולכים ומביאים את הנתונים עצמם מתוך הדאטאבס.
בואו בתור תרגיל פשוט נראה כיצד שתי שאילתות שימוש ב-execution plan יכול לתת לנו תעדוף של שאילתה אחת על פני שאילתה קודמת. בואו נרשום תחילה שאילתת סלקט פשוטה מתוך טבלת employees.
Select Distinct City from Employees אנחנו רוצים לשלוף את שמות הערים מתוך טבלת העובדים שלפנינו. אנחנו רוצים לעמת את השאילתה הזאת מול אותה שאילתה בדיוק רק ללא החלק של ה-Distinct.
רקט סייטי פרום אימפלואיז ושתי השאילתות מוצגות לפנינו. שתי השאילתות הללו אנחנו רוצים כרגע לנתח מה עדיף מבחינתם ואנחנו בעצם כל מה שאנחנו צריכים לעשות כאן זה להשתמש בכפתורים.
יש לנו כאן בכפתורים Display Estimated Execution Plan על מנת להציג מידע משוער כיצד תיראה תוכנית העבודה תוכנית הפעולה של הבאת הנתונים.
יש לאפשרות גם דרך התפריט query, display estimated execution plan וכאן נפתחת לי כבר אפשרות שלישית ctrl+l שזו האפשרות המועדפת מבחינתי.
זו האפשרות שבה אנחנו מסמנים שתי שאילתות, כותבים ctrl+l על מנת לקבל את תוכנית העבודה של זו מול זו על מנת לבצע תיעדוף של שאילתה אחת על פני רעותה. דיברנו על estimated, מה ההערכה של תוכנית העבודה, יש לנו אפשרות לא רק לעשות estimated אלא שתי כפתורים ימינה אנחנו מקבלים
Include Actual Execution Plan בשלב הזה של Include Actual Execution Plan הדאטאבס הולך ומביא את הנתונים עצמם ומציג לנו מהי הדרך שבסופו של דבר התבצעה ובסופו של דבר קיים.
וכרגע לא מעניין אותנו, אנחנו לא רוצים את ה... יש כאן מידע נוסף שנשפך לנו, אנחנו נסתפק ב-Estimated ולכן אנחנו לוחצים על Control-L.
בהצלחה על Control-L אנחנו פותחים כאן את הפאנל של התוצאות ומקבלים את שתי השאילתות זו מול זו מעומתות אחת אל מול רעותה. מידע ראשון שמעניין אותנו והוא כבר המידע שאני אוהב להסתכל עליו כאשר אני מאמץ שתי שאילתות זה האחוזים.
הדאטה בס נותן לנו מבחינת עלויות כיצד עלה לו מהי העלות של שאילתה אחת לעומת חברתה וכבר כאן אנחנו מקבלים שיפור ויעילות מדהימה של 82% משאבים מהזמן הושקעו בשאילתה הראשונה שאילתת הדיסטינק לעומת חברתה שווה רק 18% מהזמן אנחנו יודעים להסביר זאת למה כיוון שבחלק הראשון השתמשנו בסורטינג השתמשנו בחלק של הדיסטינק
אבל זה עדיין מעניין לראות את ההפרשים מבחינת שיפור הביצועים בין שתי השאילתות הללו. בנוסף לזה אנחנו כבר מתחילים לרדת כאן לעומק כשאנחנו מקבלים את הרכיבים המרכיבים את תוכנית העבודה.
הרכיבים הללו כאשר יש ביניהם חץ הם המסמנים לנו מהם תתי השלבים שהדאטאבס עבר מהרגע שביצעתי כתיבת השאילתא, מצאתי F5 מתחילת תוכנית העבודה ועד שהובאו הנתונים בסופו של דבר למשתמש.
אנחנו רואים שבשני התוכניות השתמשנו כאן ב-clustered index scan, סריקה של האינדקס שהוא סקנד האמת שזה לא ממש שימוש בתוך האינדקס אלא זה שימוש בתוך ה-primary key שהוא בעצם כאינדקס מאונדקס מכיוון שכתבנו בשתי השאילתות הללו