2009-03-22 7 views
8

मैं ORM उपकरण की तरह है, लेकिन मैं अक्सर सोचा है कि बड़े अद्यतन (पंक्तियों के हजारों) के लिए, इसे लोड, अद्यतन और बचाने के लिए अक्षम लगताएक ORM के साथ बड़े मात्रा डेटाबेस अपडेट

जब कुछ की तरह
UPDATE [table] set [column] = [value] WHERE [predicate] 

होगा बहुत बेहतर प्रदर्शन दें।

हालांकि, मानते हैं कि कोई प्रदर्शन कारणों से इस मार्ग को नीचे जाना चाहता था, फिर आप यह सुनिश्चित कैसे करेंगे कि स्मृति में कैश किए गए किसी भी ऑब्जेक्ट को सही तरीके से अपडेट किया गया हो।

कहें कि आप LINQ से SQL का उपयोग कर रहे हैं, और आप डेटाकॉन्टेक्स्ट पर काम कर रहे हैं, तो आप कैसे सुनिश्चित करते हैं कि आपका उच्च-प्रदर्शन UPDATE डेटाकॉन्टेक्स्ट के ऑब्जेक्ट ग्राफ़ में दिखाई देता है?

यह "आप नहीं करते" या "डीबी पर ट्रिगर्स का उपयोग करने के लिए डीईटी पर ट्रिगर्स का उपयोग करें जो कैश छोड़ देता है" आदि हो सकता है, लेकिन मुझे इस तरह की समस्या के सामान्य समाधान सुनने में दिलचस्पी है।

+0

ओआरएम का उपयोग करने के कारणों में से एक नहीं है? यानी कि यह मेमोरी ऑब्जेक्ट्स को सिंक्रनाइज़ करने और संग्रहीत वस्तुओं को अद्यतन करने के लिए तंत्र प्रदान करता है? तंत्र निश्चित रूप से ओआरएम विशिष्ट –

+0

हां होगा, लेकिन मेरा मुद्दा यह है कि यदि आप एक ओआरएम उपकरण का उपयोग करते हैं, और प्रत्यक्ष SQL विधि का उपयोग करके थोक अपडेट के प्रदर्शन में सुधार करना चाहते हैं, तो आप ओआरएम के कुछ लाभ खो देते हैं। –

उत्तर

4

आप सही हैं, इस उदाहरण में लोड करने, बदलने के लिए ओआरएम का उपयोग करके और फिर रिकॉर्ड जारी रखना कुशल नहीं है। मेरे प्रक्रिया है, इस

1) जल्दी कार्यान्वयन उपयोग ORM की तरह कुछ चला जाता है, मेरे मामले NHibernate में विशेष रूप से

2) विकास के रूप में परिपक्व होती है प्रदर्शन के मुद्दों की पहचान, जो बड़े अपडेट

3 शामिल होंगे) उन बाहर refactor करने के लिए एसक्यूएल या सपा दृष्टिकोण

4) ताज़ा उपयोग (वस्तु) कैश्ड वस्तुओं अद्यतन करने के लिए आदेश,

मेरे बड़ी समस्या अन्य ग्राहकों को सूचित कर दिया गया है कि अद्यतन आ गई है। ज्यादातर मामलों में हमने स्वीकार किया है कि कुछ ग्राहक बालों वाले होंगे, जो कि मानक ओआरएम उपयोग के मामले में है, और फिर अपडेट/डालने पर टाइमस्टैम्प की जांच करें।

2

ओआरएम तेजी से विकास के लिए बहुत अच्छे हैं, लेकिन आप सही हैं - वे कुशल नहीं हैं। वे बहुत अच्छे हैं कि आपको अंतर्निहित तंत्र के बारे में सोचने की आवश्यकता नहीं है जो आपकी ऑब्जेक्ट्स को मेमोरी में पंक्तियों में पंक्तियों में बदल देता है और फिर वापस आ जाता है। हालांकि, कई बार ओआरएम ऐसा करने के लिए सबसे प्रभावी प्रक्रिया नहीं चुनता है। यदि आप वास्तव में अपने ऐप के प्रदर्शन की परवाह करते हैं, तो डेटाबेस को डिज़ाइन करने और अपने प्रश्नों को उचित रूप से ट्यून करने में आपकी सहायता के लिए डीबीए के साथ काम करना सबसे अच्छा है। (या कम से कम एसक्यूएल की बुनियादी अवधारणाओं को समझें)

