2012-02-13 18 views
30

मेरे पास ऑब्जेक्टQuery मर्जऑप्शन को "नोट्रैकिंग" घोषित करने वाली क्वेरी निष्पादित करने का प्रयास करने का एक अजीब व्यवहार है, इस मामले में इकाई ढांचे को किसी भी इकाई को संलग्न नहीं करना चाहिए और इकाई स्थिति को ट्रैक करने के लिए संबंधित ऑब्जेक्टस्टेट एंटर्री नहीं बनाना चाहिए।एंटिटी फ्रेमवर्क विलय प्रदर्शन खराब प्रदर्शन

समस्या यह है कि वृद्धि प्रदर्शन के बजाय यह बदतर हो गया है, एक ही क्वेरी डिफ़ॉल्ट mergeoption साथ 10 सेकंड (कि AppendingOnly है) और अधिक 1 मिनट की तरह लेता है अगर मैं notracking

निर्दिष्ट करने के लिए किसी को एक है कोशिश इसके लिए स्पष्टीकरण ??

+0

आपने क्वेरी निष्पादन को कैसे माप लिया? –

+0

मूल रूप से एक ToList() – MaRuf

+0

के साथ निष्पादित क्वेरी से पहले और बाद में टाइमस्टैम्प ले रहा है लेकिन आप कितनी बार क्वेरी निष्पादित करते हैं और आप किस निष्पादन का उपयोग कर रहे हैं? –

उत्तर

100

क्या आप संदर्भों को वस्तुओं संलग्न के प्रदर्शन लागत बचाने के NoTracking मर्ज विकल्प सेट करके परिवर्तन ट्रैकिंग अक्षम लेकिन दूसरी ओर आप भी पहचान प्रबंधन खो देते हैं।

इसका मतलब है कि संभावित रूप से अधिक ऑब्जेक्ट्स - एक ही कुंजी वाले कई - को भौतिककृत किया जाएगा।

उदाहरण: मान लें कि आपके पास User इकाई Roles संग्रह नेविगेशन संपत्ति के रूप में संग्रह है। यह भी मान लें कि आपके पास डेटाबेस में 1 मिलियन उपयोगकर्ता हैं और सभी उपयोगकर्ता एक ही 10 भूमिकाओं में हैं, यानी प्रत्येक उपयोगकर्ता के पास 10 तत्वों के साथ भूमिका संग्रह होता है।

  • आप NoTracking उपयोग नहीं करते हैं आप 1.000 होगा: आप निम्न क्वेरी चलाते हैं ...

    var users = context.Users.Include("Roles").ToList(); 
    

    ... materialized और instantiated ऑब्जेक्ट की संख्या मर्ज विकल्प पर निर्भर स्मृति में 2010 वस्तुओं, अर्थात् 1 मिलियन उपयोगकर्ता, लेकिन केवल 10 भूमिकाएं क्योंकि पहचान मैपिंग यह सुनिश्चित करेगी कि प्रति कुंजी केवल 1 भूमिका भौतिक हो और संदर्भ से जुड़ी हो। सभी उपयोगकर्ता के Roles संग्रह के लिए एक ही 10 भूमिका उदाहरणों का उपयोग किया जाता है।

  • यदि आप NoTracking का उपयोग करते हैं, तो ईएफ संदर्भ में वस्तुओं को संलग्न नहीं करेगा, इसलिए पहचान प्रबंधन अक्षम है और आपके पास स्मृति में 11.000.000 ऑब्जेक्ट्स होंगे: 1 मिलियन उपयोगकर्ता और प्रति उपयोगकर्ता 10 भूमिकाएं, यानी 10 मिलियन भूमिका वस्तुओं। इसलिए, जब आपके पास संदर्भ से ऑब्जेक्ट संलग्न होते हैं, तो आपके पास 10 गुना अधिक भौतिक वस्तुएं होती हैं।

वस्तु भौतिकीकरण "moderate" performace costs साथ वर्गीकृत किया जाता है:

ऑपरेशन: materializing वस्तुओं
सापेक्ष लागत: मध्यम
आवृत्ति: प्रत्येक वस्तु एक बार के लिए, जो क्वेरी ।

टिप्पणियाँ: लौटे DbDataReader वस्तु पढ़ने और वस्तुओं बनाने और वे गुण मान DbDataRecord वर्ग के प्रत्येक उदाहरण में मूल्यों पर आधारित हैं स्थापित करने की प्रक्रिया।वस्तु पहले से ही ObjectContext में मौजूद है और क्वेरी मर्ज विकल्पों या PreserveChanges AppendOnly का उपयोग करता है, इस स्तर के प्रदर्शन को प्रभावित नहीं करता है।

दूसरे शब्दों में: क्वेरी NoTracking मर्ज विकल्प का उपयोग करता है, तो इस स्तर प्रदर्शन को प्रभावित करता है और यह संभव हो सकता है कि विकलांग परिवर्तन ट्रैकिंग के प्रदर्शन लाभ विकलांग पहचान प्रबंधन की खामियों से नष्ट हो रहे हैं और गुणा वस्तु वस्तुकरण।

+1

विकल्प को निष्पादित करने के बिना निष्पादित करने का प्रयास करता हूं। उदाहरण बहुत स्पष्ट है! महान! – kingkong0924

+3

(धीमी गति से) आआंद यही कारण है कि आपके पास 70k अंक हैं। बहुत बढ़िया। – SteveCav

संबंधित मुद्दे