none
הוספת עמודה לטבלא גדולה RRS feed

  • שאלה

  • היי לכולם,

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

    יש לי טבלא עם 10M (ב-prod זה יותר, לא יודע בדיוק כמה) רשומות, שהיא clustered index, יש עליה גם nonclustered indexes 9 . אני רוצה להוסיף עמודה נוספת שהיא nullable מסוג int, לעדכן אותה ל-1 ולהפוך אותה ל-not nullable. השאלה היא האם האינדקסים כלל מושפעים מהפעולה? כעיקרון ממליצים באינטרנט למחוק את האינדקסים ואומרים שזה ישפר, אבל אני באמת לא רואה איך... כל עוד אני לא נוגע ב- clustered index (ואני לא רואה סיבה לגעת בו) אני לא רואה איך האינדקסים מפריעים במקרה הספציפי הזה. האם אני צודק?


    • נערך על-ידי Ivan Radchenko יום שני 17 מרץ 2014 08:37
    יום שני 17 מרץ 2014 08:34

תשובות

  • היי רונן,

    אני לא בטוח שאני מסכים.

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

    איוון, יש לך לינק לחלוק שבו אומרים את זה? 


    Matan Yungman
    SQL Server Expert, Blogger and Podcaster
    Blog
    Podcast

    • סומן כתשובה על-ידי Ivan Radchenko יום שלישי 18 מרץ 2014 16:01
    יום שני 17 מרץ 2014 20:40
  • הי,

    אני אנסה לעשות קצת סדר...

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

    מה ש-Kalen Delaney כתבה הוא נכון, והוא מתייחס למקומות שבהם מופיע ה-Clustered Index Key בתוך ה-Non-Clustered Indexes. במקרה אחד הוא מופיע רק בעלים של האינדקס, ובמקרה אחר הוא מופיע בכל האינדקס, כאילו היה Index Key לכל דבר.

    מקווה שעזרתי...

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    • סומן כתשובה על-ידי Ivan Radchenko יום שלישי 18 מרץ 2014 16:01
    יום שלישי 18 מרץ 2014 13:12
    מנחה דיון

