Q2 এর: way to measure page size
PostgreSQL অনেকগুলি ডাটাবেস অবজেক্ট সাইজ ফাংশন সরবরাহ করে । আমি এই ক্যোয়ারিতে সবচেয়ে আকর্ষণীয় বিষয়বস্তু নিয়েছি এবং নীচে কিছু পরিসংখ্যান অ্যাক্সেস ফাংশন যুক্ত করেছি । (অতিরিক্ত মডিউল pgstattuple আরও কার্যকর ফাংশন সরবরাহ করে, তবুও))
এটি দেখিয়ে যাচ্ছে যে "একটি সারির আকার" পরিমাপের বিভিন্ন পদ্ধতি খুব ভিন্ন ফলাফলের দিকে নিয়ে যায়। এটি সমস্ত কি আপনি সঠিকভাবে পরিমাপ করতে চান তার উপর নির্ভর করে।
এই প্রশ্নের সাথে প্রয়োজন Postgres 9.3 বা পরবর্তী । পুরানো সংস্করণগুলির জন্য নীচে দেখুন।
প্রতিটি সারির জন্য বানান গণনা এড়ানোর জন্য, VALUES
একটি LATERAL
subquery একটি এক্সপ্রেশন ব্যবহার ।
public.tbl
আপনার সারিগুলির আকার সম্পর্কে সংগৃহীত পরিসংখ্যানগুলির একটি কমপ্যাক্ট ভিউ পেতে আপনার allyচ্ছিকভাবে স্কিমা-যোগ্য টেবিল নাম দিয়ে (দু'বার) প্রতিস্থাপন করুন । আপনি এটি বারবার ব্যবহারের জন্য একটি plpgsql ফাংশনে আবদ্ধ করতে পারেন, টেবিলের নামটিকে প্যারামিটার হিসাবে ব্যবহার করুন এবং ব্যবহার করুন EXECUTE
...
SELECT l.metric, l.nr AS "bytes/ct"
, CASE WHEN is_size THEN pg_size_pretty(nr) END AS bytes_pretty
, CASE WHEN is_size THEN nr / NULLIF(x.ct, 0) END AS bytes_per_row
FROM (
SELECT min(tableoid) AS tbl -- = 'public.tbl'::regclass::oid
, count(*) AS ct
, sum(length(t::text)) AS txt_len -- length in characters
FROM public.tbl t -- provide table name *once*
) x
, LATERAL (
VALUES
(true , 'core_relation_size' , pg_relation_size(tbl))
, (true , 'visibility_map' , pg_relation_size(tbl, 'vm'))
, (true , 'free_space_map' , pg_relation_size(tbl, 'fsm'))
, (true , 'table_size_incl_toast' , pg_table_size(tbl))
, (true , 'indexes_size' , pg_indexes_size(tbl))
, (true , 'total_size_incl_toast_and_indexes', pg_total_relation_size(tbl))
, (true , 'live_rows_in_text_representation' , txt_len)
, (false, '------------------------------' , NULL)
, (false, 'row_count' , ct)
, (false, 'live_tuples' , pg_stat_get_live_tuples(tbl))
, (false, 'dead_tuples' , pg_stat_get_dead_tuples(tbl))
) l(is_size, metric, nr);
ফলাফল:
মেট্রিক | বাইটস / সিটি | bytes_ ব্যাখ্যা | bytes_per_row
----------------------------------- + + ---------- + + --- ----------- + + ---------------
কোর_ রিলেশন_সাইজ | 44138496 | 42 এমবি | 91
দৃশ্যমানতা_ম্যাপ | 0 | 0 বাইট | 0
ফ্রি_স্পেস_ম্যাপ | 32768 | 32 কেবি | 0
টেবিল_সাইজ_ইঙ্কেল_ টোস্ট | 44179456 | 42 এমবি | 91
সূচি_সাইজ | 33128448 | 32 এমবি | 68
টোটাল_সাইজ_ইনসিএল_ টোস্ট_অ্যান্ড_ইন্ডেক্সসমূহ | 77307904 | 74 এমবি | 159
live_rows_in_text_ বিবরণী | 29987360 | 29 এমবি | 62
------------------------------ | | |
সারি_কাউন্ট | 483424 | |
live_tuples | 483424 | |
মৃত_টুপলস | 2677 | |
পুরানো সংস্করণগুলির জন্য (9.2 বা তার বেশি বয়সে পোস্টগ্রিজ):
WITH x AS (
SELECT count(*) AS ct
, sum(length(t::text)) AS txt_len -- length in characters
, 'public.tbl'::regclass AS tbl -- provide table name as string
FROM public.tbl t -- provide table name as name
), y AS (
SELECT ARRAY [pg_relation_size(tbl)
, pg_relation_size(tbl, 'vm')
, pg_relation_size(tbl, 'fsm')
, pg_table_size(tbl)
, pg_indexes_size(tbl)
, pg_total_relation_size(tbl)
, txt_len
] AS val
, ARRAY ['core_relation_size'
, 'visibility_map'
, 'free_space_map'
, 'table_size_incl_toast'
, 'indexes_size'
, 'total_size_incl_toast_and_indexes'
, 'live_rows_in_text_representation'
] AS name
FROM x
)
SELECT unnest(name) AS metric
, unnest(val) AS "bytes/ct"
, pg_size_pretty(unnest(val)) AS bytes_pretty
, unnest(val) / NULLIF(ct, 0) AS bytes_per_row
FROM x, y
UNION ALL SELECT '------------------------------', NULL, NULL, NULL
UNION ALL SELECT 'row_count', ct, NULL, NULL FROM x
UNION ALL SELECT 'live_tuples', pg_stat_get_live_tuples(tbl), NULL, NULL FROM x
UNION ALL SELECT 'dead_tuples', pg_stat_get_dead_tuples(tbl), NULL, NULL FROM x;
একই ফলাফল।
চতুর্থাংশ 1: anything inefficient?
সারি প্রতি কিছু বাইট সংরক্ষণের জন্য আপনি কলাম ক্রমটি অনুকূল করতে পারেন, বর্তমানে অ্যালাইনমেন্ট প্যাডিংয়ে নষ্ট:
integer | not null default nextval('core_page_id_seq'::regclass)
integer | not null default 0
character varying(255) | not null
character varying(64) | not null
text | default '{}'::text
character varying(255) |
text | default '{}'::text
text |
timestamp with time zone |
timestamp with time zone |
integer |
integer |
এটি প্রতি সারিতে 8 এবং 18 বাইটের মধ্যে সঞ্চয় করে। আমি এটিকে "কলাম টেট্রিস" বলি । বিবরণ:
এছাড়াও বিবেচনা করুন:
length(*)
বরং উপায় আছেlength(field)
? আমি জানি এটি অক্ষর বাইট নয় তবে আমার কেবল একটি প্রায় মান প্রয়োজন।