0

ORMs हाथ से तैयार एसक्यूएल के रूप में उतने कुशल नहीं होंगे। अवधि। हाथ से तैयार किए गए असेंबलर की तरह सी # से तेज होगा। चाहे प्रदर्शन अंतर मायने रखता है या नहीं, बहुत सारी चीजों पर निर्भर करता है। कुछ मामलों में अबास्ट्रक्शन ओआरएम का उच्च स्तर आपको अन्य मामलों में, शक्तिशाली प्रदर्शन से अधिक मूल्यवान हो सकता है।

ऑब्जेक्ट कोड के साथ रिश्तों को पार करना काफी अच्छा हो सकता है लेकिन जैसा कि आप सही तरीके से इंगित करते हैं कि संभावित समस्याएं हैं।

कहा जा रहा है कि, मैं व्यक्तिगत रूप से ओआरएमएस को झूठी अर्थव्यवस्था होने के लिए व्यक्तिगत रूप से देखता हूं। मैं यहां खुद को दोहराना नहीं चाहूंगा लेकिन बस Using an ORM or plain SQL?

3

अधिकांश ओआरएम में बड़े या "थोक" अपडेट कुशलतापूर्वक करने के लिए सुविधाएं भी हैं। स्टेटलेस सत्र जावा के लिए हाइबरनेट में उपलब्ध एक ऐसा तंत्र है जो स्पष्ट रूप से एनएचबेर्नेट 2 में उपलब्ध होगा।एक्स:

http://ayende.com/Blog/archive/2007/11/13/What-is-going-on-with-NHibernate-2.0.aspx

1

बल्क अपडेट एक संदिग्ध डिजाइन कर रहे हैं। कभी-कभी वे जरूरी लगते हैं; हालांकि, कई मामलों में, एक बेहतर एप्लिकेशन डिज़ाइन थोक अपडेट की आवश्यकता को हटा सकता है।

अक्सर, एप्लिकेशन के कुछ अन्य हिस्से ने एक ही समय में प्रत्येक ऑब्जेक्ट को छुआ है; आवेदन के दूसरे भाग में "थोक" अद्यतन किया जाना चाहिए था।

अन्य मामलों में, अद्यतन कहीं और प्रसंस्करण के लिए एक प्रस्ताव है। इस मामले में, अद्यतन बाद की प्रसंस्करण का हिस्सा होना चाहिए।

मेरी सामान्य डिजाइन रणनीति थोक अद्यतनों को खत्म करने के लिए अनुप्रयोगों को दोबारा करने के लिए है।

+0

कभी-कभी थोक अद्यतन एक डिज़ाइन समस्या नहीं है, यह एक कार्य है। –

+0

@ कैंडी चिउ: क्या आप कह रहे हैं कि आपने जवाब नहीं पढ़ा? या उत्तर में विशिष्ट उदाहरण पर्याप्त स्पष्ट नहीं थे? आपकी टिप्पणी का क्या अर्थ है? बस एक थोक अद्यतन का निर्माण क्योंकि किसी और ने कहा "थोक अद्यतन का निर्माण" संदिग्ध डिजाइन निर्णय को संबोधित नहीं करता है। –

+0

"कुछ उपयोगकर्ता परिभाषित मानों के साथ डीबी में डेटा रीफ्रेश करें"। इस मामले में, यदि एकाधिक पंक्तियां छूती हैं, तो शायद सामान्यीकरण समस्या हो सकती है। एकाधिक पंक्तियों को शायद एक अलग तालिका में निकाला जाना चाहिए ताकि एकल-पंक्ति अद्यतन ने सही ढंग से काम किया हो। –