বড় টেবিলগুলিতে সারি গণনা পোস্টগ্র্রেএসকিউএল-তে ধীর বলে পরিচিত। একটি সুনির্দিষ্ট নম্বর পেতে এটি এমভিসিসির প্রকৃতির কারণে সারিগুলির একটি সম্পূর্ণ গণনা করতে হবে । একটি উপায় নেই এই পর্যন্ত নাটকীয়ভাবে গতি যদি গণনা করে না হতে হবে সঠিক মত আপনার ক্ষেত্রে মনে করা হয়।
সঠিক গণনা পরিবর্তে ( ধীর গতিতে) বড় টেবিল সহ):
SELECT count(*) AS exact_count FROM myschema.mytable;
আপনি এটির মতো একটি কাছাকাছি অনুমান পান ( অত্যন্ত দ্রুত) ):
SELECT reltuples::bigint AS estimate FROM pg_class where relname='mytable';
অনুমানটি কতটা নিকটবর্তী তা নির্ভর করে আপনি ANALYZE
যথেষ্ট চালাচ্ছেন কিনা । এটি সাধারণত খুব কাছাকাছি হয়।
দেখুন পোস্টগ্রি উইকি প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী ।
বা গণনা (*) পারফরম্যান্সের জন্য ডেডিকেটেড উইকি পৃষ্ঠা ।
এখনো ভাল
পোস্টগ্রি উইকি নিবন্ধ হয় ছিল একটি বিট পঙ্কিল । এটি এই সম্ভাবনাটিকে উপেক্ষা করেছে যে একই স্ক্রিনে বিভিন্ন ডাটাবেসে একই নামের একাধিক টেবিল থাকতে পারে। তার জন্য অ্যাকাউন্ট করতে:
SELECT c.reltuples::bigint AS estimate
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname = 'mytable'
AND n.nspname = 'myschema'
বা আরও ভাল এখনও
SELECT reltuples::bigint AS estimate
FROM pg_class
WHERE oid = 'myschema.mytable'::regclass;
দ্রুততর, সহজ, নিরাপদ, আরও মার্জিত। ম্যানুয়ালটি চালু করুনঅবজেক্ট আইডেন্টিফায়ার প্রকারের ।
ব্যবহার to_regclass('myschema.mytable')
অবৈধ সারণীর নামগুলির ব্যতিক্রম এড়াতে পোস্টগ্রিস 9.4+ এ :
SELECT 100 * count(*) AS estimate FROM mytable TABLESAMPLE SYSTEM (1);
@ A_horse মন্তব্য করার মতো , SELECT
কমান্ডের জন্য সদ্য যুক্ত হওয়া ধারাটি যদি পরিসংখ্যানে থাকে তবে দরকারী হতে পারেpg_class
কোনও কারণে যথেষ্ট পরিমাণে বর্তমান না হয় । উদাহরণ স্বরূপ:
- না
autovacuum
চলছে।
- তাত্ক্ষণিকভাবে একটি বড় পরে
INSERT
বা DELETE
।
TEMPORARY
টেবিল (যা দ্বারা আচ্ছাদন করা হয় না) autovacuum
)।
এটি কেবল একটি এলোমেলো n % ( 1
উদাহরণস্বরূপ) ব্লকগুলির নির্বাচন এবং এর মধ্যে সারিগুলি গণনা করে দেখায় । একটি বড় নমুনা ব্যয় বৃদ্ধি করে এবং ত্রুটি হ্রাস করে, আপনার বাছাই করে। নির্ভুলতা আরও বেশি কারণের উপর নির্ভর করে:
- সারি আকার বিতরণ। যদি কোনও প্রদত্ত ব্লকটি সাধারণ সারির চেয়ে বৃহত্তর ধরে রাখে, গণনা স্বাভাবিকের চেয়ে কম হয় ইত্যাদি If
- মৃত tuples বা ক
FILLFACTOR
প্রতি ব্লকের স্থান দখল করুন। অসমভাবে টেবিল জুড়ে বিতরণ করা হলে অনুমানটি বন্ধ হতে পারে।
- সাধারণ রাউন্ডিং ত্রুটি।
বেশিরভাগ ক্ষেত্রেই অনুমানটি pg_class
দ্রুত এবং আরও নির্ভুল হবে।
প্রকৃত প্রশ্নের উত্তর
প্রথমত, আমাকে সেই টেবিলের সারিগুলির সংখ্যা জানতে হবে, যদি মোট গণনাটি কোনও পূর্বনির্ধারিত ধ্রুবকের চেয়ে বেশি হয়,
এবং তা ...
... গণনাটি আমার ধ্রুবক মান পাস করার মুহুর্তে এটি সম্ভব, এটি গণনা বন্ধ করে দেবে (এবং সারি গণনা আরও বেশি জানাতে গণনা শেষ করার অপেক্ষায় থাকবে না)।
হ্যাঁ. আপনি এটি সহLIMIT
একটি subquery ব্যবহার করতে পারেন :
SELECT count(*) FROM (SELECT 1 FROM token LIMIT 500000) t;
পোস্টগ্রিস আসলে প্রদত্ত সীমা ছাড়িয়ে গণনা বন্ধ করে দেয় , আপনি n সারি (উদাহরণে 500000) এবং অন্যথায় n এর জন্য একটি সঠিক এবং বর্তমান গণনা পাবেন । যদিও অনুমান হিসাবে প্রায় দ্রুত না ।pg_class