none
Columnstore Indexes RRS feed

  • שאלה

  •  היי,

    רצית עזרה  בהבנה של התכונה החדשה שנקראת Columnstore Indexes .

    הרי אם אני יצור אינדקס רגיל על עמודה מסוג FNAME מטבלת  לקוחות SQL  ישלוף את כל  הערכים מהטבלה

    ימיין אותם - BTREE ושים אותם ב pages . ( בעצם עשינו פה מ ש Columnstore   - רק שהוא לא עושה את btree)

    - ומה עושה Columnstore  אותו דבר לוקח את כל הערכים ושם אותם ב pages.

    אז אני לא מבין מה הרעיון ולמה   Columnstore Indexes  זה ברמת עמודה.....  ואינדקס רגיל זה לא ברמת עמודה? 

    עוד דבר שאני לאמבין כחלק מהמכלול  - אומרים SQL שומר את הנתונים ברמת שורה - שזה בסדר אבל ברגע שמקימים אינדקס

    הוא שומר וממין את הנתונים ברמת עמודה בדפים - בקיצור אני מבולבל  :)

    מכאן  רמת האיחסון נשארה עדיין  page    על עמודה  גם באינדקס  רגיל וגם Columnstore Indexes   ובשתי המקרים זה על עמודה.

    תודה מראש על העזרה.

    שרון

    יום רביעי 27 יוני 2012 13:56

תשובות

  • הי שרון,

    אינדקס רגיל (RowStore) שומר את הנתונים במבנה של שורות, אחת אחרי השניה. כל רשומה באינדקס מייצגת שורה בטבלה. אם זהו Clustered Index, אז זוהי השורה כולה, ואם זה Non-Clustered Index, אז יש לך הצבעה לשורה עצמה. ההצבעה יכולה להיעשות או באמצעות ה-Clustered Index Key או באמצעות Row Identifier, במידה ומדובר ב-Heap. בכל מקרה, ב-Leaf Pages של האינדקס אף פעם לא ישמרו רק הערכים של עמודה אחת. יכול להיות שהאינדקס מורכב מכמה עמודות, ויש גם את ההצבעה לשורה עצמה.

    לעומת זאת, ב-ColumnStore Index, הנתונים נשמרים במבנה של עמודות. בכל Page יש אך ורק את הערכים של עמודה אחת, ממוינים כמובן. אין שום הצבעה לשורה עצמה. אתה לא יכול לגשת באופן ישיר מערך מסוים בעמודה מסויימת בתוך ה-ColumnStore Index לשורה בטבלה, כמו שאפשר לעשות באינדקס רגיל. המבנה הזה מאפשר דחיסה מאוד טובה, בעיקר אם יש הרבה חזרות על אותם ערכים. כמו כן, Microsoft משתמשים בטכנולוגיית Vertipaq על מנת לדחוס את הנתונים בצורה אפילו יותר טובה ולהחזיק את האינדקס בצורה יעילה בזיכרון. זוהי אותה טכנולוגיה שקיימת ב-PowerPivot, למשל. אידנקס רגיל לא משתמש ב-Vertipaq.

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

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

    • סומן כתשובה על-ידי sharonof יום חמישי 28 יוני 2012 14:54
    יום חמישי 28 יוני 2012 04:32
    מנחה דיון
  • כתבתי על זה פוסט- אולי ההסבר שם יאיר את עיניך:

    http://blogs.microsoft.co.il/blogs/gerireshef/archive/2011/11/18/GR20111118.aspx


    Blog: http://about.me/GeriReshef

    • סומן כתשובה על-ידי sharonof יום חמישי 28 יוני 2012 14:55
    יום רביעי 27 יוני 2012 17:09

