পোস্টগ্রিসে আপনার সমস্ত টেবিলের জন্য আপনি সারি গণনাটি কীভাবে খুঁজে পাবেন


395

আমি পোস্টগ্রিসে আমার সমস্ত টেবিলের জন্য সারি গণনা সন্ধান করার জন্য একটি উপায় অনুসন্ধান করছি। আমি জানি আমি একসাথে এই টেবিলটি করতে পারি:

SELECT count(*) FROM table_name;

তবে আমি সমস্ত টেবিলের জন্য সারি গণনাটি দেখতে চাই এবং তারপরে আমার সমস্ত টেবিলগুলি কত বড় সে সম্পর্কে ধারণা পেতে সেটির মাধ্যমে আদেশ দিন।

উত্তর:


582

এই ধরণের গণনা পাওয়ার জন্য তিনটি উপায় রয়েছে, প্রত্যেকে তাদের নিজস্ব ট্রেড অফস সহ।

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

দ্বিতীয় পদ্ধতির নোটটি উল্লেখ করেছে যে পরিসংখ্যান সংগ্রহকারী যে কোনও সময়ে "লাইভ" (পরে মুছে ফেলা বা অপ্রচলিত নয়) কতগুলি সারি মোটামুটি ট্র্যাক করে। ভারী ক্রিয়াকলাপের অধীনে এই মানটি কিছুটা বন্ধ হয়ে যেতে পারে, তবে সাধারণত এটি একটি ভাল অনুমান:

SELECT schemaname,relname,n_live_tup 
  FROM pg_stat_user_tables 
  ORDER BY n_live_tup DESC;

এটি আপনাকে দেখায় যে কত সারি মারা গেছে, যা নিরীক্ষণ করা নিজেই একটি আকর্ষণীয় সংখ্যা।

তৃতীয় উপায়টি লক্ষ করা যায় যে সিস্টেম অ্যানালাইজেড কমান্ড, যা অটোভ্যাকুম প্রক্রিয়া নিয়মিত পোস্টগ্র্রেএসকিউএল 8.3 অনুযায়ী সারণীর পরিসংখ্যান আপডেট করার জন্য কার্যকর করা হয়, একটি সারি অনুমানও গণনা করে। আপনি এটির মতো এটি ধরতে পারেন:

SELECT 
  nspname AS schemaname,relname,reltuples
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE 
  nspname NOT IN ('pg_catalog', 'information_schema') AND
  relkind='r' 
ORDER BY reltuples DESC;

এই প্রশ্নের মধ্যে কোনটি ব্যবহার করা ভাল তা বলা শক্ত। সাধারণত আমি আরও কার্যকর তথ্য আমি pg_class বা pg_stat_user_tables এর ভিতরেও ব্যবহার করতে চাই না তার উপর ভিত্তি করে এই সিদ্ধান্তটি নিই। সাধারণ গণনা উদ্দেশ্যে কেবল বড় জিনিসগুলি সাধারণভাবে হয় তা দেখতে, হয় পর্যাপ্ত পরিমাণে সঠিক হওয়া উচিত।


2
সম্পূর্ণতার জন্য, দয়া করে প্রথম বিকল্পটির জন্য এটি যুক্ত করুন (ধন্যবাদ @ a_horse_with_no_name- এ যায়):with tbl as (SELECT table_schema,table_name FROM information_schema.tables where table_name not like 'pg_%' and table_schema in ('public')) select table_schema, table_name, (xpath('/row/c/text()', query_to_xml(format('select count(*) as c from %I.%I', table_schema, table_name), false, true, '')))[1]::text::int as rows_n from tbl ORDER BY 3 DESC;
ইস্তানী

1
@ গ্রেগ স্মিথ কোন সংস্করণ চালু করেছে n_live_tup? আমার রেডশিফ্ট ডাটাবেসে সেই কলামটি নেই। এটি পোস্টগ্রিস 8.0.2 এর একটি ডেরাইভেটিভ।
আইয়েন স্যামুয়েল ম্যাকলিন বয়স্ক

1
'দ্বিতীয় পদ্ধতির' ক্যোয়ারী (ব্যবহার করে pg_stat_user_tables) n_live_tupআমার জন্য বেশিরভাগ জিরো ফিরিয়ে দেয় কারণ ANALYZEকখনই চালানো হয়নি। ANALYZEপ্রতিটি স্কিমা / টেবিলের উপর দৌড়াতে এবং উত্তরের জন্য চিরকাল অপেক্ষা করার পরিবর্তে , আমি প্রথম 'তৃতীয় পদ্ধতির' ব্যবহার করে ফলাফলগুলি পরীক্ষা করেছিলাম এবং এটি (ব্যবহার করে pg_class) খুব নির্ভুল গণনা ফিরিয়ে দেয়।
ব্রায়ান ডি

