2015-10-01 5 views
5

पर कितने कॉल हैं हाय मैं पोस्टग्रेस एक्सेस के लिए psycopg2 का उपयोग कर रहा हूं।पोस्टग्रेस के साथ कर्सर, डेटा संग्रहीत किया जाता है और डीबी

मैं समझने की कोशिश कर रहा हूं कि "कर्सर" लौटाई गई पंक्तियों को कहां स्टोर करता है। क्या यह डेटाबेस में एक अस्थायी तालिका के रूप में संग्रहीत करता है या यह ग्राहकों के अंत में है?

क्या कर्सर (जब आप कई पंक्तियों को लाने के लिए निर्दिष्ट करते हैं) डेटाबेस को एक समय में एक क्वेरी मारा जाता है या यह डेटाबेस को एक बार मारा जाता है, तो परिणाम के पहले सेट को प्राप्त करते हैं, जब आप लौटाए गए मानों पर फिर से जाते हैं, तो यह अगली हो जाता है सेट (बफरिंग)।

मैं कर्सर पर कई लेख पढ़ा है लेकिन कुछ भी वास्तव में आंतरिक काम कर देता है ...

धन्यवाद।

+0

अपना परीक्षण कोड –

उत्तर

3

कर्सर के लिए डेटासेट पहले FETCH के निष्पादन के समय सर्वर द्वारा तैयार किया जाता है। ग्राहक आवेदन केवल बाद के FETCH स्टेटमेंट के परिणाम प्राप्त करता है।

यदि सर्वर कर्सर को बनाए रखने के लिए अनुक्रमणिका का उपयोग नहीं कर सकता है, तो अस्थायी डेटासेट बनाया गया है।

create table test(i int, v text); 
insert into test 
select i, i::text 
from generate_series(1, 5000000) i; 

इस स्क्रिप्ट में बयान निष्पादित एक के बाद:: आप इस साधारण परीक्षण प्रदर्शन कर सकते हैं

begin; 

declare cur cursor 
for select * from test 
order by random();    -- 17 ms 

fetch next cur;    -- 37294 ms (*) 

fetch next cur;    -- 0 ms 
fetch prior cur;    -- 0 ms 
fetch absolute 1000000 cur; -- 181 ms 
fetch relative 1000000 cur; -- 163 ms 
fetch first cur;    -- 0 ms 
fetch last cur;    -- 0 ms 

rollback; 

पहले FETCH (*) एक ऐसी ही अस्थायी तालिका के निर्माण के रूप में लगभग एक ही समय मोटे तौर पर प्रदर्शन करती है :

create temp table temp_test as 
select * from test 
order by random();    -- 51684 ms 

कुछ ड्राइवरों के पास ग्राहक पक्ष पर कर्सर का अपना कार्यान्वयन हो सकता है। यह ड्राइवर के दस्तावेज में स्पष्ट रूप से वर्णित किया जाना चाहिए।

+0

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

+0

@ क्रेग, यह केवल एक उदाहरण है। मैंने उपयोग कर्सर के तंत्र को बेहतर तरीके से चित्रित करने के लिए सबसे खराब मामला चुना है। पारितोषिक के लिए धन्यवाद। – klin

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