TOAST 在 MVCC Postgres 中的行为方式
How TOAST behaves in MVCC Postgres
美好的一天,我正在阅读有关 TOAST 的 Postgres 文档,但我没有找到任何关于 TOAST 在 MVCC 方面如何工作的信息。
根据 postgres 的 documentation。
The TOAST management code is triggered only when a row value to be
stored in a table is wider than TOAST_TUPLE_THRESHOLD bytes (normally
2 kB).
据我所知,如果字段足够大并且长度可变,那么 postgres 不会将此字段直接存储在元组块中,而是存储对包含此字段的不同 table(file) 的引用chunk_id 和 sequence_id 字段。
但是,MVCC 呢?假设我有一个 table user(data jsonb , id int PK,name varchar(255))
。通常当行被更新时,新行将被创建,其中 xmin 等于当前事务。假设 jsonb 字段在 TOAST table 中并且该字段未更新,postgres 是否会为更新的行创建一个新的 TOAST 实例,或者新行将对现有的 TOAST 值有一个新的引用?
见here:
During an UPDATE operation, values of unchanged fields are normally preserved as-is; so an UPDATE of a row with out-of-line values incurs no TOAST costs if none of the out-of-line values change.
美好的一天,我正在阅读有关 TOAST 的 Postgres 文档,但我没有找到任何关于 TOAST 在 MVCC 方面如何工作的信息。 根据 postgres 的 documentation。
The TOAST management code is triggered only when a row value to be stored in a table is wider than TOAST_TUPLE_THRESHOLD bytes (normally 2 kB).
据我所知,如果字段足够大并且长度可变,那么 postgres 不会将此字段直接存储在元组块中,而是存储对包含此字段的不同 table(file) 的引用chunk_id 和 sequence_id 字段。
但是,MVCC 呢?假设我有一个 table user(data jsonb , id int PK,name varchar(255))
。通常当行被更新时,新行将被创建,其中 xmin 等于当前事务。假设 jsonb 字段在 TOAST table 中并且该字段未更新,postgres 是否会为更新的行创建一个新的 TOAST 实例,或者新行将对现有的 TOAST 值有一个新的引用?
见here:
During an UPDATE operation, values of unchanged fields are normally preserved as-is; so an UPDATE of a row with out-of-line values incurs no TOAST costs if none of the out-of-line values change.