@ ব্রায়ানডি, ডাটাবেস স্তরে বিশ্লেষণকে ইউটিলিটি "এনালাইজড
ডি-

69

এখানে একটি সমাধান যা প্রতিটি টেবিলের জন্য সঠিক গণনা পেতে ফাংশনগুলির প্রয়োজন হয় না:

select table_schema, 
       table_name, 
       (xpath('/row/cnt/text()', xml_count))[1]::text::int as row_count
from (
  select table_name, table_schema, 
         query_to_xml(format('select count(*) as cnt from %I.%I', table_schema, table_name), false, true, '') as xml_count
  from information_schema.tables
  where table_schema = 'public' --<< change here for the schema you want
) t

query_to_xmlউত্তীর্ণ এসকিউএল কোয়েরি চালাবে এবং ফলাফলের সাথে একটি এক্সএমএল ফিরিয়ে দেবে (সেই টেবিলের জন্য সারি গণনা)। বহি: স্থxpath() তারপরে সেই এক্সএমএল থেকে গণনা সম্পর্কিত তথ্যটি বের করবে এবং এটিকে কোনও সংখ্যায় রূপান্তর করবে

উত্সযুক্ত টেবিলটি সত্যই প্রয়োজনীয় নয়, তবে এটি xpath()বোঝার জন্য আরও সহজ করে তোলে - অন্যথায় query_to_xml()পুরোটি xpath()ফাংশনে পাস করা দরকার ।


3
খুব চালাক. দুঃখের বিষয় এখানে নেই query_to_jsonb()
ক্লিন

@ a_horse_with_no_name, এটি কার্যকর করার সময় ব্যস্ত এবং বিশাল টেবিলগুলিতে কোনও পারফরম্যান্স ইস্যু দেবে?
স্পাইক

@ স্পাইক: পারফরম্যান্স ইস্যু কিসের তুলনায়? প্রধান কর্মক্ষমতা বাধা select count(*)প্রতিটি টেবিলে চলছে ।
a_horse_with_no_name

১০০ মিলিয়ন রেকর্ডের বিপরীতে এক্স_পথ ফাংশন সম্পাদন করে @ এ_হর্স_বিহীন_ন_নাম
স্পাইপ

@ স্পাইক: xpath()ফাংশনটি কেবল একটি একক সারিতে প্রয়োগ করা হয়count(*)
ঘোড়া_বিহীন_নাম_নাম

24

অনুমান পেতে, গ্রেগ স্মিথের উত্তর দেখুন

নির্ভুল গণনা পেতে, এ পর্যন্ত অন্যান্য উত্তরগুলি কিছু সমস্যা নিয়ে জর্জরিত রয়েছে, তাদের কয়েকটি গুরুতর (নীচে দেখুন)। এখানে এমন একটি সংস্করণ রয়েছে যা আশাকরি আরও ভাল:

CREATE FUNCTION rowcount_all(schema_name text default 'public')
  RETURNS table(table_name text, cnt bigint) as
$$
declare
 table_name text;
begin
  for table_name in SELECT c.relname FROM pg_class c
    JOIN pg_namespace s ON (c.relnamespace=s.oid)
    WHERE c.relkind = 'r' AND s.nspname=schema_name
  LOOP
    RETURN QUERY EXECUTE format('select cast(%L as text),count(*) from %I.%I',
       table_name, schema_name, table_name);
  END LOOP;
end
$$ language plpgsql;

এটি প্যারামিটার হিসাবে একটি স্কিমা নাম নেয়, বা publicযদি কোনও প্যারামিটার দেওয়া হয় না।

ফাংশনটি সংশোধন না করে স্কিমার একটি নির্দিষ্ট তালিকা বা কোনও কোয়েরি থেকে আসা একটি তালিকা নিয়ে কাজ করার জন্য, এটি একটি কোয়েরির মধ্যে থেকে এইভাবে কল করা যেতে পারে:

WITH rc(schema_name,tbl) AS (
  select s.n,rowcount_all(s.n) from (values ('schema1'),('schema2')) as s(n)
)
SELECT schema_name,(tbl).* FROM rc;

