S2: way to measure page size
PostgreSQL, bir dizi Veritabanı Nesnesi Boyutu Fonksiyonu sunar . Bu sorgudaki en ilginç olanları topladım ve en altına bazı İstatistik Erişim İşlevleri ekledim . (Ek modül pgstattuple , henüz daha kullanışlı fonksiyonlar sağlar.)
Bu, "satırın boyutunu" ölçmek için kullanılan farklı yöntemlerin çok farklı sonuçlara yol açtığını gösterecektir. Her şey tam olarak ne ölçmek istediğinize bağlıdır.
Bu sorgu Postgres 9.3 veya daha yenisini gerektirir . Eski versiyonlar için aşağıya bakınız.
Her satır için hesaplamaları heceleyerek önlemek VALUES
için LATERAL
alt sorguda bir ifade kullanma .
public.tbl
Satırlarınızın büyüklüğü hakkında toplanan istatistiklerin kompakt bir görünümünü elde etmek için isteğe bağlı olarak şemaya uygun tablo adınızla değiştirin (iki kez). Bunu tekrar tekrar kullanmak için bir plpgsql işlevine sarabilir, tablo adını parametre olarak girebilir ve 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);
Sonuç:
metrik | bayt / ct | bytes_pretty | bytes_per_row
----------------------------------- + ---------- + --- ----------- + ---------------
core_relation_size | 44138496 | 42 MB | 91
visibility_map | 0 | 0 bayt | 0
free_space_map | 32768 | 32 kB | 0
table_size_incl_toast | 44179456 | 42 MB | 91
indexes_size | 33128448 | 32 MB | 68
total_size_incl_toast_and_indexes | 77307904 | 74 MB | 159
live_rows_in_text_representation | 29987360 | 29 MB | 62
------------------------------ | | |
row_count | 483424 | |
live_tuples | 483424 | |
dead_tuples | 2677 | |
Daha eski sürümler için (Postgres 9.2 veya üstü):
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;
Aynı sonuç.
S1: anything inefficient?
Hizalama dolgusunda boşa harcanan satır başına bazı baytları kaydetmek için sütun sırasını optimize edebilirsiniz :
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 |
Bu satır başına 8 ila 18 bayt kaydeder. Ben buna "sütun tetris" diyorum . Detaylar:
Ayrıca şunu göz önünde bulundurun:
length(*)
ziyade sadece dahalength(field)
? Bunun karakterlerin bayt olmadığını biliyorum ama sadece yaklaşık bir değere ihtiyacım var.