निम्नलिखित क्वेरी डेटा तुरंत:पोस्टग्रेस्क्ल तुरंत पंक्तियों को वापस क्यों शुरू नहीं करता है?
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);
आप किस ड्राइवर का उपयोग कर रहे हैं? (शायद psycopg2, लेकिन कृपया पुष्टि करें) –
आप अधिकतर स्वयं की मदद करते हैं। बहुत बढ़िया! –
हां, चालक psycopg2 है। – codeape