写路径总览

为了适应不同场景的需求,在 YMatrix 中支持三种写入模式,由表级参数 prefer_load_moderowstore_size 共同决定,默认为 Normal 模式

图片

Single 模式

在 Single 模式下,数据会在本地内存中最多积攒 1MB,然后直接插入到 rowstore 中,整个写入过程和传统的 PostgreSQL Heap 写入类似,数据直接放置在 Shared Buffers 中,其大小由同名参数 shared_buffers 控制,在 Single 模式下,可以酌情调大此参数,否则也会发生内存置换。

图片

优点

  • 插入延迟最小,内存消耗最小。 缺点
  • 对于大数据量插入,数据由于先进入到 rowstore,多了一次合并的过程;
  • 数据进入 rowstore 后,假如不能尽快的转换成 columnstore,查看表大小 (\dt+) 会比较大,可以在查看前手动执行一次 vacuum + vacuum full
  • AP 查询 和 BRIN 查询效率均不如 columnstore;
  • 由于没有压缩,数据和 XLOG 大小均大于 columnstore 数倍,不适合 IO 很差的环境。

Bulk 模式

在 Bulk 模式下,数据会先拷贝到本地内存,最多达到 rowstore_size 大小,当达到 rowstore_size 大小时,会被直接转换成 columnstore 刷新到磁盘,当插入结束,本地内存未达到 rowstoresize 大小时,仍然会转换成 columnstore 刷新到磁盘中。 优点:

  • 数据经过压缩,对磁盘 IO 更加友好
  • AP 查询 和 BRIN 查询效率比 rowstore 好
  • 少了一次写放大 缺点:
  • 占用内存更多,数倍于 rowstore,尤其是分区表数量多的情况
  • 插入延迟不如 rowstore

Normal 模式

智能插入模式,数据会被拷贝到本地内存,当达到 rowstore_size 大小时,会被直接转换成 columnstore 刷新到磁盘,当插入结束,本地内存未达到 (rowstore_size / 2) 大小时,则会写入到当前的 rowstore 中,否则会转换成 columnstore 刷新到磁盘中,默认为 normal 模式。

不同模式的写入速度比较

  1. 单行插入:pgbench -n -f single_insert.sql -c 1 -j 1 -t 100000 test
测试类型 每客户端事务数 客户端数 线程数 平均延迟 (ms) TPS (包括连接) TPS (不包括连接)
single_insert.sql 100,000 1 1 1.98 505.03 505.06
bulk_insert.sql 100,000 1 1 15.282 65.44 65.44
normal_insert.sql 100,000 1 1 1.968 508.02 508.05
  1. 小批量插入:time for i in {1..2000}; do psql test -f batch_insert.sql; done
模式 总耗时 总秒数 (s) 每秒行数 (rows/s)
single 2m27s 147 ≈ 680
normal 2m28s 148 ≈ 676
bulk 4m55s 295 ≈ 339
  1. 大批量写入:生成 5000w 行的 csv,copy 导入不同模式的表
模式 行数 用时 (秒)
bulk 50,000,000 69.287
single 50,000,000 50.868
normal 50,000,000 70.612
  1. MARS3 single 模式与 heap 的写入比较: 压缩比接近 10 倍,TPS 相较于 heap 约 25% 左右的损耗
表名 压缩比 存储节省
fi_voucher 7:01 86%
fi_voucher_b 15:01 93%
aai_voucher 4.5:1 78%
aai_voucher_record 8.9:1 89%

不同模式生成的日志量比较

某实测场景中,插入相同大小的数据,可以看到产生 WAL 的速率相同,但是总体生成的 WAL 大约是 Heap 的 1/3,可以大幅减少 WAL 占用的存储空间。

图片

返回上一章节:存储引擎原理