এটি স্কিমা, টেবিল এবং সারি গণনা সহ 3-কলামের আউটপুট তৈরি করে।

এখন অন্য উত্তরের কয়েকটি বিষয় যা এই ফাংশনটি এড়িয়ে চলে:

  • সারণী এবং স্কিমা নামগুলি নিখরচায় না করে এক্সিকিউটেবল এসকিউএলে প্রবেশ করা উচিত নয়, এটির সাথে quote_identবা আরও আধুনিক format()ফাংশনের সাথে এটির %Iফর্ম্যাট স্ট্রিং রয়েছে। অন্যথায় কিছু দূষিত ব্যক্তি তাদের টেবিলটির নাম রাখতে পারে tablename;DROP TABLE other_tableযা একটি টেবিলের নাম হিসাবে পুরোপুরি বৈধ।

  • এমনকি এসকিউএল ইঞ্জেকশন এবং মজার অক্ষরগুলির সমস্যা ছাড়াই, টেবিলের নাম ক্ষেত্রে ভিন্ন ভিন্ন রূপগুলিতে উপস্থিত থাকতে পারে। যদি কোনও সারণির নাম দেওয়া হয় ABCDএবং অন্য একটি abcd, SELECT count(*) FROM...অবশ্যই একটি উদ্ধৃত নাম ব্যবহার করা উচিত অন্যথায় এটি এড়িয়ে যায় ABCDএবং abcdদুবার গণনা করবে । %Iবিন্যাসের এই স্বয়ংক্রিয়ভাবে আছে।

  • information_schema.tablesটেবিলের পাশাপাশি কাস্টম সংমিশ্রিত প্রকারের তালিকাবদ্ধ করে, এমনকি যখন टेबल_ টাইপ 'BASE TABLE'(!) হয়। ফলস্বরূপ, আমরা পুনরাবৃত্তি করতে পারি না information_schema.tables, অন্যথায় আমাদের ঝুঁকি রয়েছে select count(*) from name_of_composite_typeএবং এটি ব্যর্থ হবে। OTOH pg_class where relkind='r'সর্বদা সূক্ষ্মভাবে কাজ করা উচিত।

  • COUNT () এর ধরণটি bigintনয় int। ২.১৫ বিলিয়ন সারি বেশি সারি সহ টেবিলগুলি উপস্থিত থাকতে পারে (তাদের উপর একটি গণনা (*) চালানো একটি খারাপ ধারণা, যদিও)।

  • বেশ কয়েকটি কলাম সহ রেজাল্ট সেট করতে কোনও ফাংশনের জন্য একটি স্থায়ী প্রকার তৈরি করার দরকার নেই। RETURNS TABLE(definition...)একটি ভাল বিকল্প।


18

আপনি যদি সম্ভাব্যভাবে বাসি ডেটা আপত্তি না করেন তবে আপনি ক্যোয়ারী অপ্টিমাইজারের দ্বারা ব্যবহৃত একই পরিসংখ্যান অ্যাক্সেস করতে পারেন

কিছুটা এইরকম:

SELECT relname, n_tup_ins - n_tup_del as rowcount FROM pg_stat_all_tables;

@ এমসিসনার: যদি আপনার অটোভ্যাকুয়াম ব্যবধানটি খুব দীর্ঘ হয় বা আপনি ANALYZEটেবিলে কোনও ম্যানুয়াল চালনা করেন না , তবে পরিসংখ্যানগুলি বন্ধ হয়ে যেতে পারে। এটি ডাটাবেস লোড এবং কীভাবে ডেটাবেস কনফিগার করা হয় সে বিষয়ে একটি প্রশ্ন (যদি পরিসংখ্যানগুলি আরও ঘন ঘন আপডেট করা হয় তবে পরিসংখ্যানগুলি আরও সঠিক হবে, তবে এটি রানটাইম কার্যকারিতা হ্রাস করতে পারে)। শেষ পর্যন্ত, সঠিক ডেটা পাওয়ার একমাত্র উপায় হ'ল select count(*) from tableসমস্ত টেবিলের জন্য চালানো ।
ig0774

17

হিরোকু তাদের যে পরিকল্পনাটি প্রয়োজন তা মূল্যায়নের চেষ্টা করার জন্য হ্যাকি, ব্যবহারিক উত্তর এবং হিরকুর ধীর সারির কাউন্টারটি রিফ্রেশ করার জন্য অপেক্ষা করতে পারে না:

