en-UShe-IL
You are here:   Blog
Register   |  Login

Blog Archive:

Maximize
* Can be used in order to search for older blogs Entries

Search in blogs


Blog Categories:

Maximize
* Can be used in order to search for blogs Entries by Categories

Blog Tags:

Maximize
* Can be used in order to search for blogs by keywords

TNWikiSummit


Awared MVP 


 


Microsoft® Community Contributor 


Microsoft® Community Contributor


 Read first, before you you use the blog! Maximize
אוק13

Written by: ronen ariely
13/10/2019 09:56 RssIcon

הקדמה

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

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

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

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

לפני כשנתיים באירוע של SQL Saturday הצגתי הרצאה בנושא זה, כאשר התמקדנו באובייקט הפיזי הקטן ביותר אשר אנחנו שומרים על הדיסק - הערך הבודד אשר אנחנו שומרים בטור של שורה טבלה. במפגש זה ייצרתי מסד נתונים חדש -> בניתי טבלה חדשה -> והוספתי לטבלה כמה שורות עם ערכים אשר נתנו לי אנשים בקהל, בכדי להראות שכל הדמו נעשה חי. לאחר הכנסת המידע אל מסד הנתונים ביצעתי ניתוק של מסד הנתונים מהשרת (Detach) ופתחתי את הקובץ של הדטא mdf בעורך הקסדיסימלי (תוכנת Notepad++).

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

השרת שומר את המידע ביחידות הנקראות עמוד (Page) אשר הגודל שלהם הוא 8kb, וישנם סוגי שונים של עמודים עבור מידע שונה. בכל מקרה זה עוד נושא מעניין של הרצאה שונה המתמקדת בסוגי העמודים, אבל לצורך הנושא של היום כמו גם בהרצאה הקודמת אני מתמקד רק בעמודים הכוללים שת הדטא עצמו (הערכים אשר מכניסים לטבלאות).

הרצאה נוספת אשר אני מעביר לפעמים, היא ברמה גבוהה יותר בהיראריכה של האובייקטים - המבנה הפיזי (בדיסק) של השורות בטבלה. בטבלאות פשוטות, המידע נשמר בצורת Row Store, ז"א כל שורה נשמרת כיחידה פיזית אחת בדיסק. בשל המגבלה של גודל page, לעיתים השרת "נאלץ" לשמור חלק מהמידע של השורה מחוץ למקום הפיזי של השורה. במקרה כזה במיקום בו היה אמור השרת לשמור את המידע של הטור, השרת שומר pointer (מצביע) אל המקום הפיזי בו נשמר המידע, כך שהמבנה הכללי של השורה מתקיים גם כאן. שרתי SQL עובדים ברמת השורה וקוראים/כותבים את כל השורה. ז"א השרת לא קורא טור בודד מתוך השורה ולכן מבחינת פעולה הקריאה/כתיבה של המידע אין משמעות לסדר הטורים בטבלה... או שאולי יש משמעות?!?

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

חידה - האם יש חשיבות לסדר טורים בטבלה

אני רוצה לפתוח את המפגש היום עם שאלה פשוטה, ומאוד נפוצה בפורומים: מה אתם אומרים, כאשר אנחנו יוצרים טבלה, האם יש חשיבות לסדר של הטורים? 

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

... נסו לענות על השאלה לפני שאתם ממשיכים לקרוא...

תשוובת מייצגות מהאינטרנט:

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

מכירים את המשפט "אין טוב ממראה עיניים" ?

בלשב זה הצגתי הדגמה פשוטה:

1. ייצרתי שני מסדי נתונים חדשים לחלוטין.

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

התוצאות שקיבלו היממו את הקהל אם אני יכול לשפות לפי התגובות😮

בהרצה הראשונה קיבלנו טבלה שתופסת 5315 עמודים בדיסק וגודל מסד הנתונים עלה ל 160MB, אבל כאשר החלפנו את סדר הטורים והרצנו את אותו סקריפט בדיוק אז הטבלה תפסה 10315 עמודים וגודל מסד הנתונים היה 288MB. כמעט פי שתיים בגודל כאשר כל השינוי היה סדר הטורים בטבלה!🙄



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

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

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

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

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

http://ariely.info/Blog/tabid/83/EntryId/226/SQL-Internals-Physical-Table-Structure-under-the-hood-and-implementation-on-real-case-scenarios.aspx

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

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

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

שוב תודה לכל מי שהגיע למפגש
ולהראות בהרצאות הבאות שלי ובמפגשי קהילת ה Data Platforms