
הטקסט המלא של הדקות הראשונות בהרצאה «מפתח ראשי ואינדקס» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
טוב בהרצאה הזאת אנחנו נבין מה זה פריימרי כי מה זה פוריינקי מה זה כל המפתחות האלו ולמה צריך אותם ולמעשה בואו ניצור איזשהו דאטאבייס חדש משלנו נקרא לו לדוגמה קולג' מכללה נניח פרקטיקיו פי יו קולג' פרקטיקיו קולג' ונעשה לו אוקיי בתוך הדאטאבייס שלנו החדש אין
לו שום טבלה נעשה טבלה חדשה שנקראת סטיודנט איי די סטיודנט איי די זה מספר סידורי של התלמיד שזה מספרים רצים ונעשה את זה 1, 2, 3 ו-student name נניח כן s name student name ו-student id נקרא לזה ככה n זה אומר שזה unicode var זה אומר אורך משתנה n var char char זה אומר אותיות n var char אותיות בעברית באנגלית
ברוסית לא משנה מה כי זה unicode var זה אורך משתנה לפי הצורך וזה אותיות עד 50 תווים מצוין זה מה שאנחנו צריכים רק טבלה עם שם ומספר של התלמיד נשמור את הטבלה הזאת נקרא לה students ונעשה עוד טבלה שאומרת לדוגמה קורסים קורסים נקרא לזה קורס ID מספר סידורי
של הקורס ונעשה מספר סידורי של הקורס יפה ושם של הקורס שם של הקורס קורס name שם של הקורס מצוין או שהיה אתם יודעים יותר יפה יהיה עם התשלומים עם התשלומים זה יצא יותר יפה אז בואו נעשה payment ID payment ID מספר תשלום תשלום ראשון שני שלישי מספר רץ כזה סם סכום של תשלום
payment sum שזה יהיה money ונעשה עוד משהו שזה שאיזה תלמיד שילם את זה כן בואו נעשה לכל תשלום מי זה התלמיד ששילם אותו סטיודנט איי-די איזה תלמיד שילם את התשלום הזה אז יש לנו מספר תשלום סכום תשלום מספר תלמיד ששילם אותו ותאריך תשלום פיימנט דייט אוקיי פיימנט דייט יופי פיימנט דייט זה דאטה טיים דאטה טיים יופי וסטיודנט איי-די נשים פה יפה מאוד יפה מאוד נעשה סייב ונמלא קצת נתונים פיימנטס פיימנטס אני בא להראות לכם
בעיה שעוד דקה נראה אותה ונראה איך לפתור אותה על ידי המפתחות אז בואו נעשה תלמיד מספר אחד קוראים לו יוני תלמיד מספר שתיים קוראים לו משה תלמיד מספר שלוש קוראים לה דנה אז הנה יש לנו פה שלושה נתונים סלקט שלושה תלמידים יופי פיימנס פיימנס אדיט נכניס קצת נתונים לפיימנס תשלום ראשון עשה תלמיד ראשון שילם 100 שקל
עשה את זה ב-2012 ראשון לראשון ותשלום שני עשה סטיודנט ראשון אותו תלמיד עשה עוד תשלום של 500 שקל ועשה את זה ב-2012 חודש חמישי ב-19 לחודש יפה ותשלום שלישי עשה תלמיד שני שילם 800 שקל ועשה את זה ב-2013 בחודש תשיעי ב-8 לחודש יופי, אז יש לנו כל מיני תאריכים, תשלומים.
עכשיו, הכל נראה בסדר. בואו נראה שזה באמת בסדר, באמת בסדר. אבל מה הבעיה? תסתכלו, פקידת האטה עשתה שתשלום רביעי עשה תלמיד מספר 7.
והוא שילם 400 שקל, והוא עשה את זה נניח ב-2014. סתם אני ממציא תאריכים, זה לא באמת משנה. עכשיו, איפה הבעיה? הבעיה זה לא בתאריך, עזבו את התאריך, זה צ'ק דחוי נניח.
הבעיה היא שאין תלמיד 7. תסתכלו טוב, אנחנו באים לעשות בדיקה ואנחנו לא מוצאים מי ישלם את הכסף, יש לנו פה בעיה שאין לנו מי ישלם את הכסף. יש לנו שלושה תלמידים ובטעות כתוב שתלמיד מספר 7 שילם 400 שקל ואנחנו לא יודעים למי להוציא חשבונית, אנחנו לא יודעים מי ישלם.
תחשבו שזה בעיה? יפה. אנחנו רוצים שהדאטאבייס ישמור על עצמו. דאטאבייס לא ייתן להכניס לעמודה הזאת של סטודנטס בטבלת פיימנטס, העמודה הזאת פה תהיה קשורה לעמודה הזאת סטיודנט איי-די. למעשה יש קשר לוגי בין שתי העמודות האלו
והוא לא אמור לנחש את זה, כן? מאיפה הוא אמור לדעת שקראתי להם באותו שם, אז יש לזה משמעות. יכלתי לקרוא לזה גם בשמות שונים.
אפשר גם לקרוא דרך אגב לעמודות אפילו בשמות בעברית, כן? רק לא לעשות את זה בשום פנים ואופן, אבל זה אפשרי. אז אנחנו רוצים שהדאטאבס יגן על עצמו וכל פעם שמישהו בא להכניס ערך לpayments לפה לסטיודנט איי-די, עמודת סטיודנט איידי
בטבלת פיימנטס הוא יבדוק שקיים ערך כבר בסטיודנטס שלא ייתן להכניס פה לפה משהו שלא קיים כאן הבנתם מעין הגנה כזאת זה נקרא בדיוק מפתח משני זה מפתח משני וזה מפתח ראשי יפה אז בואו נתחיל לעשות את זה למעשה מפתח ראשי זה קצת יותר מזה בואו נעשה את המפתח ראשי ונתחיל לדבר על זה אז דבר ראשון אני אעשה מפתח ראשי מה המשמעות של מפתח ראשי ברגע שאני עושה פה פריימרי
ומי שרוצה לדעת איך עושים את זה ב-SQL יש פה למעלה סקריפט ואנחנו נוכל לראות את הסקריפט הזה. אנחנו יכולים לראות פה בדיוק איך הוא עושה קונסטריינט מגבלה של בעצם פריימרי קי.
בואו תראו אבל זה פחות מעניין אותנו הפקודות עצמם מה שמעניין אותנו זה בעצם המשמעות של זה כן על הפקודות אנחנו גם נעבור בסרטים אחרים זה לא זה לא מה שמעניין עכשיו איפה קונסטריינט הנה אלתר טייבל תשנה טבלה תוסיף קונסטריינט תמציא לו איזשהו שם constraint זה מגבלה שמסוג primary key clustered קלאסטרד זה אומר שזה
מסודר בארדיסק לפי ה-primary key על עמודה שקוראים לה student ID אלטר טייבל איזה שם טבלה add constraint תוסיף מגבלה שם של איזשהו שם שבא לכם primary key student הוא נתן יכולתם לעשות גם aaa מסוג primary key clustered יפה מה זה אומר זה אומר ככה שקודם כל בפריימרי קי אסור שיהיו שני ערכים עם אותו מספר.
בפריימרי קי הוא חייב להיות יוניקי, זה מפתח יוניקי. זה אומר שלא ייתכן שיהיו שני תלמידים עם מספר אחד.
לפני שאני עושה את זה, עד שלא עשיתי אוקיי, שימו לב, אפשר לעשות פה טעות. אפשר לעשות פה טעות ולהכניס עוד תלמיד מספר אחד בשם לא יודע מה, פולי.
אתם רואים, הוא נותן, הוא לא אומר לך שיש פה בעיה. פריימרי קי לא יאפשר את זה. פריימרי קי ידרוש שהעמודה שיש עליה פריימרי קי תהיה יוניקית, ייחודית, כן?
זה כמו אינדקס יוניקי, כן? שלא ייתכן שני עמודים בספר עם אותו מספר, לא ייתכן שני אנשים עם אותו מספר. פריימרי קי יוודא את זה.
זה דבר ראשון. דבר שני, פריימרי קי יבדוק, יסדר בעצם את הנתונים בארדיסק לפי הסדר של הפריימרי קי. זה אומר שאם הייתי עושה את זה על שמות הוא היה מסדר פיזית בארדיסק בתוך הקובץ שמות לפי הסדר הזה זה למעשה אינדקס פיזי דומה למספר עמוד בספר אתם יודעים בספר העמודים מסודרים לפי
המספר עמוד כן אז זה פריימרי קי שלו ותמיד הוא ישמור עליו זאת אומרת גם אם אני אכניס בן אדם עם שם נניח הייתי עושה פה פריימרי קי על זה אם אני אוסיף עוד שורה עם מספר נניח פתאום שצריך להיות באמצע הוא יזיז את הכל ויכניס אותו במקום הנכון אז פריימרי קי מסדר פיזית את קובץ לפי העמודה הזאת ודואג לשמור על הסדר ולכן החיפוש הוא מאוד מאוד מהיר כי זה מסודר
ולא צריך לעבור על כל הרשימה. תחשבו שיש פה מיליון שורות הוא לא צריך לעבור על כל המיליון שורות כי אם אתה אומר לו שאתה צריך תלמיד מספר 74 הוא בודק מחלק טבלה בחצי ובודק כל פעם עושה חצי חצי חצי ומגיע צ'יק צ'אק לנתון האמיתי הוא לא צריך לעבור על כל הרשימה על הראשון שני שלישי רביעי חמישי הוא מגיע לחצי רואה קטן גדול קטן הולך למעלה עושה חצי חצי עוד קטן
עד שהוא כל פעם מצמצם בחצי עד שהוא מגיע תוך כמה קפיצות לנתון האמיתי שביקשת למספר תלמיד אמיתי ואילו לא היה פריימרי כי אילו היה סלט שימו לב מה זה סלט סלט זה כשנניח הייתי עושה פה תלמיד מספר 88 בלה בלה ואחרי זה עושה תלמיד 6 ואחרי זה עושה תלמיד 17 ואחרי זה עושה תלמיד 7 עכשיו ברגע שזה לא מסודר פיזית בהרדיסק לפי סטיודנט האיי אני אגיד
לו למצוא תלמיד מספר 7 הוא לא ידע הוא יצטרך לעבור על כל השורות כי אולי זה למעלה אולי זה למטה הסדר הפיזי בעצם עוזר לי במהירות חיפוש הוא מונע לי צורך לעבור על כל השורות תחשבו כמה זה חשוב אם יש לי מיליוני פעולות בבנק או שדאטאבייס של כל קליק בתוכנה שלי נרשם בדאטאבייס שיש לי איזשהו דאטאבייס שכל הקליקים באתר
האינטרנט שלי נכנסים לדאטאבייס הזה ואז אני יודע איפה בן אדם לחץ. אז כשמדובר על נתונים גדולים על הרבה שורות לסרוק את כל הטבלה זה מאוד מאוד קשה הסידור הפיזי בעצם האינדקס זה נקרא אינדקס חוסך את הצורך לעבור על כל השורות הוא יכול כל פעם להגיע לחצי ולדעת אם זה קטן או גדול מחצי כן תחשבו שעכשיו אני מוחק
שורה הזאת אני עכשיו מוחק את השורות האלו ומסדר אותם לפי סדר 1,2,3,6,7 זה לא חייב להיות סדר רציף אבל זה חייב להיות מצודר ועכשיו זה יהיה חיים וזה יהיה לא יודע מה יוסי עכשיו ברגע שאני אגיד לו תמצא לי תלמיד מספר 6 הוא יגיע לחצי יגיד 3 או אני צריך יותר גדול יגיע לחצי יגיד או מצאתי בדיוק הוא יוכל לקפוץ כי זה מסודר אז
פריימרי קי זה סוג של אינדקס זה למעשה קלאסטרד אינדקס נקרא בשפה המקצועית זה מסודר פיזית לפי האינדקס והוא מונע הכנסת נתונים כפולים לאותו עמודה והוא לא מאפשר נאלים.
נאלים זה אומר שאין ערך בכלל. זאת אומרת דילגנו על השדה, אין דבר כזה, חייבים להכניס לשם ערך. בואו נשמור ונראה איך עכשיו המציאות שלנו השתנתה.
אנחנו עכשיו נעשה עוד פעם אדיט ונראה שלושת התכונות שדיברנו עליהן. א', אי אפשר להכניס עוד אחד באותו שם. זאת אומרת אי אפשר לעשות עוד אחד שקוראים לו בלה בלה.
הוא אומר תיזהר אני לא מוכן לקבל את זה לפני כן הוא היה מוכן לעשות עכשיו הוא לא מוכן לקבל דאטאבייס ומגן על עצמו זה נקרא cannot insert duplicate keys אי אפשר להכניס duplicate keys למה כי יש לך primary key בשם pk students ראינו כן והוליישן הפרה של primary key constraint של מגבלת primary key מפתח ראשי בשם pk student הוא לא נותן לך להכניס את זה הוא אומר מבחינתי לא קיבלתי את זה הקליינט או האתר אינטרנט או אפליקציה
באייפון או התוכנה בווינדוס מקבלת חזרה, ארור, לא קיבלנו, לא נכנס, תעשה עם זה מה שאתה רוצה, דאטאבייסט לא מוכן לקבל נתונים לא נכונים.
אז תכונה ראשונה, אי אפשר להכניס נתונים כפולים, אי אפשר לעשות מפתח עם אותו מספר. דבר שני, אי אפשר לעשות לו נאל, כן, אי אפשר לדלג בכלל, אי אפשר להכניס לו כלום פה.
קונטרול אפס עושה לי נאל, הוא לא מוכן לקבל את זה. אני עושה טאב כדי לעבור לטאב הבא, הוא לא מוכן. הוא אומר, אתה לא יכול להכניס לפה סייל, אתה זה, דזנוט אלא הוא נעל, אין דבר כזה שאתה מכניס לנעל.
יפה, אז אמרנו את זה, אמרנו את זה, ואמרנו שהוא מסדר את זה לפי הסדר. טוב, את זה אנחנו לא נוכל לראות כל כך. בואו ננסה לעשות לו ארבע, ולקרוא לזה בלה בלה בלה.
ואם נעשה רפרש, אתם רואים פה שהוא סידר אותו למקום הנכון, מה שלא היה לפני כן. אבל מה שיותר חשוב זה לא התצוגה פה, שזה אפשר לשחק עם זה.
מה שחשוב באמת זה שבארט דיסק זה מסודר בסדר הנכון, וכשנעשה סלקט, נוכל למצוא את זה מאוד מאוד מהר. יפה. דרך אגב, מי שרוצה לדעת, אנחנו כרגע לא ניכנס לזה, אבל אם אנחנו נעשה סלקט כוכבית from students, where נניח student ID שווה 6, כשאתם תבואו לעשות Execution,
יש לכם פה לראות Execution Plan. אסטימטת אקסיקיושן פלאן, מה הוא הולך לעשות? אתם יכולים לראות פה שהוא עובר על האינדקס, פה אתם רואים פלאן, מה הוא הולך לעשות? אז הוא הולך לעבור על האינדקס ולתת תוצאה לסלקט, אם היו עוד שלבים כמו גרוביי וכל מיני שלבי סינון ואיחוד, הייתם רואים פה את כל השלבים.
הפלאן הזה אומר לי, תראה, אני עובר על סיק על אינדקס, סיק על אינדקס זה אומר אני מחפש באינדקס, לעומת אופציה אחרת של סקן, סקן זה אומר שאני עובר על כל הטבלה.
עכשיו ההבדל בין סיק לסקן הוא אדיר, מי שהתעסק בדאטאבייס האמיתי זה אלף בית של האלף בית, יודע שברגע שמשהו לא זז, דבר ראשון עושים לו אינדקסים, כן?
זה כמו שבספר אני לא אחפש נניח איזושהי מילה מקצועית, אני אלך לסוף של הספר ויש שם אינדקס עם כל המילים המקצועיות, מהמושגים המקצועיים, באיזה עמוד הם עושים את זה, אם תיקחו את הספר ההווה של מייקרוסופט ותרצו לדעת איך עושים אינדקס אתם לא תחפשו עמוד עמוד בספר כי זה ייקח לכם המון המון זמן
ספר של sql מאוד מאוד עבה ולא ברור בכלל אם אתם תרצו למצוא משהו שקשור לאינדקסים אתם לא תעברו עמוד עמוד לא תעשו scan אלא תלכו לסוף הספר תראו איפה באיזה עמוד זה מופיע וזה נקרא אינדקס באיזה עמוד זה מופיע ותגיעו ישירות לעמוד הזה, תפתחו באמצע של הספר, תראו קטן או גדול ותדעו לאן ללכת.
אז זה ההבדל בין סיק לסקן וההבדל הוא אדיר. אם הייתי רוצה לעשות סקן, אני לא בטוח שאני עכשיו אצליח. לייק אחוז בלה אחוז, בואו נראה מה ה-execution plan של זה ייתן לי.
אינדקס סקן, הוא עדיין באינדקס סקן. טוב, אני אכין לכם אחרי זה דוגמה. יותר טובה ששם רואים שזה עובד עם הנה זה scan נכון זה מה שרציתי להראות לכם זה scan לעומת מה שהיה לפני כן התבלבלתי עם עצמי כבר איפה הדוגמא הקודמת לעומת הדבר הזה שהיה שזה לא היה scan הדוגמא הקודמת הייתה שזה היה scan וזה היה seek s name like אנחנו עכשיו ממש רואים מה זה אינדקס זה מאוד מאוד חשוב אנחנו תכף תראה
שאפשר לעשות אינדקס לא רק על ידי פריימרי, כי יהיה לה על כל עמודה למעשה. זאת נקודה מאוד מאוד חשובה, כי היא משפיעה מאוד מאוד על הביצועים בלה, ואם נעשה פה, הנה הוא הצליח, שני שאילתות טובות, זה מצא שש וזה מצא בלה, ואם נעשה פה אקספיושן פלאן, אתם יכולים לראות שבראשון הוא עשה סיק, ובשני הוא עשה סקן.
אתם רואים? בראשון הוא עשה סקן, הסקן זה אומר עבר על כל הטבלה, ואם היה פה מיליון שורות היה לוקח לו הרבה יותר זמן, הוא מציג, עבר, קפץ כל פעם בחצי ועשה את זה מאוד מאוד זריז.
אם אני אוסיף אינדקס לעמודת s name, אני אנדקס אותה, זה אומר שהוא מקים טבלה קטנת עזר בצד, מעתיק לשם את כל השמות, מסדר אותם לפי האלף בית ומפנה לינקים לעמודה הראשית, לעמודת ה-id, מעין טבלת עזר שאתם לא רואים אותה, ב-oracle כן רואים אותה, פה אתם לא רואים אותה, זה נקרא לעשות אינדקס בואו נעשה אינדקס חדש
ונקרא לו ניו אינדקס למה הוא לא עושה לי ניו