হ্যাঁ. একটি সাধারণ উইন্ডো ফাংশন সহ:
SELECT *, count(*) OVER() AS full_count
FROM tbl
WHERE
ORDER BY col1
OFFSET ?
LIMIT ?
মোট সচেতনতা ব্যতীত ব্যয়টি যথেষ্ট পরিমাণে বেশি হলেও সচরাচর দুটি পৃথক প্রশ্নের চেয়ে সস্তা aware পোস্টগ্রিসকে প্রকৃতপক্ষে সমস্ত সারি গণনা করতে হবে , যা মোট যোগ্যতার সারিগুলির মোট সংখ্যার উপর নির্ভর করে ব্যয় আরোপ করে। বিশদ:
যাইহোক , দানি যেভাবে উল্লেখ করেছেন , OFFSET
বেস ক্যোয়ারী থেকে কমপক্ষে সারিগুলির সংখ্যার চেয়ে বড় হয়ে গেলে কোনও সারি ফিরে আসে না। সুতরাং আমরাও পাই না full_count
।
যদি তা গ্রহণযোগ্য না হয় তবে সর্বদা সম্পূর্ণ গণনা ফেরত দেওয়ার সম্ভাব্য কাজটি সিটিই এবং একটি সহ OUTER JOIN
:
WITH cte AS (
SELECT *
FROM tbl
WHERE
)
SELECT *
FROM (
TABLE cte
ORDER BY col1
LIMIT ?
OFFSET ?
) sub
RIGHT JOIN (SELECT count(*) FROM cte) c(full_count) ON true;
খুব বড় full_count
হলে সংযুক্তিগুলির সাথে আপনি এক সারিতে NULL মান পাবেন OFFSET
। অন্যথায়, এটি প্রথম ক্যোয়ারের মতো প্রতিটি সারিতে যুক্ত হয়।
সমস্ত NULL মান সহ একটি সারি যদি সম্ভব বৈধ ফলাফল হয় তবে আপনাকে offset >= full_count
খালি সারির উত্স ছিন্ন করতে পরীক্ষা করতে হবে।
এটি এখনও একবারে বেস ক্যোয়ারী চালায়। তবে এটি ক্যোয়ারীতে আরও ওভারহেড যুক্ত করে এবং কেবলমাত্র পেমেন্ট দেয় যদি এটি গণনার জন্য বেস কোয়েরি পুনরাবৃত্তি করার চেয়ে কম হয়।
যদি চূড়ান্ত বাছাই অর্ডারকে সমর্থন করে সূচকগুলি উপলভ্য থাকে তবে ORDER BY
এটি সিটিইতে অন্তর্ভুক্ত করার জন্য অর্থ দিতে পারে (অতিরিক্তভাবে)।