2015-12-14 12 views
5

मैं एक Grails वेब एप्लिकेशन का समर्थन कर रहा हूं जो AmCharts का उपयोग कर क्लाइंट के लिए अलग-अलग दृश्य दिखाता है। टैब में से एक पर तीन चार्ट होते हैं जो प्रत्येक शीर्ष दस पर वापस आते हैं, इसलिए विभिन्न उपायों के आधार पर डेटाबेस से केवल दस पंक्तियां होती हैं। इसे समाप्त करने में 4-5 या कभी-कभी और अधिक समय लगता है। क्वेरी 10 सेकंड के भीतर डीबी पर चलती है।sql.rows() धीमी गति से चल रहा है

निम्न सेवा विधि परिणाम देने के कहा जाता है:

List fetchTopPages(params, Map querySettings, String orderClause) { 
    if(!((params['country'] && params['country'].size() > 0) || (params['brand'] && params['brand'].size() > 0) || (params['url'] && params['url'].size() > 0))) { 
     throw new RuntimeException('Filters country or brand or url not selected.') 
    } 
    Sql sql = new Sql(dataSource) 
    sql.withStatement { stmt -> stmt.fetchSize = 100 } 
    Map filterParams = acquisitionService.getDateFilters(params, querySettings) 
    ParamUtils.addWhereArgs(params, filterParams) 
    String query = "This is where the query is" 

    ParamUtils.saveQueryInRequest(ParamUtils.prettyPrintQuery(query, filterParams)) 
    log.debug("engagement pageviews-by-source query: " + ParamUtils.prettyPrintQuery(query, filterParams)) 
    List rows = sql.rows(query, filterParams) 
    rows 

} 

कुछ जांच यह स्पष्ट था कि List rows = sql.rows(query, filterParams) पंक्ति एक है कि इस लोड समय तक ले जाता है है के बाद।

क्या किसी ने इस मुद्दे को पहले से कम कर दिया है? Sql.rows() इतनी देर क्यों ले रहा है जब यह केवल 10 पंक्तियों के परिणाम लौट रहा है, और क्वेरी डीबी पक्ष पर सुपर फास्ट रन है?

अतिरिक्त जानकारी:

डीबी: FSL1D

रनिंग डीबी पक्ष पर आदेश के बाद: java -jar ojdbc5.jar - getversion रिटर्न: "Oracle 11.2.0.3.0 JDBC 3.0 Thu_Jul_11_15 पर JDK5 साथ संकलित: 41: 55_PDT_2013 डिफ़ॉल्ट कनेक्शन गुण संसाधन बुध दिसंबर 16 08:18:32 ईएसटी 2015 "

ग्रूवी संस्करण: 2.3.7 Grails संस्करण: 2.4.41 JDK: 1.7.0

+०१२३५१६४१०६१
+0

अनुमति देने के लिए और अधिक ठोस जवाब कृपया अपने डीबी, JDBC ड्राइवर और ग्रूवी + JDK संस्करण –

+0

डीबी पोस्ट: FSL1D डीबी तरफ रनिंग निम्न आदेश: 'जावा जार ojdbc5.jar - getversion' रिटर्न: ओरेकल 11.2.0.3 0 जेडीबीसी 3।0 Thu_Jul_11_15 पर JDK5 साथ संकलित: 41: 55_PDT_2013 #default कनेक्शन गुण संसाधन #Wed 16 दिसंबर 08:18:32 ईएसटी 2015 ग्रूवी संस्करण: 2.3.7 Grails संस्करण: 2.4.41 JDK: 1.7.0 – krizsa

+0

धन्यवाद, मैं आपके परिदृश्य को स्थापित करने की कोशिश करूंगा। एक समान प्रश्न है [यहां] (http://stackoverflow.com/questions/9923981/why-sql-rows-groovy-method-is-so-slow) लेकिन एक निश्चित उत्तर के साथ नहीं। –

उत्तर

3

मेरे Groovy Version: 2.3.6 JVM: 1.8.0_11 और Oracle 12.1.0.2.0 ड्राइवर का उपयोग कर ojdbc7.jar

नोट 10046 trace की सक्रियता दिखाए जाने से पहले निदान अनुमति देने के लिए के साथ की स्थापना की।

import oracle.jdbc.pool.OracleDataSource 

def ods = new OracleDataSource(); 
ods.setURL('url') 
ods.setUser('usr') 
ods.setPassword('pwd') 

def con = ods.getConnection() 
def sql = new groovy.sql.Sql(con) 
sql.withStatement { stmt -> stmt.fetchSize = 100 } 
def SQL_QUERY = """select id, col1 from table1 order by id""" 
def offset = 150 
def maxRows = 20 
// activate trace 10046 
con.createStatement().execute "alter session set events '10046 trace name context forever, level 12'" 

def t = System.currentTimeMillis() 
def rows = sql.rows(SQL_QUERY, offset, maxRows) 
println "time1 : ${System.currentTimeMillis()-t} with offset ${offset} and maxRows ${maxRows}" 

का पता लगाने की परीक्षा से पता चलता है कि stament पार्स और क्रियान्वित किया जाता है, इसका मतलब है अगर वहाँ ORDER BY खंड है, सभी डेटा सॉर्ट हो जाता है।

लाने आकार सही ढंग से प्रयोग किया जाता है और आवश्यक रिकॉर्ड से अधिक नहीं लाई जाती हैं - यहां 170 = 150 + 20. के साथ आकार 100 इस दो चरणों (ध्यान दें r पैरामीटर - लाई गई पंक्तियों की संख्या) में किया जाता है से लाएं।

FETCH #627590664:c=0,e=155,p=0,cr=5,cu=0,mis=0,r=100,dep=0,og=1,plh=1169613780,tim=3898349818398 
FETCH #627590664:c=0,e=46,p=0,cr=0,cu=0,mis=0,r=70,dep=0,og=1,plh=1169613780,tim=3898349851458 

तो मूल रूप से केवल एक समस्या यह मुझे लगता है कि "को छोड़ दिया" डेटा क्लाइंट के नेटवर्क पर पारित किया है (वहाँ ध्यान नहीं दिया जा करने के लिए)।

यह बहुत अधिक ऑफसेट ओवरहेड के साथ उत्पादन कर सकता है (और अधिक समय लेता है कि वही क्वेरी पहले पृष्ठ का अंतःक्रियात्मक रूप से उत्पादन कर रही है)।

लेकिन आपकी समस्या की पहचान करने का सबसे अच्छा तरीका यह है कि 10046 ट्रेस सक्षम करें और देखें कि क्या हो रहा है। मैं level 12 का उपयोग कर रहा हूं जिसका अर्थ है कि आपको डीबी में प्रतीक्षा करने और चर बाध्य करने के बारे में जानकारी भी मिलती है।

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