2010-11-02 17 views
9

के साथ प्रदर्शन समस्याएं वर्तमान में मुझे एक समस्या का सामना करना पड़ रहा है जहां एक विशिष्ट SQL-query को मेरे जावा एप्लिकेशन के भीतर से लगभग 30 सेकंड का समय लगता है लेकिन SQL-क्लाइंट (SQL डेवलपर) में < 1 सेकंड।जेडीबीसी

सवाल में,
Slow query in Java by JDBC but not in other systems (TOAD), यह सुझाव दिया है कि एक PreparedStatement जावा चर के लिए बाध्य का उपयोग कर क्वेरी SQL-क्लाइंट (उस मामले टोड इन द) की तुलना में काफी धीमी निष्पादित क्योंकि ओरेकल जो के बारे में उलझन हो रही है कर सकता है उपयोग करने के लिए सूचकांक। क्या यह पैरामीटर के बिना तैयार किए गए स्टेटमेंट के साथ भी एक मुद्दा हो सकता है?

अन्यथा समस्या क्या हो सकती है?

क्वेरी

select 
sum(col1), 
sum(col2), 
max(select ...) 
from view_ 
where time_id = get_time_id(to_date('2010-10-10','yyyy-mm-dd')) 

जहां view_ एक जटिल तालिकाओं और अन्य जटिल विचारों एकत्रित युक्त दृश्य है की तरह कुछ लग रहा है। क्वेरी को प्रीपेर्डस्टेटमेंट के रूप में निष्पादित किया जाता है लेकिन बिना किसी पैरामीटर के। ऐसा कोई फर्क नहीं पड़ता कि हम तैयार कथन या सिर्फ सादा बयान का उपयोग करते हैं या नहीं।

के बाद से कार्य योजना लागू करके काफी बड़ा है मैं सभी पोस्ट नहीं कर सकते, तो इसे यहाँ, लेकिन प्रासंगिक अंतर प्रतीत हो रहा है:

 
UNION-ALL 
TABLE ACCESS FULL GVC_WH.PLAYER_FACT_DAILY TABLE 37 6717151 596,934.317 19940 240 7621178231 19502 
 
UNION-ALL 
TABLE ACCESS BY INDEX ROWID GVC_WH.PLAYER_FACT_DAILY TABLE 38 2657 236.120 2429 30 20544658 2428 
INDEX RANGE SCAN GVC_WH.PK_AGG_PLAYER INDEX (UNIQUE) 37 2657 16 1 638743 16 

कहाँ पहले टुकड़ा जब यह साथ चलने से है जेडीबीसी पतला ग्राहक और एसक्यूएल डेवलपर के अंदर इसे चलाने के बाद से दूसरा। जेडीबीसी थिन क्लाइंट के साथ एक कथन के रूप में चलते समय यह सही सूचकांक नहीं उठा रहा है (कोई फर्क नहीं पड़ता कि मैं तैयार कथन का उपयोग करता हूं या नहीं)। समय के अंतर में मैं 30 सेकंड के लिए पहले और 0.5 सेकंड के लिए अंतर।

क्या यह हो सकता है कि फ़ंक्शन का उपयोग करके get_time_id जेडीबीसी के बावजूद इंडेक्स के उपयोग को प्रतिबंधित करता है, भले ही यह कॉलम पर काम न करे और भले ही यह SQL डेवलपर में काम कर रहा हो?

+2

क्या आप दो मामलों के लिए क्वेरी योजनाएं प्राप्त और पोस्ट कर सकते हैं?और केवल स्पष्टता के लिए, क्या आप इस बात के अनुरूप हैं कि आप प्रदर्शन को कैसे माप रहे हैं? एसक्यूएल डेवलपर पहली पंक्ति बनाम उस समय को मापने के लिए कुछ हद तक आम है जब आपका जावा कोड आखिरी पंक्ति प्राप्त करता है जो काफी अलग हो सकता है। –

+2

मैं प्रत्येक विधि (TOAD बनाम जावा) द्वारा उत्पन्न निष्पादन योजना (dbms_xplan.display कर्सर के माध्यम से) को देखकर शुरू करूंगा। यह आपको बताएगा कि डेटाबेस अलग-अलग प्रश्नों का इलाज कर रहा है या नहीं। यदि ऐसा है, तो भविष्यवाणी अनुभाग पर ध्यान दें क्योंकि इससे आपको कुछ सुराग मिलेंगे (उदाहरण के लिए जावा संस्करण से अंतर्निहित डेटाटाइप रूपांतरण हो रहा है और ओरेकल इंडेक्स का उपयोग करने में सक्षम नहीं है) – Craig

+0

यह भी देखें http://stackoverflow.com/questions/3976184/oracle-query-ora-01652-unable-to-extend-temp-segment-but-only-in-some-versions – symcbean

उत्तर

1

यह विधेय में पारित किया जा रहा की वजह से बहुत संभव आप बाँध चर बढ़ता जा के साथ समस्याओं से टकराने जा सकता है। (यानी लगातार रन बार)

alter session set “_optim_peek_user_binds”=false; 

आँकड़े हैं पुष्टि करने के लिए निम्नलिखित के साथ क्वेरी चलाने का प्रयास सभी वस्तुओं पर अद्यतित?

जैसा कि जस्टिन पोस्ट किया गया है, साथ ही, सुनिश्चित करें कि आप सही तरीके से माप रहे हैं। पूर्ण पूछताछ के बिना, अतिरिक्त अंतर्दृष्टि प्रदान करना मुश्किल होगा।

+0

आप किस चर का जिक्र कर रहे हैं? जैसा कि मैंने कहा, तैयार कथन पैरामीटर के बिना है। इसके अलावा प्रदर्शन अंतर केवल एक पंक्ति लाने के लिए परिमाण के आदेश है। आंकड़े अद्यतित हैं। –

+0

CURSOR_SHARING पैरामीटर के मान के आधार पर ओरेकल बयान पर बाध्य चर को मजबूर कर सकता है। http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams035.htm – Serxipc

2

मैं एप्लिकेशन का उपयोग करते समय डेटाबेस पर trace चलाने का प्रयास करूंगा।

फिर आप क्वेरी को चलाने और वास्तविक निष्पादन योजना को देखने में सक्षम होना चाहिए। यह आपको दिखाएगा कि क्या हो रहा है, यानी यह सूचकांक उठा रहा है या नहीं।

0

चेक सुनिश्चित करें कि कोई सेट नहीं किया बनाने के लिए संपत्ति oracle.jdbc.defaultNChar = सच

यह कभी कभी यूनिकोड समस्याओं को हल करने के लिए किया जाता है, लेकिन इसका मतलब है कि सभी स्तंभों nvarchars माना जाता है। यदि आपके पास वर्चर कॉलम पर एक इंडेक्स है, तो इसका उपयोग नहीं किया जाएगा क्योंकि ऑरैकल को अक्षर एन्कोडिंग को परिवर्तित करने के लिए फ़ंक्शन का उपयोग करना होगा।

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