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
מרץ20

Written by: ronen ariely
20/03/2012 19:31 RssIcon

מדוע עבודה במסד הנתונים עם "מכלול הנתונים"* מהירה יותר מעבודה עם רשומות?

* במדריך זה אני משתמש במושג "מכלול הנתונים" ברמת מסד הנתונים כשהכוונה להתייחסות לכל הנתונים כאלמנט אחד (למשל שימוש ב 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/