2010-01-08 19 views
6

निम्नलिखित क्वेरी डेटा तुरंत:पोस्टग्रेस्क्ल तुरंत पंक्तियों को वापस क्यों शुरू नहीं करता है?

SELECT time, value from data order by time limit 100; 

सीमा खंड के बिना, यह एक लंबा समय लगता पहले सर्वर लौटने पंक्तियों शुरू होता है:

SELECT time, value from data order by time; 

मैं दोनों क्वेरी उपकरण का उपयोग करके इस निरीक्षण (psql) और एक एपीआई का उपयोग कर पूछताछ करते समय।

प्रश्न/मुद्दों:

  • काम की राशि सर्वर पंक्तियों को वापस करने के लिए दोनों का चयन बयानों के लिए ही होना चाहिए शुरू करने से पहले क्या करना है। सही बात?
  • यदि हां, तो 2 मामले में देरी क्यों है?
  • क्या कुछ मौलिक आरडीबीएमएस मुद्दा है जो मुझे समझ में नहीं आता है?
  • क्या कोई तरीका है कि मैं पोस्टग्रेस्क्ल क्लाइंट को परिणाम पंक्तियों को बिना किसी रोक के क्लाइंट पर लौटाना शुरू कर सकता हूं, केस 2 के लिए भी?
  • संपादित करें (नीचे देखें)। ऐसा लगता है कि setFetchSize इसे हल करने की कुंजी है। मेरे मामले में मैं SQLAlchemy का उपयोग करके, पायथन से क्वेरी निष्पादित करता हूं। मैं एक ही क्वेरी के लिए उस विकल्प को कैसे सेट कर सकता हूं (session.execute द्वारा निष्पादित)? मैं psycopg2 ड्राइवर का उपयोग करता हूं।

कॉलम time प्राथमिक कुंजी, बीटीडब्ल्यू है।

संपादित करें:

मेरा मानना ​​है कि JDBC driver documentation से इस अंश के लिए एक समाधान में समस्या और संकेत का वर्णन करता है (मैं अभी भी मदद की जरूरत है - पिछले बुलेट सूची के ऊपर आइटम देखें):

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

और

कर्सर मोड के लिए कोड बदलने उपयुक्त आकार के वक्तव्य के लाने आकार सेट के रूप में सरल है। लाने का आकार वापस 0 पर सेट करने से सभी पंक्तियों को कैश किया जा सकता है (डिफ़ॉल्ट व्यवहार)।

// make sure autocommit is off 
conn.setAutoCommit(false); 
Statement st = conn.createStatement(); 

// Turn use of the cursor on. 
st.setFetchSize(50); 
+0

आप किस ड्राइवर का उपयोग कर रहे हैं? (शायद psycopg2, लेकिन कृपया पुष्टि करें) –

+1

आप अधिकतर स्वयं की मदद करते हैं। बहुत बढ़िया! –

+0

हां, चालक psycopg2 है। – codeape

उत्तर

4

psycopg2 dbapi ड्राइवर किसी भी पंक्ति को वापस करने से पहले पूरे क्वेरी परिणाम को बफर करता है। परिणामों को बढ़ाने के लिए आपको सर्वर साइड कर्सर का उपयोग करने की आवश्यकता होगी। SQLAlchemy के लिए server_side_cursors in the docs देखें और यदि आप ओआरएम Query.yield_per() method का उपयोग कर रहे हैं।

SQLAlchemy वर्तमान में उस प्रति क्वेरी को सेट करने का विकल्प नहीं है, लेकिन there is a ticket with a patch for implementing that है।

+0

मैंने सर्वर-साइड कर्सर का उपयोग करने का प्रयास किया: c = conn.cursor ("mycursor"); c.execute ("..."); c.fetchmany (100)। लेकिन अभी भी कुछ लौटने से पहले मुझे देरी हो रही है। मैं क्या गलत कर रहा हूं? – codeape

+0

मान लीजिए कॉन एक psycopg2 कनेक्शन है, मुझे नहीं पता, मेरे लिए सही तरीके से काम करता है। आप एक ही क्वेरी के लिए एक्सप्लिन विश्लेषण निष्पादित करने का प्रयास कर सकते हैं और समझावट आउटपुट में पहली पंक्ति के लिए पहली बार संख्या देखें, उस समय पोस्टग्रेस्क्ल पहली पंक्ति को ढूंढने के लिए लिया गया था। –

0

सिद्धांत रूप में, क्योंकि करके अपने आदेश प्राथमिक कुंजी के द्वारा होता है, परिणाम के एक प्रकार के आवश्यक नहीं होना चाहिए, और डीबी वास्तव में डेटा वापस कर सकता है सही कुंजी क्रम में दूर।

मैं इस पर ध्यान देने योग्य सक्षम डीबी की अपेक्षा करता हूं, और इसके लिए अनुकूलन करता हूं। ऐसा लगता है कि पीजीएसक्यूएल नहीं है। * शग *

यदि आपके पास LIMIT 100 है तो आपको कोई प्रभाव नहीं दिखता है क्योंकि डीबी से उन 100 परिणामों को खींचना बहुत तेज़ है, और यदि आप पहली बार इकट्ठे होते हैं और सॉर्ट किए जाते हैं तो आपको कोई देरी नहीं दिखाई देगी अपने ग्राहक को भेज दिया जाने से पहले।

मैं ऑर्डर द्वारा ड्रॉप करने का प्रयास करने का सुझाव देता हूं। संभावना है कि, आपके परिणामों को वैसे भी सही तरीके से आदेश दिया जाएगा (यहां तक ​​कि एक मानक या विनिर्देश भी हो सकता है जो आपके पीके को दिया गया हो), और आप अपने परिणाम अधिक तेज़ी से प्राप्त कर सकते हैं।

+0

मुझे विश्वास है कि आपने मेरे प्रश्न को गलत तरीके से पढ़ा होगा। LIMIT के साथ, डेटाबेस तुरंत उन पंक्तियों को वापस देता है। सीमा के बिना, क्लाइंट को पहली पंक्तियों को वापस करने से पहले एक विराम होता है। – codeape

+0

यदि ऑप्टिमाइज़र जानता है कि आप जितनी जल्दी हो सके परिणामों में रुचि रखते हैं तो डेटाबेस में अलग-अलग क्वेरी योजनाएं हो सकती हैं। ओरेकल और डीबी 2 दोनों के पास ऐसा करने के विकल्प हैं। हो सकता है कि सीमा खंड पोस्टग्रेस्क्ल संकेत में आता है कि क्वेरी तुरंत परिणाम चाहता है? –

+0

हां, मैंने पहले आपके प्रश्न को गलत समझा था, इसलिए मैंने पूरी चीज को फिर से बदल दिया। कृपया मेरे अपडेट किए गए उत्तर को अभी देखें! –

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