כל התגובות

  • היי לכולם,

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

    יש לי טבלא עם 10M (ב-prod זה יותר, לא יודע בדיוק כמה) רשומות, שהיא clustered index, יש עליה גם nonclustered indexes 9 . אני רוצה להוסיף עמודה נוספת שהיא nullable מסוג int, לעדכן אותה ל-1 ולהפוך אותה ל-not nullable. השאלה היא האם האינדקסים כלל מושפעים מהפעולה? כעיקרון ממליצים באינטרנט למחוק את האינדקסים ואומרים שזה ישפר, אבל אני באמת לא רואה איך... כל עוד אני לא נוגע ב- clustered index (ואני לא רואה סיבה לגעת בו) אני לא רואה איך האינדקסים מפריעים במקרה הספציפי הזה. האם אני צודק?


    באופן ערוני אתה טועה (כמובן שכל מקרה לגופו של עניין)

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

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


    [Personal Site] [Blog] [Facebook]signature

    יום שני 17 מרץ 2014 17:00
    מנחה דיון
  • היי רונן,

    אני לא בטוח שאני מסכים.

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

    איוון, יש לך לינק לחלוק שבו אומרים את זה? 


    Matan Yungman
    SQL Server Expert, Blogger and Podcaster
    Blog
    Podcast

    • סומן כתשובה על-ידי Ivan Radchenko יום שלישי 18 מרץ 2014 16:01
    יום שני 17 מרץ 2014 20:40
  • אהלן מתן, אני לא חושב שאמרתי משהו מנוגד לכך' במקרים מסויימים, אבל אולי לא הסברתי שכאשר אני כותב "כל מקרה לגופו" אז הכוונה שאני לא כותב על מקרה מסויים כרגע, אלא נותן הסבר כללי. פשוט מפני שאולי לא נכנסתי לעומק למצב הנוכחי ולאפשרויות הספציפיות שחלק מהמידע לא סופק לנו (כמו למשל האם האינדקסים ייחודיים או לא). בגלל זה אנחנו צריכים תמיד DDL ואפיון מערכת לפני דיון ספציפי

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

    הגיע הזמן לדון בנקודה שהעלת :-)

    השאלה הגדולה היא איזה דטא נשמר במקרה הנוכחי שבו יש nonclustered index וגם clustered index. אני מסכים שבעקרון אם יש CLUSTER אז למה לשמור את המיפוי למקור? למה לא לשמור את המיפוי ל CLUSTERED, אבל האם באמת נשמר מיפוי לאינדקס תמיד? זה לא מה שאני מבין אם כי זה הדרך שניראית במבט ראשון. אם אני אצטט את Kalen Delaney

    when the nonclustered index was unique, clustered key(s) are stored as INCLUDE columns, which means they just show up at the leaf level. They are not needed as part of the nonclustered key.

    However, if the clustered index is unique and you have a nonunique nonclustered index, we get the opposite behavior. Even if we declare the clustered key column as an INCLUDE column, it is actually stored as a KEY column.

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

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


    [Personal Site] [Blog] [Facebook]signature

    • נערך על-ידי pituachMVP, Editor יום שלישי 18 מרץ 2014 05:18 תיקון שגיאות הקלדה מרובות (אותיות חסרות... אולי תקלה במקלדת)
    יום שני 17 מרץ 2014 21:44
    מנחה דיון
  • איבן צהריים טובים

    חזרתי כרגע מאירוע ההשקה של ה sql server 2014, הפניתי את הנושא לאחד המובילים בתחום ממייקרסופט וקיבלתי תשובה שהוא לא מודע למה שכתוב במאמר עליו התבססתי. אני רואה כמה אפשריות: (1) הוא אכן לא מודע לכך, אפשרי אם כי אני כבר קיבלתי ממנו תשובה בעבר לדברים שהייתי צריך עזרה וקיבלתי את הרושם שהוא הכתובת לשאול שאלה אם אני לא מוצא את התשובה. (2) אני לא הבנתי את המאמר טוב או קיבלתי מסקנה לא נכונה. (3) אני לא הברתי את עצמי מספיק טוב (כשתיארתי את ההסבר כאן או האירוע היום). לכן אני רוצה עדיין רוצה לבדוק את הנושא לעומק יותר אבל בינתים אני נשאר עם הגישה שהסברתי כאן (בקימצור רציתי לציין רק לקחת את זה בערבות מוגבל). בכל מקרה הבסיס ברור ומקובל על כולם לגבי מה קורה אם אין CLUSTERED אינדקס או לגבי ה CLUSTERED אינדקס עצמו שמושפע כמובן ישירות (גם לגבי ה NONCLUSTERED במקרה שאין ייחודיות הדברים ברורים ומוסכמים).


    [Personal Site] [Blog] [Facebook]signature

    יום שלישי 18 מרץ 2014 11:53
    מנחה דיון
  • הי,

    אני אנסה לעשות קצת סדר...

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

    מה ש-Kalen Delaney כתבה הוא נכון, והוא מתייחס למקומות שבהם מופיע ה-Clustered Index Key בתוך ה-Non-Clustered Indexes. במקרה אחד הוא מופיע רק בעלים של האינדקס, ובמקרה אחר הוא מופיע בכל האינדקס, כאילו היה Index Key לכל דבר.

    מקווה שעזרתי...

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    • סומן כתשובה על-ידי Ivan Radchenko יום שלישי 18 מרץ 2014 16:01
    יום שלישי 18 מרץ 2014 13:12
    מנחה דיון
  • תודה רבה לכולם,

    אני ממש שמח שצדקתי! :)

    יום שלישי 18 מרץ 2014 16:03
  • תודה על ההבהרה, אני עדיין ממתין לתגובה ממישהו ממייקרוסופט שפיניתי אליו בנושא כדי לגבש הסכמה סופית :-)

    [Personal Site] [Blog] [Facebook]signature

    יום שלישי 18 מרץ 2014 17:05
    מנחה דיון