মূলত আপনি চালাতে চান \dtমধ্যে psql, (এটা এমন দেখাবে আপনার প্রিয় টেক্সট এডিটর ফলাফল কপি করুন:

 public | auth_group                     | table | axrsosvelhutvw
 public | auth_group_permissions         | table | axrsosvelhutvw
 public | auth_permission                | table | axrsosvelhutvw
 public | auth_user                      | table | axrsosvelhutvw
 public | auth_user_groups               | table | axrsosvelhutvw
 public | auth_user_user_permissions     | table | axrsosvelhutvw
 public | background_task                | table | axrsosvelhutvw
 public | django_admin_log               | table | axrsosvelhutvw
 public | django_content_type            | table | axrsosvelhutvw
 public | django_migrations              | table | axrsosvelhutvw
 public | django_session                 | table | axrsosvelhutvw
 public | exercises_assignment           | table | axrsosvelhutvw

), তারপরে একটি রেজেক্স অনুসন্ধান চালান এবং এর মতো প্রতিস্থাপন করুন:

^[^|]*\|\s+([^|]*?)\s+\| table \|.*$

প্রতি:

select '\1', count(*) from \1 union/g

যা আপনাকে এর সাথে সাদৃশ্যপূর্ণ কিছু দেবে:

select 'auth_group', count(*) from auth_group union
select 'auth_group_permissions', count(*) from auth_group_permissions union
select 'auth_permission', count(*) from auth_permission union
select 'auth_user', count(*) from auth_user union
select 'auth_user_groups', count(*) from auth_user_groups union
select 'auth_user_user_permissions', count(*) from auth_user_user_permissions union
select 'background_task', count(*) from background_task union
select 'django_admin_log', count(*) from django_admin_log union
select 'django_content_type', count(*) from django_content_type union
select 'django_migrations', count(*) from django_migrations union
select 'django_session', count(*) from django_session
;

(আপনাকে শেষটি সরিয়ে ফেলতে হবে unionএবং ম্যানুয়ালি শেষে সেমিকোলন যুক্ত করতে হবে)

এটি চালান psqlএবং আপনি সম্পন্ন হয়েছে।

            ?column?            | count
--------------------------------+-------
 auth_group_permissions         |     0
 auth_user_user_permissions     |     0
 django_session                 |  1306
 django_content_type            |    17
 auth_user_groups               |   162
 django_admin_log               |  9106
 django_migrations              |    19
[..]

আমি এই ধারণাটি পছন্দ করি
GuilPejon

: এটম, আমি অনুসন্ধান Regex এবং মত এই প্রতিস্থাপন করতে ছিল select '$1', count(*) from $1 union/g
চাক

এছাড়াও, পোস্টটি বলেছে: "আপনাকে ইউনিয়নটি সরিয়ে ফেলতে হবে এবং শেষে সেমিকোলন যুক্ত করতে হবে।" এটি একটি টাইপো। আপনাকে একেবারে শেষের দিকে /g(রাখা union) এবং একটি সেমিকোলন যুক্ত করতে হবে ;unionসেমিকোলনের আগে শেষটি সরাতে ভুলবেন না ।
চাক

1
" unionসেমিকোলনের আগে শেষটি সরিয়ে দিতে ভুলবেন না " এটাই আমি বোঝাতে চেয়েছিলাম :) স্পষ্ট করতে "শেষ" শব্দটি যুক্ত হয়েছে
অর সরফ

10

ব্যাশের কোনও উত্তর আপনার কাছে গ্রহণযোগ্য কিনা তা নিশ্চিত নই , তবে এফডাব্লুআইডাব্লু ...

PGCOMMAND=" psql -h localhost -U fred -d mydb -At -c \"
            SELECT   table_name
            FROM     information_schema.tables
            WHERE    table_type='BASE TABLE'
            AND      table_schema='public'
            \""
TABLENAMES=$(export PGPASSWORD=test; eval "$PGCOMMAND")

for TABLENAME in $TABLENAMES; do
    PGCOMMAND=" psql -h localhost -U fred -d mydb -At -c \"
                SELECT   '$TABLENAME',
                         count(*) 
                FROM     $TABLENAME
                \""
    eval "$PGCOMMAND"
done

7
এর সংক্ষেপে, এটি কেবল ওপিতে একইভাবে select count(*) from table_name;ফোটে!
নোয়াচ ম্যাগেডম্যান

