PracticU

אינדקס - Clustered Index

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

אינדקס - Clustered Index
אינדקס מסוג Clustered Index קובע את סדר האחסון של הטבלה עצמה. בשיעור רואים איך יוצרים אותו, ולמה שאילתה לפי עמודה מאונדקסת רצה הרבה יותר מהר מסריקה של הטבלה כולה.
השלבים העיקריים
1. אינדקס מאוגד אחד לכל טבלה: אפשר ליצור הרבה Non-clustered Index על עמודות שונות, אבל Clustered Index אחד בלבד.
2. Primary Key יוצר אינדקס מאוגד: כשמגדירים Primary Key, נוצר ברקע Clustered Index על אותה עמודה. בטבלת Orders האינדקס נקרא pk_orders ומבוסס על orderid.
3. סדר המיון נקבע ביצירה: לכל עמודה באינדקס בוחרים מיון עולה או יורד. בדוגמה ממיינים את orderid מהקטן לגדול.
4. תוכנית ביצוע עם אינדקס: שליפת הזמנה 10248 לפי orderid מבצעת Clustered Index Seek, ולא סורקת את כל ההזמנות.
5. תוכנית ביצוע בלי אינדקס: בטבלה זהה ללא אינדקס המערכת מבצעת Table Scan, והעלות גבוהה בהרבה.
6. דפים שנקראו: בטבלה המאונדקסת נקראו 2 דפים (Logical Reads 2), ובטבלה ללא אינדקס נקראו 20.
7. יצירה ידנית: ב-Object Explorer לוחצים על New Index ובוחרים Clustered Index, ואפשר להוציא את הסקריפט.
פקודות והגדרות
CREATE UNIQUE CLUSTERED INDEX על שם הטבלה, עם עמודת OrderID במיון עולה. האינדקס יוניק כי orderid חד-ערכי.
שימו לב
סריקת Clustered Index שקולה לסריקת הטבלה, כי הטבלה עצמה ממוינת לפי האינדקס. ההבדל הוא שהשליפה לפי העמודה המאונדקסת מדלגת על רוב הדפים.
בסיום השיעור תוכלו לזהות מתי תוכנית הביצוע משתמשת באינדקס מאוגד ומתי בסריקה מלאה.
השיעור הבא בקורס: אינדקס - Non-clustered Index

פרקי ההרצאה: אינדקס - Clustered Index

  1. 00:00

    מהו Clustered Index ומה ייחודו

  2. 00:57

    פריימרי קי יוצר Clustered Index אוטומטית

  3. 01:36

    מאפייני האינדקס pk_orders ומיון העמודה

  4. 02:14

    סדר המיון בעמודות האינדקס

  5. 02:56

    שליפה לפי עמודה מאונדקסת ותוכנית ביצוע

  6. 03:59

    חיפוש Clustered Index Seek בתוכנית הביצוע

  7. 06:14

    השוואה: טבלה ללא אינדקס וסריקת טבלה

  8. 08:16

    השוואת עלות הפעולה בין האינדקס לסריקה