כל התגובות

  • כתבתי על זה פוסט- אולי ההסבר שם יאיר את עיניך:

    http://blogs.microsoft.co.il/blogs/gerireshef/archive/2011/11/18/GR20111118.aspx


    Blog: http://about.me/GeriReshef

    • סומן כתשובה על-ידי sharonof יום חמישי 28 יוני 2012 14:55
    יום רביעי 27 יוני 2012 17:09
  • גרי הוספתי הערה קטנה בפוסט (עדיין לא רואים) לגבי ההערה האחרונה שלך. ההערה לא מדוייקת מפני שניתן לבצע עדכון בטבלאות עם מחיצות. זה משהו שלמדתי לא מזמן ממאיר בכנס של SQL EXPLORE. ואז הרחבתי את הידע ממייקרוספט. לפי מה שמצאתי אינדקס טורי נועד בעקרון לטבלאות עם מחיצות. כמו כן הוא אינו מקביל למצב של read only, ויותר מכך... נאמר שבעתיד זה אולי ישתנה וגם עדכון ישיר יתאפשר.

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


    signature

    יום רביעי 27 יוני 2012 21:38
    מנחה דיון
  • הי שרון,

    אינדקס רגיל (RowStore) שומר את הנתונים במבנה של שורות, אחת אחרי השניה. כל רשומה באינדקס מייצגת שורה בטבלה. אם זהו Clustered Index, אז זוהי השורה כולה, ואם זה Non-Clustered Index, אז יש לך הצבעה לשורה עצמה. ההצבעה יכולה להיעשות או באמצעות ה-Clustered Index Key או באמצעות Row Identifier, במידה ומדובר ב-Heap. בכל מקרה, ב-Leaf Pages של האינדקס אף פעם לא ישמרו רק הערכים של עמודה אחת. יכול להיות שהאינדקס מורכב מכמה עמודות, ויש גם את ההצבעה לשורה עצמה.

    לעומת זאת, ב-ColumnStore Index, הנתונים נשמרים במבנה של עמודות. בכל Page יש אך ורק את הערכים של עמודה אחת, ממוינים כמובן. אין שום הצבעה לשורה עצמה. אתה לא יכול לגשת באופן ישיר מערך מסוים בעמודה מסויימת בתוך ה-ColumnStore Index לשורה בטבלה, כמו שאפשר לעשות באינדקס רגיל. המבנה הזה מאפשר דחיסה מאוד טובה, בעיקר אם יש הרבה חזרות על אותם ערכים. כמו כן, Microsoft משתמשים בטכנולוגיית Vertipaq על מנת לדחוס את הנתונים בצורה אפילו יותר טובה ולהחזיק את האינדקס בצורה יעילה בזיכרון. זוהי אותה טכנולוגיה שקיימת ב-PowerPivot, למשל. אידנקס רגיל לא משתמש ב-Vertipaq.

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

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

    • סומן כתשובה על-ידי sharonof יום חמישי 28 יוני 2012 14:54
    יום חמישי 28 יוני 2012 04:32
    מנחה דיון
  • "ממונים כמובן"...

    ממוינים על פי מה? :-)


    Ami Levin, SQL Server MVP. CTO, DBSophic LTD. - http://www.dbsophic.com/ --Performance is the most significant driver in maintaining data and service availability.--

    יום חמישי 28 יוני 2012 11:18
  • הי עמי,

    ממוינים לפי אותה עמודה. כל עמודה ממויינת בפני עצמה.

    לא בטוח שהבנתי את השאלה...

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

    יום חמישי 28 יוני 2012 14:16
    מנחה דיון
  • תודה רבה זה נראה לי  עכשיו יותר הרבה יותר ברור
    יום חמישי 28 יוני 2012 14:55
  • ההמלצה היא לייצר אינדקס אחסון-טורי אחד על כל הטורים בטבלה שעבורם תרצה לבצע אגרגציות.

    בנוסף, ה Batch Mode עובד עם Hash Joins.

    זה לא B-TREE... אתה לא יכול להשתמש באינדקס הזה ל SEEK...

    אז מה המשמעות של מיון כאן?


    Ami Levin, SQL Server MVP. CTO, DBSophic LTD. - http://www.dbsophic.com/ --Performance is the most significant driver in maintaining data and service availability.--

    יום חמישי 28 יוני 2012 16:14
  • הי עמי,

    טעות שלי! תודה רבה על ההערה!

    אני מתקן...

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

    אבל בכל מקרה, הערכים לא ממוינים, כמו שכתב עמי.

    שוב, תודה על התיקון וסליחה על הטעות...

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

    יום ראשון 01 יולי 2012 04:06
    מנחה דיון