Sonntag, März 06, 2016

postgres: Analyse von page-Inhalten mit pageinspect

Mit einer gewissen Regelmäßigkeit beklage ich mich darüber, dass postgres bei der Instrumentierung nicht ganz das Niveau der großen kommerziellen Konkurrenz erreicht. Einerseits ist das wohl nicht falsch, andererseits ist mir aber auch klar, dass mir da zum Teil auch einfach Informationen fehlen. In dieser Woche wurde ich beispielsweise auf die Extension pageinspect hingewiesen, mir deren Hilfe man in postgres die Inhalte der pages von Tabellen und Indizes untersuchen kann - also das Äquivalent zur Oracles Block-Dumps:

(localhost:5433)postgres@postgres=# create extension pageinspect;
CREATE EXTENSION

Objekte in Erweiterung „pageinspect“
            Objektbeschreibung
------------------------------------------
 Funktion brin_metapage_info(bytea)
 Funktion brin_page_items(bytea,regclass)
 Funktion brin_page_type(bytea)
 Funktion brin_revmap_data(bytea)
 Funktion bt_metap(text)
 Funktion bt_page_items(text,integer)
 Funktion bt_page_stats(text,integer)
 Funktion fsm_page_contents(bytea)
 Funktion get_raw_page(text,integer)
 Funktion get_raw_page(text,text,integer)
 Funktion gin_leafpage_items(bytea)
 Funktion gin_metapage_info(bytea)
 Funktion gin_page_opaque_info(bytea)
 Funktion heap_page_items(bytea)
 Funktion page_header(bytea)
(15 Zeilen)

(localhost:5433)postgres@postgres=# create table t
postgres-# as
postgres-# select generate_series(1, 10) id;
SELECT 10

(localhost:5433)postgres@postgres=# SELECT * from heap_page_items(get_raw_page('t', 0));
 lp | lp_off | lp_flags | lp_len | t_xmin | t_xmax | t_field3 | t_ctid | t_infomask2 | t_infomask | t_hoff | t_bits | t_oid
----+--------+----------+--------+--------+--------+----------+--------+-------------+------------+--------+--------+-------
  1 |   8160 |        1 |     28 |   1748 |      0 |        1 | (0,1)  |           1 |       2048 |     24 |        |
  2 |   8128 |        1 |     28 |   1748 |      0 |        1 | (0,2)  |           1 |       2048 |     24 |        |
  3 |   8096 |        1 |     28 |   1748 |      0 |        1 | (0,3)  |           1 |       2048 |     24 |        |
  4 |   8064 |        1 |     28 |   1748 |      0 |        1 | (0,4)  |           1 |       2048 |     24 |        |
  5 |   8032 |        1 |     28 |   1748 |      0 |        1 | (0,5)  |           1 |       2048 |     24 |        |
  6 |   8000 |        1 |     28 |   1748 |      0 |        1 | (0,6)  |           1 |       2048 |     24 |        |
  7 |   7968 |        1 |     28 |   1748 |      0 |        1 | (0,7)  |           1 |       2048 |     24 |        |
  8 |   7936 |        1 |     28 |   1748 |      0 |        1 | (0,8)  |           1 |       2048 |     24 |        |
  9 |   7904 |        1 |     28 |   1748 |      0 |        1 | (0,9)  |           1 |       2048 |     24 |        |
 10 |   7872 |        1 |     28 |   1748 |      0 |        1 | (0,10) |           1 |       2048 |     24 |        |
(10 Zeilen)

So weit war ich mit der Beispielerzeugung, ehe mir der Gedanke kam, mal nachzusehen, ob es dazu nicht schon entsprechendes Material gibt - und natürlich ist das der Fall: Michael Paquier hat in seinem Blog gelegentlich gezeigt, wie sich die Inhalte der pages einer heap Tabelle verändern, wenn man darauf DML-Operationen durchführt und vaccum stattfindet. Da auch die Dokumentation schon Beispiele enthält, spare ich mir die Erzeugung weiterer Standardfälle und belasse es bei den Links, die eine gute Grundlage für eine intensivere Beschäftigung darstellen würden.

Nachtrag 27.12.2016: ein paar interessante Informationen zur Semantik der Spalten in den Analyse-Tabellen findet man hier.

Keine Kommentare:

Kommentar veröffentlichen