8

আমি সাধারণত পরিসংখ্যানগুলিতে নির্ভর করি না, বিশেষত পোস্টগ্র্যাস এসকিউএলে।

SELECT table_name, dsql2('select count(*) from '||table_name) as rownum
FROM information_schema.tables
WHERE table_type='BASE TABLE'
    AND table_schema='livescreen'
ORDER BY 2 DESC;
CREATE OR REPLACE FUNCTION dsql2(i_text text)
  RETURNS int AS
$BODY$
Declare
  v_val int;
BEGIN
  execute i_text into v_val;
  return v_val;
END; 
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

এটি দুর্দান্ত তবে প্রথম ক্যোয়ারিতেও রোউনাম মানের জন্য স্কিমা অন্তর্ভুক্ত করা উচিত। বিভিন্ন স্কিমে বিরোধী নাম থাকলে এটি প্রত্যাশার মতো কাজ করবে না। সুতরাং ক্যোয়ারির এই অংশটি আরও বেশি দেখতে dsql2('select count(*) from livescreen.'||table_name)বা আরও ভাল দেখা উচিত যা এটি নিজস্ব ক্রিয়ায় রূপান্তরিত হতে পারে।
জাকুব-ওলজিক

6

আমি যে URL থেকে এটি সংগ্রহ করেছি তা আমার মনে নেই। তবে আশা করি এটি আপনাকে সহায়তা করবে:

CREATE TYPE table_count AS (table_name TEXT, num_rows INTEGER); 

CREATE OR REPLACE FUNCTION count_em_all () RETURNS SETOF table_count  AS '
DECLARE 
    the_count RECORD; 
    t_name RECORD; 
    r table_count%ROWTYPE; 

BEGIN
    FOR t_name IN 
        SELECT 
            c.relname
        FROM
            pg_catalog.pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
        WHERE 
            c.relkind = ''r''
            AND n.nspname = ''public'' 
        ORDER BY 1 
        LOOP
            FOR the_count IN EXECUTE ''SELECT COUNT(*) AS "count" FROM '' || t_name.relname 
            LOOP 
            END LOOP; 

            r.table_name := t_name.relname; 
            r.num_rows := the_count.count; 
            RETURN NEXT r; 
        END LOOP; 
        RETURN; 
END;
' LANGUAGE plpgsql; 

কার্যকর করার select count_em_all();ফলে আপনার সমস্ত টেবিলের সীমা গণনা করা উচিত।


1
quote_ident(t_name.relname)অস্বাভাবিক নামের (যেমন "কলাম-নাম") এর যথাযথ সমর্থন নিশ্চিত করার জন্য কলামের নামগুলি (যেমন ) উদ্ধৃত করা ভাল ধারণা ।
গারস্কি

এরপরে এটি ফেলে দেওয়ার জন্য: ড্রপ ফাংশন কাউন্ট_ইম_ল_ (সমস্ত);
আলেেক্স গবি

একটি ত্রুটি পেয়েছে: কাউন্ট_ইম_সেল (সমস্ত) নির্বাচন করুন; ত্রুটি: "গোষ্ঠী" লাইন 1 এর কাছাকাছি বা তার কাছাকাছি সিনট্যাক্স ত্রুটি 1 লাইন 1: নির্বাচন করুন COUNT () হিসাবে "গণনা" FROM গ্রুপ থেকে ^ QUERY: নির্বাচন করুন COUNT () এএস "গণনা" থেকে গ্রুপ থেকে চুক্তি: PL / pgSQL ফাংশন count_em_all () লাইন 18 এর জন্য
এক্সিকিউট

গ্রেট! বাছাই এবং বাছাই করতে - SELECT * FROM count_em_all() as r ORDER BY r.num_rows DESC;
Ken4scholars 2'19

6

সাধারণ দুটি পদক্ষেপ:
(দ্রষ্টব্য: কিছুই পরিবর্তন করার দরকার নেই - কেবল কপি পেস্ট করুন)
1. তৈরি করুন ফাংশন

create function 
cnt_rows(schema text, tablename text) returns integer
as
$body$
declare
  result integer;
  query varchar;
begin
  query := 'SELECT count(1) FROM ' || schema || '.' || tablename;
  execute query into result;
  return result;
end;
$body$
language plpgsql;

2. সমস্ত টেবিলের জন্য সারি গণনা পেতে এই কোয়েরিটি চালান

