searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

PAX存储引擎元数据管理与Parquet文件格式

2024-10-10 02:07:00
61
0

1.PAX存储引擎元数据管理

PAX( Partition Attributes Across) 是一种存储布局的优化方案,结合了行存储和列存储的优点。在 PAX 布局中,数据以分区为单位进行存储,每个分区内的属性(即列)是连续存储的。PAX兼具列存的连续IO读取特性、行存元组内数据的空间局部性。
在PostgreSQL中,PAX存储引擎可以基于Parquet文件格式实现。Parquet 文件将数据分割成行组(row group),每个行组包含多个行的数据,类似于 PAX 分区的概念。在每个行组内,Parquet 按列存储数据,即每一列的数据在行组内是连续存放的。这与 PAX 在分区内按列存储的做法一致。创建一张PAX表后,insert语句插入的元组将形成一个文件,称为一个block,即一个Parquet文件。执行多次插入操作后,一张PAX表将拥有多个block文件。下文将介绍PAX如何通过元数据管理PAX表和其中的block文件,特别是block/元组的可见性判断如何实现。
PostgreSQL中,PAX可以插件的形式实现,具有与内核松耦合的特性。这种特性得益于内核支持的自定义Acess Methods(AM)机制。插件开发者可以定义一组表的AM,从而实现自建的存储引擎。具体来说,AM包含了一组操作,如对表进行扫描、对表进行插入、删除,以及索引、vacuum/analyze相关的操作:
static const TableAmRoutine heapam_methods = {
     ...
    .slot_callbacks = heapam_slot_callbacks,

    .scan_begin = heap_beginscan, //顺序扫描
    ...
    .scan_getnextslot = heap_getnextslot, //顺序扫描
    ...
    .index_fetch_tuple = heapam_index_fetch_tuple, //索引扫描

    .tuple_insert = heapam_tuple_insert, // 插入
    ...
    // 其他访问方法
    .tuple_fetch_row_version = heapam_fetch_row_version,
    .tuple_get_latest_tid = heap_get_latest_tid,
    .tuple_tid_valid = heapam_tuple_tid_valid,
    .tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,
    .index_delete_tuples = heap_index_delete_tuples,
PostgreSQL默认的存储方式是Heap表。对于Heap表而言,Heap AM中定义了表内的元组可见性判断方式,这就是Postgre
SQL默认的MVCC机制。可以看出,当开发者自定义AM时,除了考虑数据文件的存储与读写外,还应考虑数组元组如何与内核原有事务、MVCC机制相配合。
PAX插件提供了block级别的MVCC,block内的元组对事务的可见性等同于整个block对事务的可见性。这一机制是基于PAX辅助表和PAX元数据实现的。在PAX中,一张PAX表可以附带一张辅助表。辅助表中的每个元组对应该表的一个block文件。PAX辅助表定义如下:
0条评论
作者已关闭评论
马****彦
1文章数
0粉丝数
马****彦
1 文章 | 0 粉丝
马****彦
1文章数
0粉丝数
马****彦
1 文章 | 0 粉丝
原创

PAX存储引擎元数据管理与Parquet文件格式

2024-10-10 02:07:00
61
0

1.PAX存储引擎元数据管理

PAX( Partition Attributes Across) 是一种存储布局的优化方案,结合了行存储和列存储的优点。在 PAX 布局中,数据以分区为单位进行存储,每个分区内的属性(即列)是连续存储的。PAX兼具列存的连续IO读取特性、行存元组内数据的空间局部性。
在PostgreSQL中,PAX存储引擎可以基于Parquet文件格式实现。Parquet 文件将数据分割成行组(row group),每个行组包含多个行的数据,类似于 PAX 分区的概念。在每个行组内,Parquet 按列存储数据,即每一列的数据在行组内是连续存放的。这与 PAX 在分区内按列存储的做法一致。创建一张PAX表后,insert语句插入的元组将形成一个文件,称为一个block,即一个Parquet文件。执行多次插入操作后,一张PAX表将拥有多个block文件。下文将介绍PAX如何通过元数据管理PAX表和其中的block文件,特别是block/元组的可见性判断如何实现。
PostgreSQL中,PAX可以插件的形式实现,具有与内核松耦合的特性。这种特性得益于内核支持的自定义Acess Methods(AM)机制。插件开发者可以定义一组表的AM,从而实现自建的存储引擎。具体来说,AM包含了一组操作,如对表进行扫描、对表进行插入、删除,以及索引、vacuum/analyze相关的操作:
static const TableAmRoutine heapam_methods = {
     ...
    .slot_callbacks = heapam_slot_callbacks,

    .scan_begin = heap_beginscan, //顺序扫描
    ...
    .scan_getnextslot = heap_getnextslot, //顺序扫描
    ...
    .index_fetch_tuple = heapam_index_fetch_tuple, //索引扫描

    .tuple_insert = heapam_tuple_insert, // 插入
    ...
    // 其他访问方法
    .tuple_fetch_row_version = heapam_fetch_row_version,
    .tuple_get_latest_tid = heap_get_latest_tid,
    .tuple_tid_valid = heapam_tuple_tid_valid,
    .tuple_satisfies_snapshot = heapam_tuple_satisfies_snapshot,
    .index_delete_tuples = heap_index_delete_tuples,
PostgreSQL默认的存储方式是Heap表。对于Heap表而言,Heap AM中定义了表内的元组可见性判断方式,这就是Postgre
SQL默认的MVCC机制。可以看出,当开发者自定义AM时,除了考虑数据文件的存储与读写外,还应考虑数组元组如何与内核原有事务、MVCC机制相配合。
PAX插件提供了block级别的MVCC,block内的元组对事务的可见性等同于整个block对事务的可见性。这一机制是基于PAX辅助表和PAX元数据实现的。在PAX中,一张PAX表可以附带一张辅助表。辅助表中的每个元组对应该表的一个block文件。PAX辅助表定义如下:
文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0