מרץ20
Written by:
ronen ariely
20/03/2012 19:31 
מדוע עבודה במסד הנתונים עם "מכלול הנתונים"* מהירה יותר מעבודה עם רשומות?
* במדריך זה אני משתמש במושג "מכלול הנתונים" ברמת מסד הנתונים כשהכוונה להתייחסות לכל הנתונים כאלמנט אחד (למשל שימוש ב bulk insert או select into ) בניגוד לעבודה עם הנתונים כאוסף של רשומות (insert into והכנסה של נתונים בזה אחר זה או אפילו כולם ביחד)
נעבור על כמה נקודות כלליות הקשורות למסד הנתונים ונסביר את ההתנהגות השונה ברמת מסד הנתונים, וכן נעבור על דרכי המימוש בפיתוח בטכנולוגיית Dot.Net ועבודה עם Entity Framework בפרט.
התנהגות הלוג במסד הנתונים
כמות הרישום בלוג במקרה של עבודה עם מכלול הנתונים תלויה בגדרות השחזור של מסד הנתונים. במצב הגדרה של simple recovery או bulk-logged מדובר על רישום מינימאלי. במקרה זה הפעולות על המכלול יהיו הרבה יותר יעילות.
לשם הדגשה נרשום בפירוש שתחת הגדרות full recovery כל הפעולות על מכלול הנתונים נרשמות במצב ברירת המחדל. במקרה זה לעבודה יעילה אנחנו הרבה פעמים נעביר את המסד שלנו למצב זמני של bulk-logged .
רישום מינימאלי בלוג כרוך ברישום אינפורמציה על כך שבוצעה פעולה ולכן במקרה של שחזור, השרת יודע להיכן לגשת כדי לשחזר אותה (למשל לגיבוי אחד לפני הפעולה), אבל אינו מספק לנו נקודה חדשה בזמן אליה אפשר לחזור (ז"א הנתונים עצמם אינם נרשמים בלוג)
* ניתן לקרוא עוד על פעולות שניתן להגדיר אותם לעבודה מינימאלית של רישום בלוג בקישור הבא
עבודה עם מכלול הנתונים מאפשר עבודה in-process במסד הנתונים.
הדבר חוסך לנו העברת מידע בין תוכנת הלקוח לשרת. האינפורמציה מועברת לשרת בצורה מיטבית בלי קשר לתוכן האינפורמציה STREAM .
נעילות ברמת מסד הנתונים במצב ברירת המחדל
במקרה שהנתונים מועברים כבר בסידור המתאים למפתח הראשי של הטבלה (שימוש ב order by למשל) הרי שהשרת יספק בנעילה ברמת ה PAGE -ים של הנתונים שמעבירים בעוד בהעברה של הנתונים לפי רשומות יהיה צורך בנוסף לנעול (ולשחרר) כל פעם ברמת רשומה. בכל רשומה שנכנסת יהיה צורך לבדוק באיזה PAGE היא אמורה להיות.
עבודה בטכנולוגיית Dot.Net עם מכלול הנתונים
מה המקבילה למשל לשימוש ב bulk insert או select into ?
ישנה מחלקה בשם SqlBulkCopy שמבצעת פעולות אלו. במחלקה זו יש מתודה בשם WriteToServer בה עלינו לעשות שימוש. מחלקה זו עובדת בין השאר עם ה- ORM כמו EF . כל מה שצריך זה במקום לעשות שימוש ב SaveChanges אז נעשה שימוש במתודה WriteToServer המתאימה של SqlBulkCopy (ניתן לראות דוגמה של קוד בקישור למטה).
דוגמה להשוואה בין פעולות ברמת מסד הנתונים:
http://beyondrelational.com/modules/2/blogs/115/posts/11142/select-into-is-faster-than-create-amp-insert.aspx
עבודה עם SqlBulkCopy בסביבת Entity Framwork
Entity Framework Bulk Copy
http://cgeers.com/2011/05/19/entity-framework-bulk-copy/