ডিবি 2 এর জন্য সীমাবদ্ধ সমান


94

LIMITআইসারিগুলির জন্য আপনি ডিবি 2 এ কীভাবে করবেন ?

আমার কাছে 50,000 এরও বেশি রেকর্ড সহ একটি টেবিল রয়েছে এবং আমি 0 থেকে 10,000 এবং রেকর্ড 10,000 থেকে 20,000 রেকর্ড করতে চাই।

আমি এসকিউএল এ জানি যে আপনি কোয়েরির LIMIT 0,10000শেষে 0 থেকে 10,000 এবং LIMIT 10000,10000কোয়েরির শেষে 10000 থেকে 20,000 লিখেছেন

তো, ডিবি 2 এ এটি কীভাবে হয়? কোড এবং সিনট্যাক্স কি? (সম্পূর্ণ প্রশ্নের উদাহরণ প্রশংসা করা হয়)


ROW_NUMBER () কেবলমাত্র iSeries DB2 V5R4 এ প্রয়োগ করা হয়েছিল। পূর্ববর্তী সংস্করণগুলির জন্য আরআরএন () ব্যবহার করার চেষ্টা করুন যা অনুরূপ।
পল মরগান

আরআরএন () রো-সংখ্যা () এর চেয়ে সম্পূর্ণ আলাদা।
ব্র্যান্ডন পিটারসন

আমার জন্য কাজ করেনি। সিট্যান্স ত্রুটি।
এলকুল

4
আরআরএন (ফাইলের নাম) চেষ্টা করুন যা সারিটির দৈহিক আপেক্ষিক রেকর্ড নম্বর দেবে। আরআরএন অনুক্রমিক হবে না এবং সারিগুলি মোছা হয়ে গেলে সংখ্যাগুলি এড়িয়ে যেতে পারে। আরআরএন কী দ্বারা ক্রমিকও হবে না তবে কোনও মুছে ফেলা না হলে সংযোজনের ভিত্তিতে ক্রমযুক্ত হবে। যে কোনও ক্ষেত্রে আরআরএন একটি সারির জন্য অনন্য হবে এবং টেবিলের সাবসেটগুলি নির্বাচন করতে ব্যবহার করা যেতে পারে।
পল মরগান

উত্তর:


143

ব্যবহার FETCH FIRST [n] ROWS ONLY:

http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm

SELECT LASTNAME, FIRSTNAME, EMPNO, SALARY
  FROM EMP
  ORDER BY SALARY DESC
  FETCH FIRST 20 ROWS ONLY;

