2013-04-10 12 views
9

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

मुझे हाल ही में पता चला है कि मैं दूसरे कनेक्शन से V $ SESSION_LONGOPS से पूछताछ कर सकता हूं, और यह बहुत अच्छा है, लेकिन यह केवल उन परिचालनों पर काम करता है जो 6 सेकंड से अधिक समय लेते हैं। इसका मतलब यह है कि मैं यूआई में प्रगति पट्टी को 6 सेकंड बीतने तक अपडेट नहीं कर सकता।

मैंने वी $ सत्र में प्रतीक्षा समय पर शोध किया है, लेकिन जहां तक ​​मैंने देखा है, इसमें क्वेरी के लिए प्रतीक्षा शामिल नहीं है।

क्या सत्र की वर्तमान में चल रही क्वेरी की प्रगति पाने का कोई तरीका है? या मुझे 6 सेकंड बीतने तक प्रगति पट्टी को छिपाना चाहिए?

+3

यदि आपके पास 100 x 1 सेकंड ऑपरेशंस हैं। उनमें से कोई भी SESSION_LONGOPS में दिखाई नहीं देगा। यदि आपके पास 2 अनुक्रमिक दस सेकंड ऑपरेशन हैं, तो आपके पहले व्यक्ति 100% हिट करने के बाद, दूसरा 0% से शुरू होगा। यह एक निराशाजनक प्रगति पट्टी होगी।मुझे लगता है कि यह उन चीजों में से एक है जिसके लिए एक घुमावदार सर्कल की जरूरत है, स्टेटस बार नहीं, क्योंकि आप नहीं जानते कि यह कितना समय लगेगा। –

उत्तर

1

