Q2: way to measure page size
PostgreSQL डेटाबेस ऑब्जेक्ट आकार कार्यों के एक नंबर प्रदान करता है । मैंने इस क्वेरी में सबसे दिलचस्प वाले पैक किए और नीचे कुछ सांख्यिकी एक्सेस फ़ंक्शंस जोड़े । (अतिरिक्त मॉड्यूल pgstattuple अभी तक अधिक उपयोगी कार्य प्रदान करता है।)
यह दिखाने के लिए है कि "पंक्ति के आकार" को मापने के लिए अलग-अलग तरीके बहुत अलग परिणाम देते हैं। यह सब उस पर निर्भर करता है जो आप मापना चाहते हैं, बिल्कुल।
इस क्वेरी को Postgres 9.3 या बाद के संस्करण की आवश्यकता है । पुराने संस्करणों के लिए नीचे देखें।
हर पंक्ति के लिए गणना से बचने के लिए, VALUES
एक LATERAL
उपशम में एक अभिव्यक्ति का उपयोग करना ।
public.tbl
अपनी पंक्तियों के आकार के बारे में एकत्रित आँकड़ों का एक कॉम्पैक्ट दृश्य प्राप्त करने के लिए अपने वैकल्पिक स्कीमा-योग्य तालिका नाम के साथ (दो बार) बदलें । आप इसे बार-बार उपयोग करने के लिए एक 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);
नतीजा:
मीट्रिक | बाइट्स / ct | bytes_pretty | bytes_per_row
----------------------------------- + ---------- + --- ----------- + ---------------
core_relation_size | 44138496 | 42 एमबी | 91
दृश्यता_मैप | 0 | 0 बाइट्स | 0
free_space_map | 32768 | 32 केबी | 0
table_size_incl_toast | 44179456 | 42 एमबी | 91
indexes_size | 33128448 | 32 एमबी | 68
Total_size_incl_toast_and_indexes | 77307904 | 74 एमबी | 159
live_rows_in_text_repretation | 29987360 | 29 एमबी | 62
------------------------------ | | |
row_count | 483424 | |
live_tuples | 483424 | |
dead_tuples | 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;
एक ही परिणाम।
Q1: 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)
? मुझे पता है कि यह बाइट्स नहीं है, लेकिन मुझे केवल एक अनुमानित मूल्य की आवश्यकता है।