2012-04-16 9 views
6

मैं जेडीबीसी के साथ एक डेटाबेस स्वतंत्र आवेदन लिखने की कोशिश कर रहा हूं। अब मुझे कुछ तालिका से शीर्ष एन प्रविष्टियों को लाने का एक तरीका चाहिए। मैंने देखा कि जेडीबीसी में setMaxRows विधि है, लेकिन मुझे इसका उपयोग करने में सहज महसूस नहीं होता है, क्योंकि मुझे डर है कि डेटाबेस सभी परिणामों को धक्का देगा, और केवल जेडीबीसी चालक परिणाम को कम करेगा। अगर मुझे एक अरब पंक्तियों वाली तालिका में शीर्ष 5 परिणामों की आवश्यकता है तो यह मेरी गर्दन तोड़ देगा (तालिका में उपयोग करने योग्य सूचकांक है)।जेडीबीसी सेटमैक्सरो डेटाबेस उपयोग

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

क्या मैं डेटाबेस को बताने के लिए setMaxRows पर भरोसा कर सकता हूं?

मुझे लगता है कि सबसे खराब मामले में मैं इस काम पर भरोसा नहीं कर सकता हूं। मुझे ज्यादातर पोस्टग्रेस 9.1 और ओरेकल 11.2 में दिलचस्पी है, इसलिए यदि किसी को इन डेटाबेस के साथ अनुभव है, तो कृपया आगे बढ़ें।

+2

अच्छा प्रश्न है। जावाडोक कहते हैं, "पंक्तियों है कि किसी भी ResultSet इस वक्तव्य वस्तु द्वारा उत्पन्न वस्तु दी गई संख्या को शामिल कर सकते हैं की अधिकतम संख्या के लिए सीमा सेट करता है। सीमा पार हो गई है, तो अतिरिक्त पंक्तियों चुपचाप गिरा रहे हैं।" जिस तरह से मैंने इसे पढ़ा, इसका तात्पर्य है कि जेडीबीसी चालक काम कर सकता है। मुझे अपने जेडीबीसी कार्यान्वयन पर संदेह है। –

उत्तर

3

डेटाबेस को चतुर क्वेरी योजना बनाने और आवश्यक से अधिक परिणाम लाने से रोक देगा।

तो आप का उपयोग

PostgreSQL:

SELECT * FROM tbl ORDER BY col1 LIMIT 10; -- slow without index 

या:

SELECT * FROM tbl LIMIT 10;    -- fast even without index 

Oracle:

SELECT * 
FROM (SELECT * FROM tbl ORDER BY col1 DESC) 
WHERE ROWNUM < 10; 

.. तो केवल 10 पंक्तियां लौटा दी जाएंगी। लेकिन यदि आप शीर्ष 10, चुनने से पहले अपनी पंक्तियों को सॉर्ट करते हैं तो सभी मूल रूप से योग्यता पंक्तियां को सॉर्ट करने से पहले पढ़ेगी।

मिलान करने वाली अनुक्रमणिका इस ओवरहेड को रोक सकती हैं!


आप अनिश्चित, क्या JDBC वास्तव में डेटाबेस सर्वर से भेज रहे हैं, एक परीक्षण चलाने के लिए और डेटाबेस इंजन प्राप्त बयानों लॉग ऑन कर सकते है। PostgreSQL में आप कर सकते हैं set in postgresql.conf:

log_statement = all 

(और पुनः लोड) सर्वर के लिए भेजा सभी बयान लॉग इन करें। परीक्षण के बाद उस सेटिंग को रीसेट करना सुनिश्चित करें या आपकी लॉग फाइलें बड़ी हो सकती हैं।

1

जो चीज आपको अरबों (ओं) पंक्तियों के साथ मार सकती है (आपकी संभावना है) ORDER BY आपकी क्वेरी में क्लॉज है। यदि इस आदेश को किसी इंडेक्स का उपयोग करके स्थापित नहीं किया जा सकता है। । । यह आपकी गर्दन तोड़ देगा :)

मैं यहां जेडीबीसी चालक पर निर्भर नहीं रहूंगा। जैसा कि पिछली टिप्पणी बताती है कि यह स्पष्ट नहीं है कि यह वास्तव में क्या करता है (विभिन्न rdbms को देखकर)।

यदि आप अपनी क्वेरी की गति के बारे में चिंतित हैं तो आप LIMIT खंड का भी उपयोग कर सकते हैं।यदि आप LIMIT का उपयोग करते हैं तो आप कम से कम सुनिश्चित कर सकते हैं कि यह डीबी सर्वर पर पास हो गया है।

संपादित करें: माफ करना, मुझे लगता है कि ओरेकल LIMIT का समर्थन नहीं करता पता नहीं था।

1
PostgreSQL 9.1 के बारे में अपने प्रश्न के

सीधा जवाब में: हाँ, JDBC ड्राइवर आप क्या सेट परे पंक्तियों पैदा करने को रोकने के लिए सर्वर बता देंगे।

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

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