הבלוג של גרי רשף

08/01/2011

חסכו ואמצו: Sparse Columns – מבט נוסף

Filed under: Uncategorized — תגיות: , , — גרי רשף @ 05:52

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

ניצור שוב שתי טבלאות, הפעם בנות 100 עמדות Int, כשבראשונה הן Sparse ובשניה לא:

Use tempdb;

Go

If Object_Id('T1') Is Not Null Drop Table T1;

If Object_Id('T2') Is Not Null Drop Table T2;

Go

Create Table T1(I00 Int Sparse Null,

                I01 Int Sparse Null,

                I02 Int Sparse Null,

                I03 Int Sparse Null,

                I04 Int Sparse Null,

                I05 Int Sparse Null,

                I06 Int Sparse Null,

                I07 Int Sparse Null,

                I08 Int Sparse Null,

                I09 Int Sparse Null,

                I10 Int Sparse Null,

                I11 Int Sparse Null,

                I12 Int Sparse Null,

                I13 Int Sparse Null,

                I14 Int Sparse Null,

                I15 Int Sparse Null,

                I16 Int Sparse Null,

                I17 Int Sparse Null,

                I18 Int Sparse Null,

                I19 Int Sparse Null,

                I20 Int Sparse Null,

                I21 Int Sparse Null,

                I22 Int Sparse Null,

                I23 Int Sparse Null,

                I24 Int Sparse Null,

                I25 Int Sparse Null,

                I26 Int Sparse Null,

                I27 Int Sparse Null,

                I28 Int Sparse Null,

                I29 Int Sparse Null,

                I30 Int Sparse Null,

                I31 Int Sparse Null,

                I32 Int Sparse Null,

                I33 Int Sparse Null,

                I34 Int Sparse Null,

                I35 Int Sparse Null,

                I36 Int Sparse Null,

                I37 Int Sparse Null,

                I38 Int Sparse Null,

                I39 Int Sparse Null,

                I40 Int Sparse Null,

                I41 Int Sparse Null,

                I42 Int Sparse Null,

                I43 Int Sparse Null,

                I44 Int Sparse Null,

                I45 Int Sparse Null,

                I46 Int Sparse Null,

                I47 Int Sparse Null,

                I48 Int Sparse Null,

                I49 Int Sparse Null,

                I50 Int Sparse Null,

                I51 Int Sparse Null,

                I52 Int Sparse Null,

                I53 Int Sparse Null,

                I54 Int Sparse Null,

                I55 Int Sparse Null,

                I56 Int Sparse Null,

                I57 Int Sparse Null,

                I58 Int Sparse Null,

                I59 Int Sparse Null,

                I60 Int Sparse Null,

                I61 Int Sparse Null,

                I62 Int Sparse Null,

                I63 Int Sparse Null,

                I64 Int Sparse Null,

                I65 Int Sparse Null,

                I66 Int Sparse Null,

                I67 Int Sparse Null,

                I68 Int Sparse Null,

                I69 Int Sparse Null,

                I70 Int Sparse Null,

                I71 Int Sparse Null,

                I72 Int Sparse Null,

                I73 Int Sparse Null,

                I74 Int Sparse Null,

                I75 Int Sparse Null,

                I76 Int Sparse Null,

                I77 Int Sparse Null,

                I78 Int Sparse Null,

                I79 Int Sparse Null,

                I80 Int Sparse Null,

                I81 Int Sparse Null,

                I82 Int Sparse Null,

                I83 Int Sparse Null,

                I84 Int Sparse Null,

                I85 Int Sparse Null,

                I86 Int Sparse Null,

                I87 Int Sparse Null,

                I88 Int Sparse Null,

                I89 Int Sparse Null,

                I90 Int Sparse Null,

                I91 Int Sparse Null,

                I92 Int Sparse Null,

                I93 Int Sparse Null,

                I94 Int Sparse Null,

                I95 Int Sparse Null,

                I96 Int Sparse Null,

                I97 Int Sparse Null,

                I98 Int Sparse Null,

                I99 Int Sparse Null);