ব্যাপ্তিগুলি পেতে, আপনাকে ROW_NUMBER()(v5r4 সাল থেকে) ব্যবহার করতে হবে এবং সেই WHEREধারাটির মধ্যে এটি ব্যবহার করতে হবে : (এখান থেকে চুরি হয়েছে: http://www.justskins.com/forums/db2-select-how-to-123209.html )

SELECT code, name, address
FROM ( 
  SELECT row_number() OVER ( ORDER BY code ) AS rid, code, name, address
  FROM contacts
  WHERE name LIKE '%Bob%' 
  ) AS t
WHERE t.rid BETWEEN 20 AND 25;

হ্যাঁ, আমি এটিও পেয়েছি, হি। আমি একই সময়ে প্রশ্নটি সম্পাদনা করছিলাম যাতে আমি মাঝারি সারিগুলিও চাই তা বোঝাতে।
এলকুল

4
আপনাকে ROW_NUMBER এর সাথে এই জাতীয় কিছু করতে হবে: justtskins.com/forums/db2-select-how-to-123209.html
জো

ROW_NUMBERকোনও বৈধ কীওয়ার্ড নয়। তবে সংযোগের জন্য THX, এটি আমাকে একটি ধারণা দিয়েছে এবং এটি কাজ করে।
এলকুল

13

এই পদ্ধতিটি বিকশিত হয়েছে:

আপনি একটি সারণীর প্রয়োজন যার একটি অনন্য মূল্য রয়েছে যাতে অর্ডার দেওয়া যায়।

আপনি যদি 10,000 থেকে 25,000 সারি চান এবং আপনার টেবিলটিতে 40,000 সারি রয়েছে, প্রথমে আপনাকে প্রারম্ভিক পয়েন্ট এবং মোট সারিগুলি পাওয়া দরকার:

int start = 40000 - 10000;

int total = 25000 - 10000;

এবং তারপরে কোয়েরিতে কোড দিয়ে এগুলি পাস করুন:

SELECT * FROM 
(SELECT * FROM schema.mytable 
ORDER BY userId DESC fetch first {start} rows only ) AS mini 
ORDER BY mini.userId ASC fetch first {total} rows only

নোট করুন যে 10000 তম সারিটি রেজাল্ট সেট থেকে বাদ পড়েছে, প্রথম সারিটি 10001st।
ব্লু করুন

4
আকর্ষণীয় সমাধান। আমি এটি H2 পরীক্ষার ডাটাবেসের সাথে সামঞ্জস্যের জন্য ব্যবহার করতে যাচ্ছিলাম ... তবে, দুঃখের বিষয়, এটি SELECT রো_নম্বার () ওভার (অর্ডার দ্বারা কোড) পদ্ধতির চেয়ে 30 গুণ গতি কম কাজ করে।
মানুনা

9

অফসেট এবং লিমিটেডের জন্য সমর্থনটি আমি সম্প্রতি recently.১ এবং .2.২ এর জন্য ডিবি 2-এ যুক্ত করা হয়েছিল। এই সমর্থনটি পেতে আপনার নিম্নলিখিত ডিবি পিটিএফ গ্রুপ স্তরের প্রয়োজন:

  • আইবিএম i 7.2 এর জন্য এসএফ 99702 স্তর 9
  • আইবিএম আমি 7.1 এর জন্য এসএফ 99701 স্তর 38

আরও তথ্যের জন্য এখানে দেখুন: অফসেট এবং লিমিটেড ডকুমেন্টেশন , আই এনহান্সমেন্ট উইকির জন্য ডিবি 2


7

সমাধানটি আমি এখানে নিয়ে এসেছি:

select FIELD from TABLE where FIELD > LASTVAL order by FIELD fetch first N rows only;

লাস্টভালকে 0 থেকে শুরু করে (বা একটি পাঠ্য ক্ষেত্রের জন্য) 'দিয়ে, এরপরে এটি রেকর্ডের সাম্প্রতিকতম সেটটিতে সর্বশেষ মান হিসাবে সেট করে, এটি এন রেকর্ডের অংশে সারণির মধ্য দিয়ে যাবে step


(আমি প্রথমে ভেবেছিলাম আপনি টেবিলের মান নির্ধারণ করছেন যা একযোগে সিস্টেমের ক্ষেত্রে দর্শনীয়ভাবে সমস্যাযুক্ত হবে) হ্যাঁ, আপনি টেবিলের মাধ্যমে পড়া অনুক্রমিক কাজ করছেন এমন ক্ষেত্রে এটি কাজ করা উচিত, যদিও আপনার কোনও প্রকারের প্রয়োজন হবে টাই-ব্রেকার কলাম যেখানে ক্ষেত্রে কলামে Nঅভিন্ন মানের সংখ্যার চেয়ে ছোট (যদিও এটি ব্যবহার করার ROW_NUMBER()সময়ও এটি সত্য )। প্রাথমিক মানগুলিও যত্ন সহকারে চয়ন করতে 0হবে - কলামটিতে negativeণাত্মক মান থাকলে স্পষ্টতই সমস্যাযুক্ত হবে । নাল দিয়ে যত্ন নেওয়া দরকার। পৃষ্ঠাগুলি এড়িয়ে গেলে কাজ করবে না।
ক্লকওয়ার্ক-যাদুঘর

মন্তব্যের জন্য ধন্যবাদ. আমি মনে করি এর একটি অন্তর্নিহিত ধারণা আছে যে আমরা ক্যোয়ারী নিয়ন্ত্রণ করতে ক্ষেত্রটি অনন্য এবং একঘেয়েভাবে বৃদ্ধি পাচ্ছে। আমি সম্মত হই যে যদি এই অনুমানগুলি ধরে না রাখে, এটি সারণীতে থাকা সমস্ত রেকর্ড দেখার জন্য কাজ করবে না। এবং অবশ্যই, আপনি সঠিক যে আপনি একটি শেষ থেকে শুরু করতে হবে যে বোঝার জন্য। সাধারণভাবে, আমি মনে করি আপনি "টেবিল থেকে নির্বাচন করুন মিনিমাম (ফিল্ড)" যা ফিরিয়ে নিয়েছেন তা দিয়েই আপনি শুরু করতে চান। যদি ক্ষেত্রটি সূচকযুক্ত হয় তবে বেশিরভাগ ডিবি ইঞ্জিনগুলি যথাযথভাবে পুরো টেবিলটি পড়ার চেয়ে আরও ভাল করবে।
টম ব্যারন

2

@ এলকুলের সমাধানটি একটি স্মার্ট ধারণা, তবে আপনার মোট সারির সংখ্যা জানতে হবে (যা আপনি ক্যোয়ারি চালানোর সময়ও বদলে যেতে পারে!)। সুতরাং আমি একটি পরিবর্তিত সংস্করণ প্রস্তাব করছি, যার দুর্ভাগ্যক্রমে 2 এর পরিবর্তে 3 টি সাবকিউরির প্রয়োজন:

select * from (
    select * from (
        select * from MYLIB.MYTABLE
        order by MYID asc 
        fetch first {last} rows only 
        ) I 
    order by MYID desc
    fetch first {length} rows only
    ) II
order by MYID asc

যেখানে {last}আমার শেষ রেকর্ডের সারি সংখ্যাটি {length}প্রতিস্থাপন করা উচিত এবং আমার প্রয়োজনীয় সারিগুলির সংখ্যার সাথে প্রতিস্থাপন করা উচিত, হিসাবে গণনা করা হয়েছে last row - first row + 1

উদাহরণস্বরূপ, যদি আমি 10 থেকে 25 (সম্পূর্ণ 16 সারি) সারিগুলি চাই, {last}25 {length}হবে এবং 25-10 + 1 = 16 হবে।


যখন অন্য ব্যক্তি তাদের প্রশ্নের উত্তর দিতে সময় নেয় তখন আমি তাদেরকে ঘৃণা করি।
jp2code

1

আপনার এন রাউজ ক্লজটি অপটিমাইজ করা উচিত। এগুলি সম্পর্কে আরও বিস্তারিত ডিবি 2 এলইউডাব্লু ডকুমেন্টেশনে SELECT বিবৃতি বিষয়গুলিকে সীমাবদ্ধ করার জন্য নির্দেশিকাগুলিতে :

  • অপ্টিমাইজ ফর ক্লজটি ফলাফলের কেবলমাত্র একটি উপসেট পুনরুদ্ধার করার জন্য বা কেবল প্রথম কয়েকটি সারি পুনরুদ্ধার করার জন্য অগ্রাধিকার দেওয়ার ঘোষণা দেয়। অপ্টিমাইজারটি অ্যাক্সেস প্ল্যানগুলি চয়ন করতে পারে যা প্রথম কয়েকটি সারি পুনরুদ্ধারের জন্য প্রতিক্রিয়া সময়কে হ্রাস করে।


0

একটি ডিবি 2 টেবিলটিতে দক্ষতার সাথে পৃষ্ঠা সম্পাদনের জন্য 2 টি সমাধান রয়েছে:

1 - ফাংশন রো_ নাম্বার () এবং প্রযুক্তিটি ওভার ক্লজ ওভার যা অন্য পোস্টে উপস্থাপন করা হয়েছে ("নির্বাচন করুন সারি_নম্বার () ওভার (অর্ডার দ্বারা ...)")। কিছু বড় টেবিলগুলিতে, আমি মাঝে মাঝে পারফরম্যান্সের অবনতি লক্ষ্য করেছি।

2 - একটি স্ক্রোলযোগ্য কার্সার ব্যবহার কৌশল। প্রয়োগ ভাষা নির্ভর করে। বড় টেবিলগুলিতে সেই কৌশলটি আরও দৃust় বলে মনে হয়।

আমি পরের বছর একটি সেমিনারে পিএইচপি বাস্তবায়িত 2 কৌশল উপস্থাপন করেছি। স্লাইডটি এই লিঙ্কটিতে উপলব্ধ: http://gregphplab.com/serendipity/uploads/slides/DB2_PHP_best_practices.pdf

দুঃখিত তবে এই দস্তাবেজটি কেবল ফরাসি ভাষায়।


0

এই উপলব্ধ বিকল্পগুলি থেরেস করে: -

DB2 has several strategies to cope with this problem.
You can use the "scrollable cursor" in feature.
In this case you can open a cursor and, instead of re-issuing a query you can FETCH forward and backward.
This works great if your application can hold state since it doesn't require DB2 to rerun the query every time.
You can use the ROW_NUMBER() OLAP function to number rows and then return the subset you want.
This is ANSI SQL 
You can use the ROWNUM pseudo columns which does the same as ROW_NUMBER() but is suitable if you have Oracle skills.
You can use LIMIT and OFFSET if you are more leaning to a mySQL or PostgreSQL dialect.  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.