मैं Oracle पिछले कुछ वर्षों में काफी वेब विकास का एक बहुत कुछ किया है और पाया गया कि अधिकांश उपयोगकर्ताओं को एक नियत बार है कि गलत है की तुलना में, एक अनिश्चित प्रगति बार पसंद करते है (एक ला सुंदर Microsoft's प्रगति सलाखों के किसी भी बहुत जो मुझे परेशान कोई अंत नहीं), और दुर्भाग्यवश क्वेरी प्रगति को सटीक रूप से निर्धारित करने का कोई अचूक तरीका नहीं है।

जबकि लंबी ऑप्स क्षमता में आपका शोध सराहनीय है और निश्चित रूप से डेटाबेस क्वेरी की प्रगति को और अधिक विश्वसनीय बनाने में मदद करेगा, यह अन्य भिन्नताओं के असंख्य को ध्यान में रख सकता है जो वेब ऑपरेशन के लेनदेन को प्रभावित कर सकता है प्रगति (नेटवर्क लोड, डेटाबेस लोड, एप्लिकेशन सर्वर लोड, क्लाइंट-साइड डेटा पार्सिंग, उपयोगकर्ता सबमिट बटन पर 1,000 बार इत्यादि पर क्लिक करके)।

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

8

क्या ये ऑपरेशन Pl/SQL कॉल या बस लंबे समय से चल रहे SQL हैं?

पीएल/एसक्यूएल संचालन के साथ हम पैकेज में SET_SESSION_LONGOPS() के साथ संदेश लिख सकते हैं। हम V$SESSION_LONGOPS में इन संदेशों की निगरानी कर सकते हैं। Find out more

इस काम के लिए आपको काम की इकाइयों में ऑपरेशन को मापने में सक्षम होना चाहिए। ये कुछ ठोस, और संख्यात्मक समय के पुनरावृत्तियों का होना चाहिए। तो अगर ऑपरेशन 10000 पंक्तियों को सम्मिलित करता है तो आप इसे 10 बैचों में विभाजित कर सकते हैं। totalwork पैरामीटर बैचों की संख्या (यानी 10) है और आप sofar पैरामीटर बढ़ाने के लिए प्रत्येक 1000 पंक्तियों के बाद SET_SESSION_LONGOPS() को कॉल करते हैं। यह आपको दस ब्लॉक के थर्मामीटर प्रस्तुत करने की अनुमति देगा।

ये संदेश सत्र-आधारित हैं लेकिन पिछले सत्र से मौजूदा संदेश को & SID से वर्तमान संदेश को अलग करने का कोई स्वचालित तरीका नहीं है। हालांकि यदि आप context पैरामीटर के लिए यूआईडी असाइन करते हैं तो आप दृश्य को फ़िल्टर करने के लिए उस मान का उपयोग कर सकते हैं।


यह एक लंबे समय तक चलने वाली क्वेरी के लिए काम नहीं करेगा, क्योंकि हमारे पास इसे भाग में विभाजित करने का कोई तरीका नहीं है।

+0

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

2

मैंने पाया यह बहुत ही उपयोगी

dbms_session.set_module("MY Program" , "Kicking off ... ") 
.. 
dbms_session.set_action("Extracting data ... ") 
.. 
dbms_session.set_action("Transforming data ... ") 
.. 

आप

select module , action from v$session where sid = :yoursessionid 
0

का उपयोग कर प्रगति वी $ _SESSION_LONGOPS का उपयोग की निगरानी कर सकते TIMED_STATISTICS = सच है या SQL_TRACE = true सेट करने के लिए की आवश्यकता है। आपके डेटाबेस स्कीमा को ऐसा करने के लिए ALTER सत्र प्रणाली विशेषाधिकार दिया जाना चाहिए।

मैंने एक बार जटिल और लंबी चल रही क्वेरी के साथ V $ _SESSION_LONGOPS का उपयोग करने का प्रयास किया। लेकिन यह चालू हो गया कि V $ _SESSION_LONGOPS पूर्ण तालिका स्कैन, संचालन में शामिल होने, और इसी तरह की क्वेरी के भागों की प्रगति दिखा सकता है।

यह भी देखें: http://www.dba-oracle.com/t_v_dollar_session_longops.htm

आप क्या कर सकते सिर्फ उपयोगकर्ता "क्वेरी अभी भी चल रहा है" को दिखाने के लिए है। मैंने <DIV> को <TD> में घोंसला लगाया जो ब्राउज़र द्वारा भेजे गए प्रत्येक स्टेटस अनुरोध के साथ अधिक समय तक चला जाता है। स्थिति अनुरोध window.SetTimeout (प्रत्येक 3 सेकंड) द्वारा शुरू किए जाते हैं और AJAX कॉल सर्वर-साइड प्रक्रिया में हैं। सर्वर-साइड प्रक्रिया द्वारा लौटाई गई स्थिति रिपोर्ट बस कहती है "हम अभी भी चल रहे हैं"। प्रोग्रेस बार की चौड़ाई (यानी <DIV> की चौड़ाई) हर बार <TD> एस चौड़ाई के 5% की वृद्धि करती है और 100% दिखाने के बाद 5% पर रीसेट हो जाती है।

लंबे समय तक चलने वाले प्रश्नों के लिए आप अलग-अलग टेबल में ले गए समय को ट्रैक कर सकते हैं, संभवतः अलग-अलग प्रविष्टियों के साथ अलग-अलग प्रविष्टियों के साथ। आप औसत समय के साथ-साथ क्लाइंट-साइड डायलॉग में बस गए समय को प्रदर्शित करने के लिए इसका उपयोग कर सकते हैं।

आप एक लंबे चल PL/SQL प्रक्रिया या कई कदम कर सर्वर साइड पर की तरह है, तो यह प्रयास करें:

  • स्थिति संदेश के लिए एक तालिका बनाने
  • किसी भी प्रक्रिया के लिए एक अनूठा कुंजी का उपयोग करें उपयोगकर्ता शुरू होता है। सुझाव: मिलीसेकंड + सत्र आईडी में क्लाइंट साइड की जावास्क्रिप्ट दिनांक।
  • यदि ब्राउज़र विंडो में किसी लिंक द्वारा लंबी चल रही प्रक्रिया शुरू की जानी है, तो प्रक्रिया को चलाने के बजाय प्रक्रिया को चलाने के लिए DBMS_JOB.SUBMIT का उपयोग करके नौकरी बनाएं
  • एक छोटी प्रक्रिया लिखें जो स्थिति तालिका अपडेट करती है , PRAGMA AUTONOMOUS_TRANSACTION का उपयोग कर। यह प्रगति आपको अपनी मुख्य प्रक्रिया के अपडेट किए बिना स्थिति तालिका में अपडेट करने की अनुमति देती है। आपकी मुख्य प्रक्रिया के प्रत्येक प्रमुख चरण में इस स्थिति तालिका में स्वयं का प्रवेश होना चाहिए।
  • स्थिति तालिका क्वेरी करने के लिए एक प्रक्रिया लिखने ब्राउज़र द्वारा कहा जा
  • एक प्रक्रिया है जो एक AJAX कॉल द्वारा कहा जाता है, तो उपयोग क्लिक करता है "रद्द करें" या खिड़की
  • एक प्रक्रिया लिखते हैं कि कहा जाता है बंद कर देता है लिखना प्रत्येक चरण को पूरा करने के बाद मुख्य प्रक्रिया द्वारा: यह स्थिति तालिका से पूछताछ करता है और 20,000 में किसी संख्या के साथ अपवाद उठाता है यदि रद्द ध्वज सेट किया गया था या ब्राउज़र 60 सेकंड के लिए स्थिति की क्वेरी नहीं करता था। मुख्य प्रक्रिया के अपवाद हैंडलर में इस त्रुटि के लिए देखो, रोलबैक करें, और स्थिति तालिका अद्यतन करें।
संबंधित मुद्दे