Create Table T2(I00 Int Null,

                I01 Int Null,

                I02 Int Null,

                I03 Int Null,

                I04 Int Null,

                I05 Int Null,

                I06 Int Null,

                I07 Int Null,

                I08 Int Null,

                I09 Int Null,

                I10 Int Null,

                I11 Int Null,

                I12 Int Null,

                I13 Int Null,

                I14 Int Null,

                I15 Int Null,

                I16 Int Null,

                I17 Int Null,

                I18 Int Null,

                I19 Int Null,

                I20 Int Null,

                I21 Int Null,

                I22 Int Null,

                I23 Int Null,

                I24 Int Null,

                I25 Int Null,

                I26 Int Null,

                I27 Int Null,

                I28 Int Null,

                I29 Int Null,

                I30 Int Null,

                I31 Int Null,

                I32 Int Null,

                I33 Int Null,

                I34 Int Null,

                I35 Int Null,

                I36 Int Null,

                I37 Int Null,

                I38 Int Null,

                I39 Int Null,

                I40 Int Null,

                I41 Int Null,

                I42 Int Null,

                I43 Int Null,

                I44 Int Null,

                I45 Int Null,

                I46 Int Null,

                I47 Int Null,

                I48 Int Null,

                I49 Int Null,

                I50 Int Null,

                I51 Int Null,

                I52 Int Null,

                I53 Int Null,

                I54 Int Null,

                I55 Int Null,

                I56 Int Null,

                I57 Int Null,

                I58 Int Null,

                I59 Int Null,

                I60 Int Null,

                I61 Int Null,

                I62 Int Null,

                I63 Int Null,

                I64 Int Null,

                I65 Int Null,

                I66 Int Null,

                I67 Int Null,

                I68 Int Null,

                I69 Int Null,

                I70 Int Null,

                I71 Int Null,

                I72 Int Null,

                I73 Int Null,

                I74 Int Null,

                I75 Int Null,

                I76 Int Null,

                I77 Int Null,

                I78 Int Null,

                I79 Int Null,

                I80 Int Null,

                I81 Int Null,

                I82 Int Null,

                I83 Int Null,

                I84 Int Null,

                I85 Int Null,

                I86 Int Null,

                I87 Int Null,

                I88 Int Null,

                I89 Int Null,

                I90 Int Null,

                I91 Int Null,

                I92 Int Null,

                I93 Int Null,

                I94 Int Null,

                I95 Int Null,

                I96 Int Null,

                I97 Int Null,

                I98 Int Null,

                I99 Int Null);

Go

וכעת נמלא את שתיהן ב-100,000 שורות ריקות:

Declare    @N Int=1000001;

With T As

(Select 1 I

Union All

Select I+1

From T

Where I<1000000)

Insert Into T1

Select    Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null

From T

Where    I%@N<>0

Union All

Select    I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I,I

From T

Where    I%@N=0

Option (MaxRecursion 0);

With T As

(Select 1 I

Union All

Select I+1

From T

Where I<1000000)

Insert Into T2

Select    Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null

From T

Option (MaxRecursion 0);

Exec sp_SpaceUsed T1;

Exec sp_SpaceUsed T2;

Go

רגע- מה זו ההתחכמות המשונה בשאילתה הראשונה?

כאשר N@=1,000,001 רק ה-Insert של ה-Nulls מתבצע (כי השארית לעולם לא תהיה 0) ואחוז המילוי בטבלת ה-Sparse יהיה 0%.

כשהמשתנה יהיה שווה 100 – אחוז המילוי יהיה 1%,

וכך הלאה..

התוצאות שהתקבלו עבור אחוזי מילוי שונים של טבלת Sparse:

Name Rows Reserved Data Index_Size Unused
T1 0% 1000000 10888 KB 10872 KB 8 KB 8 KB
T1 5% 1000000 54792 KB 54776 KB 8 KB 8 KB
T1 10% 1000000 98696 KB 98672 KB 8 KB 16 KB
T1 20% 1000000 186568 KB 186480 KB 8 KB 80 KB
T1 50% 1000000 449992 KB 449880 KB 8 KB 104 KB
T1 100% 1000000 889032 KB 888896 KB 8 KB 128 KB
T2 0% 1000000 421128 KB 421056 KB 8 KB 64 KB

ניתן לראות שטבלת ה-Sparse משתווה בגודלה לטבלה הרגילה (T2) ב-50% מילוי,

וב-5% מילוי גודלה הוא רק 1/8 ממנה;

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

שורה תחתונה: בטבלאות גדולות בנות עשרות עמודות בהן אחוזים בודדים של ערכים – השימוש ב-Sparse Columns מצדיק את עצמו.

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: