ওরাকল দিয়ে পেজিং


98

আমি যতটা হতে চাই ওরাকেলের সাথে তেমন পরিচিত নই। আমার কাছে প্রায় 250 কে রেকর্ড রয়েছে এবং আমি প্রতি পৃষ্ঠায় তাদের 100 প্রদর্শন করতে চাই। বর্তমানে আমার কাছে একটি সঞ্চিত পদ্ধতি রয়েছে যা ডেটা অ্যাডাপ্টার এবং ডেটাসেট এবং ডেটাডাপ্টার ব্যবহার করে মিলিয়ন রেকর্ডের সমস্ত চতুর্থাংশ পুনরুদ্ধার করে stored যদি আমার কাছে "পৃষ্ঠা নম্বর" এবং "প্রতি পৃষ্ঠায় রেকর্ডের সংখ্যা" থাকে তবে আমি প্যারামিটার হিসাবে পাস করতে পারি, ঠিক সেই নির্দিষ্ট বিভাগটি ফিরে পাওয়ার সর্বোত্তম উপায় কী হবে। বলুন, আমি যদি একটি পৃষ্ঠা নম্বর হিসাবে 10 এবং পৃষ্ঠাগুলির সংখ্যা হিসাবে 120 পাস করি, বাছাইকৃত বিবৃতি থেকে এটি আমাকে 1880 তম দিয়ে 1200 তম বা তার মতো কিছু দেবে, আমার মাথার মধ্যে অঙ্কটি বন্ধ হয়ে যেতে পারে।

আমি সি # এর সাথে নেট এ এটি করছি, ভেবেছিলাম এটি গুরুত্বপূর্ণ নয়, যদি আমি এটি বর্গের পাশে পেতে পারি তবে আমার শান্ত হওয়া উচিত।

আপডেট: আমি ব্রায়ানের পরামর্শটি ব্যবহার করতে সক্ষম হয়েছি এবং এটি দুর্দান্ত কাজ করছে। আমি কিছু অপ্টিমাইজেশনে কাজ করতে চাই, তবে পৃষ্ঠাগুলি এক মিনিটের পরিবর্তে 4 থেকে 5 সেকেন্ডে উঠে আসবে, এবং আমার পেজিং নিয়ন্ত্রণটি আমার নতুন সঞ্চিত প্রোক্সের সাথে খুব ভালভাবে সংহত করতে সক্ষম হয়েছিল।

উত্তর:


148

এর মতো কিছু কাজ করা উচিত: ফ্রান্সস বোমার ব্লগ থেকে

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)

4
হ্যাঁ এটি একটি 'বিল্ট ইন' কলাম যা ওરેકল সমর্থন করে, এটি সর্বদা 1 থেকে শুরু হয় এবং প্রতিটি সারির জন্য বৃদ্ধি হয়। সুতরাং কোডের এই স্নিপেটে, আপনার যদি 1000 সারি থাকে, তবে সাজানোর ক্রম প্রয়োগ করা হয় এবং তারপরে প্রতিটি সারিকে একটি রোমনাম বরাদ্দ করা হয়। বাহ্যিক নির্বাচন (গুলি) আপনার পৃষ্ঠাগুলির উপর ভিত্তি করে আপনি সন্ধান করছেন এমন 'পৃষ্ঠা' সনাক্ত করতে সেই সারি নম্বরগুলি ব্যবহার করুন।
ব্রায়ান স্মিট

9
এটি দুর্দান্ত, তবে বড় নির্বাচনগুলিতে মারাত্মক ধীরে ধীরে ধীরে ধীরে 0 থেকে 1000 এবং 500.000 থেকে 501.000 নির্বাচন করার সময়টি কী হবে তা পরীক্ষা করে দেখুন ... আমি এখন এই ধরণের নির্বাচিত কাঠামোটি ব্যবহার করছিলাম এখন আমি একটি কাজের সন্ধান করছি।
নিউহাউস

4
@ n3Wous3 আপনি এটি চেষ্টা করতে পারেন - inf.unideb.hu/~gabora/pagination/results.html
জেসনক

7
আমি ভাবলাম কেন দু'জনকে WHEREএকত্রিত করা গেল না AND, এবং তারপরে এটি পাওয়া গেল: orafaq.com/wiki/ROWNUM
মেনগদি গাও

4
ওরাকল পৃষ্ঠাগুলি আমার দিনকে নষ্ট করে দেয়।
এথেরাস

136

পৃষ্ঠাসমূহ এবং খুব, খুব দরকারী বিশ্লেষণমূলক কার্যাদি সম্পর্কে টমকে জিজ্ঞাসা করুন।

এটি পৃষ্ঠাটি থেকে উদ্ধৃত:

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;

7
এটি আসলে আরও কার্যকর বাস্তবায়ন, যদিও এই পোস্টে খুঁজে পাওয়া শক্ত to আপনার যখন অনেক বড় পৃষ্ঠা রয়েছে, অন্য উত্তরটি অবশ্যই পূর্ববর্তী পৃষ্ঠাগুলি থেকে সমস্ত সারি পেরিয়ে যেতে হবে। জটিল প্রশ্নের মধ্যে, এর অর্থ হ'ল পরবর্তী পৃষ্ঠাগুলি আগের পৃষ্ঠাগুলির চেয়ে আরও খারাপ সম্পাদন করে।
দীর্ঘতম

আপনি ঠিক বলেছেন এটি পৃষ্ঠাতে এটি পাওয়া কঠিন। অংশ সংযুক্ত করা হয়।
Chobicus

আপনার ক্রম পরিবর্তন করতে চাইলে এটি সঠিক উত্তর।
চেকদা

76

সম্পূর্ণতার স্বার্থে, আরও আধুনিক সমাধান খুঁজছেন এমন লোকদের জন্য, ওরাকল 12 সি-তে আরও ভাল নতুন পেজিং এবং শীর্ষের হ্যান্ডলিং সহ কয়েকটি নতুন বৈশিষ্ট্য রয়েছে।

পেজিং

পেজিংয়ের মতো দেখাচ্ছে:

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

শীর্ষ এন রেকর্ডস

শীর্ষস্থানীয় রেকর্ডগুলি পাওয়া দেখে মনে হচ্ছে:

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

উপরের ক্যোয়ারী উদাহরণগুলিতে কীভাবে ORDER BYক্লজ রয়েছে তা লক্ষ্য করুন। নতুন কমান্ডগুলি এগুলি সম্মান করে এবং সাজানো ডেটাতে চালিত হয়।

আমি FETCHবা এর জন্য একটি ভাল ওরাকল রেফারেন্স পৃষ্ঠা খুঁজে পাইনি OFFSETতবে এই পৃষ্ঠাতে এই নতুন বৈশিষ্ট্যগুলির একটি দুর্দান্ত ওভারভিউ রয়েছে।

কর্মক্ষমতা

@ উইউইকার নীচের মন্তব্যে যেমন উল্লেখ করেছেন, পারফরম্যান্স 12 সি তে নতুন সিনট্যাক্স সহ একটি সমস্যা। ওরাকল এর পরে এটি উন্নত করেছে কিনা তা পরীক্ষা করার জন্য আমার কাছে 18c এর একটি অনুলিপি ছিল না।

আকর্ষণীয়ভাবে যথেষ্ট, নতুন পদ্ধতির জন্য প্রথমবার আমার টেবিলে (১১৩ মিলিয়ন + সারি) কোয়েরি চালানোর সময় আমার আসল ফলাফলগুলি কিছুটা দ্রুত ফিরে এসেছিল:

  • নতুন পদ্ধতি: 0.013 সেকেন্ড।
  • পুরানো পদ্ধতি: 0.107 সেকেন্ড।

যাইহোক, @ উইকিয়ার হিসাবে উল্লেখ করা হয়েছে, ব্যাখ্যা পদ্ধতিটি নতুন পদ্ধতির জন্য আরও খারাপ দেখায়:

  • নতুন পদ্ধতির ব্যয়: 300,110
  • পুরানো পদ্ধতির খরচ: 30

নতুন সিনট্যাক্সের ফলে আমার কলামে সূচকটির পুরো স্ক্যান হয়েছিল, যা পুরো ব্যয়। সম্ভাবনাগুলি হচ্ছে, আন-ইনডেক্সড ডেটা সীমাবদ্ধ করার সময় জিনিসগুলি আরও খারাপ হয়।

পূর্ববর্তী ডেটাসেটে একক আনইনডেক্সড কলাম সহ যখন আসুন একবার দেখে নেওয়া যাক:

  • নতুন পদ্ধতির সময় / ব্যয়: 189.55 সেকেন্ড / 998,908
  • পুরানো পদ্ধতির সময় / ব্যয়: 1.973 সেকেন্ড / 256

সংক্ষিপ্তসার: অ্যারাকল এই হ্যান্ডলিংয়ের উন্নতি না করা পর্যন্ত সতর্কতার সাথে ব্যবহার করুন। আপনার যদি কাজ করার একটি সূচক থাকে তবে সম্ভবত আপনি নতুন পদ্ধতিটি ব্যবহার করে পালিয়ে যেতে পারেন।

আশা করি শীঘ্রই খেলতে আমার 18 ক এর একটি অনুলিপি থাকবে এবং আপডেট করতে পারব


এটি
সি

4
সিনট্যাক্সটি পরিষ্কার, তবে কর্মক্ষমতা আরও খারাপ ( dba-preferences.com/index.php/datedias/oracle/… )
wweicker

জেনে রাখা ভাল, ধন্যবাদ @ উইকেটর আশা করি শিগগিরই ওরাকল দ্বারা পারফরম্যান্সটি ঠিক হয়ে গেছে; যদিও, ওরাকলকে জানা, এটি একটি দূরবর্তী আশা হতে পারে!
জোয়েলসি

সিনট্যাক্সটি নতুন এবং এটি নিয়মিত ROW_NUMBER / RANK কলগুলিতে রূপান্তরিত হয়। সম্পর্কিত অর্ডার দেওয়ার পরে আমি কীভাবে একটি ওরাকল ক্যোয়ারী দ্বারা ফিরে আসা সারির সংখ্যা সীমাবদ্ধ করব?
লুকাস্জ সজোডদা

@ জোয়েলসি আপনার মতামত কোন পরিবর্তন হয়েছে?
রায়ান

11

শুধু উত্তর এবং মন্তব্য সংক্ষিপ্ত করতে চান। পৃষ্ঠাগুলি করার বিভিন্ন উপায় রয়েছে।

ওরাকল 12 সি এর আগে অফসেট / ফিট কার্যকারিতা ছিল না, তাই @ জেসনকের পরামর্শ অনুসারে হোয়াইটপেপারটি একবার দেখুন । সুবিধাগুলি এবং অসুবিধাগুলির বিস্তারিত ব্যাখ্যা সহ বিভিন্ন পদ্ধতি সম্পর্কে আমি এটি খুঁজে পেয়েছি এটি সম্পূর্ণ সম্পূর্ণ নিবন্ধ। এগুলি এখানে অনুলিপি করতে একটি উল্লেখযোগ্য পরিমাণ সময় লাগবে, তাই আমি এটি করব না।

এছাড়াও জুক স্রষ্টাদের কাছ থেকে একটি সাধারণ নিবন্ধ রয়েছে যা কিছু সাধারণ ক্যাভ্যাটগুলি ওরাকল এবং অন্যান্য ডাটাবেস পৃষ্ঠাগুলি সহ ব্যাখ্যা করে। jooq এর ব্লগপোস্ট

সুসংবাদ, ওরাকল 12 সি থেকে আমাদের কাছে একটি নতুন অফসেট / ফেচ কার্যকারিতা রয়েছে। ওরাকলম্যাগাজিন 12 সি নতুন বৈশিষ্ট্য । দয়া করে "টপ-এন ক্যোয়ারী এবং পৃষ্ঠাগুলি" দেখুন

নিম্নলিখিত বিবৃতি জারি করে আপনি আপনার ওরাকল সংস্করণটি পরীক্ষা করতে পারেন

SELECT * FROM V$VERSION


0

আমার প্রকল্পে আমি ওরাকল 12 সি এবং জাভা ব্যবহার করেছি । পেজিং কোডটি দেখতে এমন দেখাচ্ছে:

 public public List<Map<String, Object>> getAllProductOfferWithPagination(int pageNo, int pageElementSize, Long productOfferId, String productOfferName) {
    try {

        if(pageNo==1){
            //do nothing
        } else{
            pageNo=(pageNo-1)*pageElementSize+1;
        }
        System.out.println("algo pageNo: " + pageNo +"  pageElementSize: "+ pageElementSize+"  productOfferId: "+ productOfferId+"  productOfferName: "+ productOfferName);

        String sql = "SELECT * FROM ( SELECT * FROM product_offer po WHERE po.deleted=0 AND (po.product_offer_id=? OR po.product_offer_name LIKE ? )" +
             " ORDER BY po.PRODUCT_OFFER_ID asc) foo OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ";

       return jdbcTemplate.queryForList(sql,new Object[] {productOfferId,"%"+productOfferName+"%",pageNo-1, pageElementSize});

    } catch (Exception e) {
        System.out.println(e);
        e.printStackTrace();
        return null;
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.