תמלול ההרצאה: אינדקס - Clustered Index

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

  1. 00:00

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

  2. 00:17

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

  3. 00:47

    הקודם, שיש לנו אוסף של non-clustered index שיכולים להיות הרבה יותר מאחד על עמודות שונות, על חיבור של רצף של עמודות כזה או אחר, אולם לעומת זאת יכול להיות לי רק Clustered Index 1. כאן גם אנחנו יכולים לשים לב שבשעה שאני יוצר פריימרי קי, אוטומטית וברקע נוצר גם בעצם Clustered Index פר טבלה.

  4. 01:18

    יצירת פריימרי קי, משמעותה בעצם ברקע זה יצירת Clustered Index, אינדקס מאוגד עבור אותה עמודה שהיא כרגע פריימרי.

  5. 01:33

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

  6. 02:06

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

  7. 02:42

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

  8. 02:58

    איך אנחנו בוחנים זאת? שימו לב, אני רוצה לשלוף כאן נתון מתוך טבלת orders בהינתן תנאי orderid שווה 10248 הזמנה שאותה אני רוצה להציג שימו לב שאני לקחתי כאן בכוונה בworkloads עמודה שהיא מאונדקסת כלומר ברגע שאני שולף לפי עמודה שהיא מאונדקסת הדאטאבס בבחירתו ב-execution pen בתהליך הבאת הנתונים סביר

  9. 03:38

    להניח שיחליט ללכת על אותו אינדקס על מנת לשלוף את הנתונים ביתר יעילות ותחת אשר סריקת כל ה-830 הזמנות הנמצאות בכבודת אורדרס יבחר הדאטאבייס ללכת ולשרוק את האינדקס עם הרבה הרבה פחות נתונים.

  10. 03:58

    בואו נראה זאת, אני שולף והמידע כאן נמצא לפניי אורדר ID 0.5 אני מקבל את המידע אבל יש לי אפשרות לא רק לקבל את הנתונים, אלא לסמן כאן שאני רוצה את ה-estimated execution plan, תביא לי את תוכנית העבודה המשוערכת לשליפת הנתונים, וברגע שאני לוחץ על הכפתור הזה אני לא מקבל את המידע כי הוא פחות חשוב לי, אבל אני מקבל

  11. 04:30

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

  12. 04:43

    והדרך הזאת מוצגת לפניי על ידי שני רכיבים, קריאתם נעשית מימין לשמאל. מימין לשמאל, וממילא אני קורא את הרכיב הנמצא מצד ימין ראשון, והוא מציין לי Clustered Index Seek.

  13. 04:59

    סרקתי את כל ה-Clustered Index ששמו הוא orders.pk_orders, שזהו אינדקס שנמצא תחת טבלת orders ושמו pk_orders כפי שראינו כאן מצד שמאל של הטבלה בעצם ברשימה שיש לנו כאן אינדקס בשם pk_orders כחלק שנוצר בעקבות בעצם הפריימרי כי סרקנו כאן ושימו לב רצינו להביא נתון אחד

  14. 05:29

    estimated numbers of rows or Executions בעצם שורה שאותה רצינו להביא הבאנו שורה אחת כפי שאתם רואים בדוגמא הזאת אנחנו מביאים כאן את המספר השורה ודבר נוסף מה שאנחנו כאן יכולים לגלות שבעצם כמה זמן ניתן לדאטאבס כמה זמן לקח לדאטאבס על מנת לבצע את הפעולה הזאת כלומר מה היה cost estimated operator cost או estimated io cost

  15. 06:10

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

  16. 06:43

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

  17. 07:09

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

  18. 07:26

    שימו לב אסטימטד numbers of row, טוב אני לא רשמתי כאן את הכל, לא רשמתי כאן את החלק של ה-worklose זה באמת לא חוכמה, נרשום כאן ונעשה לו קונטרול L, אנחנו עדיין מזהים כמובן שזה טייבל סקן, כיוון שאין לנו כאן אינדקס.

  19. 07:45

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

  20. 08:16

    לעומת זאת, ברגע שאני חוזר לאותה טבלה מאונדקס שאני נמצא בו Work Close עליה ויש לי כאן Clustered Index כשאני לוחץ כאן על ה-Ctrl-L ואני עומד על אותו Clustered Index Seek, מסתכל על הפרמטור של ה-Estimated Operator Cost, אני מגלה שעלויות הזמן שלי, עלויות הפעולה שלי היו ואכן 0.032 קטן משמעותית מהמספר של ה-0.018

  21. 09:05

    פעולה זו הייתה הרבה הרבה יותר מהירה הרבה יותר יעילה

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

ההרצאה הקודמת: מפתח ראשי ואינדקס

ההרצאה הבאה: אינדקס - Non-clustered Index

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

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