2008-10-27 15 views
71

के साथ पेजिंग मैं ओरेकल से परिचित नहीं हूं जैसा कि मैं बनना चाहता हूं। मेरे पास कुछ 250k रिकॉर्ड हैं, और मैं उन्हें प्रति पृष्ठ 100 प्रदर्शित करना चाहता हूं। वर्तमान में मेरे पास एक संग्रहीत प्रक्रिया है जो एक डेटा एडाप्टर, और डेटासेट, और डेटा एडाप्टर का उपयोग कर डेटासेट में दस लाख रिकॉर्ड की सभी तिमाही पुनर्प्राप्त करता है। संग्रहीत प्रो से परिणामों पर भरें (डेटासेट) विधि। यदि मेरे पास पूर्णांक मान के रूप में "पृष्ठ संख्या" और "प्रति पृष्ठ रिकॉर्ड की संख्या" है, तो मैं पैरामीटर के रूप में पास कर सकता हूं, केवल उस विशेष अनुभाग को वापस पाने का सबसे अच्छा तरीका क्या होगा। कहें, अगर मैं पेज नंबर के रूप में 10 पास करता हूं, और 120 पेजों की संख्या के रूप में चुनिंदा बयान से, तो मुझे 1880 वें से 1200 वें, या ऐसा कुछ भी मिलेगा, मेरे सिर में मेरा गणित बंद हो सकता है।ओरेकल

मैं इसे .NET के साथ .NET में कर रहा हूं, सोचा कि यह महत्वपूर्ण नहीं है, अगर मैं इसे एसक्यूएल पक्ष पर सही कर सकता हूं, तो मुझे ठंडा होना चाहिए।

अपडेट: मैं ब्रायन के सुझाव का उपयोग करने में सक्षम था, और यह बहुत अच्छा काम कर रहा है। मैं कुछ अनुकूलन पर काम करना चाहता हूं, लेकिन पेज एक मिनट के बजाय 4 से 5 सेकंड में आ रहे हैं, और मेरा पेजिंग नियंत्रण मेरी नई संग्रहित प्रोसेस के साथ बहुत अच्छी तरह से एकीकृत करने में सक्षम था।

उत्तर

112

कुछ इस तरह काम करना चाहिए: From Frans Bouma's Blog

SELECT * FROM 
(
    SELECT a.*, rownum r__ 
    FROM 
    (
     SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%' 
     ORDER BY OrderDate DESC, ShippingDate DESC 
    ) a 
    WHERE rownum < ((pageNumber * pageSize) + 1) 
) 
WHERE r__ >= (((pageNumber-1) * pageSize) + 1) 
+0

ROWNUM एक आरक्षित शब्द है जारी करके अपने Oracle संस्करण की जाँच कर सकते हैं? –

+3

हां यह ओरेकल का एक 'निर्मित' कॉलम है, यह हमेशा 1 से शुरू होता है और प्रत्येक पंक्ति के लिए वृद्धि करता है। तो कोड के इस स्निपेट में, यदि आपके पास 1000 पंक्तियां हैं, तो सॉर्ट ऑर्डर लागू होता है और फिर प्रत्येक पंक्ति को राउनम असाइन किया जाता है। बाहरी चयन (ओं) उन पृष्ठों की संख्या का पता लगाने के लिए करते हैं जिन्हें आप अपने पेजसाइज के आधार पर देख रहे हैं। –

+5

यह अच्छा है, लेकिन बड़े चयनों पर बहुत धीमा है, बस जांचें कि 0 से 1000 और 500.000 से 501.000 का चयन करने का समय क्या होगा ... मैं इस तरह की चुनिंदा संरचना का उपयोग कर रहा था, अब मैं एक वर्कअराउंड खोज रहा हूं। – newhouse

109

Ask Tom पृष्ठांकन और बहुत, बहुत उपयोगी विश्लेषणात्मक कार्यों पर।

यह है कि इस पृष्ठ का उद्धरण है:

select * from (
    select /*+ first_rows(25) */ 
    object_id,object_name, 
    row_number() over 
    (order by object_id) rn 
     from all_objects) 
    where rn between :n and :m 
     order by rn; 
+3

यह वास्तव में एक बेहतर कार्यान्वयन है, हालांकि उस पोस्ट को ढूंढना मुश्किल है। जब आपके पास बहुत सारे बड़े पृष्ठ होते हैं, तो दूसरा उत्तर भी पूर्व पृष्ठों से सभी पंक्तियों पर जाना चाहिए। जटिल प्रश्नों में, इसका मतलब है कि बाद के पृष्ठ पिछले पृष्ठों की तुलना में खराब प्रदर्शन करते हैं। – tallseth

+0

@ टॉल्सथ आप सही हैं। इसे उस पृष्ठ पर ढूंढना मुश्किल है। अंश जोड़ा गया है। – Chobicus

4

प्रयास करें निम्नलिखित:

के माध्यम से
SELECT * 
FROM 
    (SELECT FIELDA, 
    FIELDB, 
    FIELDC, 
    ROW_NUMBER() OVER (ORDER BY FIELDC) R 
    FROM TABLE_NAME 
    WHERE FIELDA = 10 
) 
WHERE R >= 10 
AND R <= 15; 

[tecnicume]

31

पूर्णता के हित में, एक और अधिक आधुनिक समाधान की तलाश में लोगों के लिए, में ओरेकल 12 सी बेहतर पेजिंग और शीर्ष हैंडलिंग सहित कुछ नई विशेषताएं हैं।

पेजिंग

पेजिंग इस तरह दिखता है:

SELECT * 
FROM user 
ORDER BY first_name 
OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; 

शीर्ष N रिकॉर्ड्स

शीर्ष रिकॉर्ड हो रही इस तरह दिखता है:

SELECT * 
FROM user 
ORDER BY first_name 
FETCH FIRST 5 ROWS ONLY 

ध्यान दें कि उपर्युक्त क्वेरी उदाहरणों में ORDER BY क्लॉज दोनों हैं। नए आदेश इन का सम्मान करते हैं और क्रमबद्ध डेटा पर चलाए जाते हैं।

मुझे FETCH या OFFSET के लिए अच्छा ओरेकल संदर्भ पृष्ठ नहीं मिला लेकिन this page इन नई सुविधाओं का एक शानदार अवलोकन है।

5

बस उत्तर और टिप्पणियों को सारांशित करना चाहते हैं। अंकन करने के कई तरीके हैं।

ओरेकल से पहले 12C कोई OFFSET गया/कार्यक्षमता लाओ, इतनी के रूप में @jasonk सुझाव whitepaper पर एक नज़र डालें। यह फायदे और नुकसान के विस्तृत स्पष्टीकरण के साथ विभिन्न तरीकों के बारे में मैंने पाया सबसे पूरा लेख है।उन्हें यहां कॉपी-पेस्ट करने में काफी समय लगेगा, इसलिए मैं इसे नहीं करूँगा।

ज्यूक रचनाकारों से ओरेकल और अन्य डेटाबेस पेजिनेशन के साथ कुछ सामान्य चेतावनियों को समझाते हुए एक अच्छा लेख भी है। jooq's blogpost

अच्छी खबर, ओरेकल 12 सी के बाद से हमारे पास एक नई ऑफसेट/फ़ेच कार्यक्षमता है। OracleMagazine 12c new features। कृपया "शीर्ष N क्वेरी तथा पृष्ठांकन" का उल्लेख

आप निम्नलिखित बयान

SELECT * FROM V$VERSION