select sum(cnt_rows) as total_no_of_rows from (select 
  cnt_rows(table_schema, table_name)
from information_schema.tables
where 
  table_schema not in ('pg_catalog', 'information_schema') 
  and table_type='BASE TABLE') as subq;

বা

সারিগুলি পেতে টেবিলে গণনা করা হয়

select
  table_schema,
  table_name, 
  cnt_rows(table_schema, table_name)
from information_schema.tables
where 
  table_schema not in ('pg_catalog', 'information_schema') 
  and table_type='BASE TABLE'
order by 3 desc;

5

সমস্ত টেবিল অন্তর্ভুক্ত করার জন্য আমি অ-সর্বজনীন টেবিলগুলির জন্যও একটি ছোট পার্থক্য করেছি।

CREATE TYPE table_count AS (table_schema TEXT,table_name TEXT, num_rows INTEGER); 

CREATE OR REPLACE FUNCTION count_em_all () RETURNS SETOF table_count  AS '
DECLARE 
    the_count RECORD; 
    t_name RECORD; 
    r table_count%ROWTYPE; 

BEGIN
    FOR t_name IN 
        SELECT table_schema,table_name
        FROM information_schema.tables
        where table_schema !=''pg_catalog''
          and table_schema !=''information_schema''
        ORDER BY 1,2
        LOOP
            FOR the_count IN EXECUTE ''SELECT COUNT(*) AS "count" FROM '' || t_name.table_schema||''.''||t_name.table_name
            LOOP 
            END LOOP; 

            r.table_schema := t_name.table_schema;
            r.table_name := t_name.table_name; 
            r.num_rows := the_count.count; 
            RETURN NEXT r; 
        END LOOP; 
        RETURN; 
END;
' LANGUAGE plpgsql; 

select count_em_all();এটি কল করতে ব্যবহার করুন ।

আশা করি আপনি এই কাজে লাগিয়েছেন। পল


ত্রুটি: "r.table_schema" একটি পরিচিত পরিবর্তনশীল নয়
স্ল্যাশডটটিয়ার

2

এটি আমার পক্ষে কাজ করেছে

স্কিমের নাম নির্বাচন করুন, পুনর্নামকরণ করুন, n_live_tup FROM pg_stat_user_tables থেকে N_live_tup DESC;


1

আমি ড্যানিয়েল ভেরিটির উত্তর পছন্দ করি । তবে আপনি যখন ক্রেটি স্টেটমেন্ট ব্যবহার করতে পারবেন না আপনি বাশ সমাধান ব্যবহার করতে পারেন বা আপনি যদি উইন্ডোজ ব্যবহারকারী হন তবে একটি পাওয়ারশেল:

# You don't need this if you have pgpass.conf
$env:PGPASSWORD = "userpass"

# Get table list
$tables = & 'C:\Program Files\PostgreSQL\9.4\bin\psql.exe' -U user -w -d dbname -At -c "select table_name from information_schema.tables where table_type='BASE TABLE' AND table_schema='schema1'"

foreach ($table in $tables) {
    & 'C:\path_to_postresql\bin\psql.exe' -U root -w -d dbname -At -c "select '$table', count(*) from $table"
}

0

আমি সমস্ত টেবিল থেকে মোট চেয়েছিলাম + তাদের গণনা সহ টেবিলের একটি তালিকা। বেশিরভাগ সময় কোথায় ব্যয় হয়েছিল তার পারফরম্যান্স চার্টের মতো little

WITH results AS ( 
  SELECT nspname AS schemaname,relname,reltuples
    FROM pg_class C
    LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
    WHERE 
      nspname NOT IN ('pg_catalog', 'information_schema') AND
      relkind='r'
     GROUP BY schemaname, relname, reltuples
)

SELECT * FROM results
UNION
SELECT 'all' AS schemaname, 'all' AS relname, SUM(reltuples) AS "reltuples" FROM results

ORDER BY reltuples DESC

আপনি অবশ্যই LIMITএই সংস্করণে ফলাফলগুলির উপর একটি ধারা রাখতে পারেন যাতে আপনি nসর্বমোট বৃহত অপরাধী হন।

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

এটি https://stackoverflow.com/a/2611745/1548557 কাজ থেকে ভিত্তি করে তৈরি করা হয়েছে , সুতরাং সিটিইয়ের মধ্যে থাকা ক্যোয়ারির জন্য আপনাকে ধন্যবাদ এবং স্বীকৃতি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.