Re: [GENERAL] When updating row that has TOAST column, is the TOASTcolumn also reinserted ? Or just the oid to the value? - Mailing list pgsql-general

From Achilleas Mantzios
Subject Re: [GENERAL] When updating row that has TOAST column, is the TOASTcolumn also reinserted ? Or just the oid to the value?
Date
Msg-id 58500674.8050409@matrix.gatewaynet.com
Whole thread Raw
In response to Re: [GENERAL] When updating row that has TOAST column, is the TOASTcolumn also reinserted ? Or just the oid to the value?  (Albe Laurenz <laurenz.albe@wien.gv.at>)
List pgsql-general
Great info Albe!

On 13/12/2016 16:20, Albe Laurenz wrote:
> Dorian Hoxha wrote:
>> When updating row that has TOAST column, is the TOAST column also inserted ? Or just the oid?
>>
>> Say I have a 1MB value in the TOAST column, and I update the row by changing another column, and since
>> every update is an insert, will it also reinsert the toast-column ? The column that I will update will
>> have an index so I think hot-update won't work in this case ? The same question also when full-page-
>> writes is enabled ?
>>
>>
>> Using 9.6.
> The TOAST table will remain unchanged by the UPDATE; you can see that with the
> "pageinspect" contrib module:
>
> CREATE TABLE longtext (
>     id integer primary key,
>     val text NOT NULL,
>     other integer NOT NULL
> );
>
> INSERT INTO longtext VALUES (
>     4,
>     (SELECT string_agg(chr((random()*25+65)::integer), '')
>         FROM generate_series(1, 2000)),
>     42
> );
>
> SELECT reltoastrelid, reltoastrelid::regclass FROM pg_class
>     WHERE oid = 'longtext'::regclass;
>
>   reltoastrelid |      reltoastrelid
> ---------------+-------------------------
>           25206 | pg_toast.pg_toast_25203
> (1 row)
>
> Use "pageinspect" to see the tuples in the table and the TOAST table:
>
> SELECT t_xmin, t_xmax, t_ctid, t_attrs[1] AS id, t_attrs[2] AS val, t_attrs[3] AS other
>     FROM heap_page_item_attrs(get_raw_page('longtext', 0), 25203);
>
>   t_xmin | t_xmax | t_ctid |     id     |                  val                   |   other
> --------+--------+--------+------------+----------------------------------------+------------
>     2076 |      0 | (0,1)  | \x04000000 | \x0112d4070000d00700007b62000076620000 | \x2a000000
> (1 row)
>
> SELECT t_xmin, t_xmax, t_ctid, t_attrs[1] AS chunk_id, t_attrs[2] AS chunk_seq
>     FROM heap_page_item_attrs(get_raw_page('pg_toast.pg_toast_25203', 0), 25206);
>
>   t_xmin | t_xmax | t_ctid |  chunk_id  | chunk_seq
> --------+--------+--------+------------+------------
>     2076 |      0 | (0,1)  | \x7b620000 | \x00000000
>     2076 |      0 | (0,2)  | \x7b620000 | \x01000000
> (2 rows)
>
> Now let's UPDATE:
>
> UPDATE longtext SET other = -1 WHERE id = 4;
>
> Let's look at the tuples again:
>
> SELECT t_xmin, t_xmax, t_ctid, t_attrs[1] AS id, t_attrs[2] AS val, t_attrs[3] AS other
>     FROM heap_page_item_attrs(get_raw_page('longtext', 0), 25203);
>
>   t_xmin | t_xmax | t_ctid |     id     |                  val                   |   other
> --------+--------+--------+------------+----------------------------------------+------------
>     2076 |   2077 | (0,2)  | \x04000000 | \x0112d4070000d00700007b62000076620000 | \x2a000000
>     2077 |      0 | (0,2)  | \x04000000 | \x0112d4070000d00700007b62000076620000 | \xffffffff
> (2 rows)
>
> A new tuple has been entered, but "val" still points to chunk ID 0x0000627b
> (this is a little-endian machine).
>
> SELECT t_xmin, t_xmax, t_ctid, t_attrs[1] AS chunk_id, t_attrs[2] AS chunk_seq
>     FROM heap_page_item_attrs(get_raw_page('pg_toast.pg_toast_25203', 0), 25206);
>
>   t_xmin | t_xmax | t_ctid |  chunk_id  | chunk_seq
> --------+--------+--------+------------+------------
>     2076 |      0 | (0,1)  | \x7b620000 | \x00000000
>     2076 |      0 | (0,2)  | \x7b620000 | \x01000000
> (2 rows)
>
> The TOAST table is unchanged!
>
> This was a HOT update, but it works the same for a non-HOT update:
>
> UPDATE longtext SET id = 1 WHERE id = 4;
>
> SELECT t_xmin, t_xmax, t_ctid, t_attrs[1] AS id, t_attrs[2] AS val, t_attrs[3] AS other
>     FROM heap_page_item_attrs(get_raw_page('longtext', 0), 25203);
>
>   t_xmin | t_xmax | t_ctid |     id     |                  val                   |   other
> --------+--------+--------+------------+----------------------------------------+------------
>     2076 |   2077 | (0,2)  | \x04000000 | \x0112d4070000d00700007b62000076620000 | \x2a000000
>     2077 |   2078 | (0,3)  | \x04000000 | \x0112d4070000d00700007b62000076620000 | \xffffffff
>     2078 |      0 | (0,3)  | \x01000000 | \x0112d4070000d00700007b62000076620000 | \xffffffff
> (3 rows)
>
> SELECT t_xmin, t_xmax, t_ctid, t_attrs[1] AS chunk_id, t_attrs[2] AS chunk_seq
>     FROM heap_page_item_attrs(get_raw_page('pg_toast.pg_toast_25203', 0), 25206);
>
>   t_xmin | t_xmax | t_ctid |  chunk_id  | chunk_seq
> --------+--------+--------+------------+------------
>     2076 |      0 | (0,1)  | \x7b620000 | \x00000000
>     2076 |      0 | (0,2)  | \x7b620000 | \x01000000
> (2 rows)
>
> Yours,
> Laurenz Albe
>


--
Achilleas Mantzios
IT DEV Lead
IT DEPT
Dynacom Tankers Mgmt



pgsql-general by date:

Previous
From: VENKTESH GUTTEDAR
Date:
Subject: Re: [GENERAL] Appending to multidimentional array.
Next
From: Chris Travers
Date:
Subject: Re: [GENERAL] Appending to multidimentional array.