timescaledb和PG写入性能测试

news/2024/7/9 23:04:06 标签: timescaledb, postgresql

目录

 

结论摘要

测试环境

数据构造

CASE 1 单TIME索引

单行写入

WAL文件增加

BATCH写入

资源占用

CASE 2 增加一个索引

单行写入

BATCH写入

资源占用

CASE 3 大量数据


结论摘要

小数据量(线程10万行),无论单多线程,有无batch,PG和TSDB性能相仿,PG略强。

增加一条索引,两者插入性能都有所下降

WAL增长约为插入数据的2倍,但是WAL有上限。

大数据量(2000万、1亿行),BATCHSIZE=1000,PG插入性能依旧强于TSDB。

CPU占用,TSDB占用略高,以8线程batch1000为例(TSDB:80%, PG: %60)

总体上单独PG 性能和资源消耗都优于TSDB。

下一步需要找到在何种场景下TSDB插入性能会优于PG。

测试环境

Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz

32G memory

SSD harddisk.

postgresql.conf


max_connections = 256
 
shared_buffers = 3GB                    # min 128kB
 
work_mem = 16MB                         # min 64kB
maintenance_work_mem = 256MB            # min 1MB
 
wal_buffers = 4MB 
checkpoint_timeout = 10min              # range 30s-1d
max_wal_size = 2GB
 
checkpoint_completion_target = 0.9  
--------------------- 
作者:Kun_Tsai 
来源:CSDN 
原文:https://blog.csdn.net/jacicson1987/article/details/82988556?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

数据构造

timestamp 每行递增1s

id  每行递增1

10个 integer 随机数 + 9个随机长度字符串

 

CASE 1 单TIME索引

timescaledb 不设置索引(默认time索引)

PG 设置time索引

ts1=# \d+ ckts1
                                            Table "public.ckts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "ckts1_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON ckts1 FOR EACH ROW EXECUTE PROCEDURE _timescaledb_internal.insert_blocker()

postgres=# \d+ cts1
                                            Table "public.cts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "cts1_time_index" btree ("time")

 

单行写入

每线程10W行数据。每行约180bytes. 一个线程写入约18MB。

看起来两者性能相差不大,PG稍强5%~10%, 之前此场景下influxdb的测试数据也放在一起做个对比

线程平均速率(行/s)单线程2线程4线程8线程16线程32线程
timescaledb1075100810261045923654
PG1092102010701120982737
infuxdb422378398370341305
       
总速率(行/s)单线程2线程4线程8线程16线程32线程
timescaledb10752011400081661435820337
PG10922037403787341508722445
infuxdb4227521588294754449732


WAL文件大小两者基本一致,都是大约数据量的 2倍。WAL文件增加

线程数字节数PG_WAL_SIZETS_WAL_SIZE
1186975623742827237464824
2373792237454714475026672
474785548149803536149525488
8149548561298455240298400040
16299134911596227840596302792
3259838511511916109521194038480

BATCH写入

单线程行数设为1000万, BATCHSIZE 设为1000

PG优于TIMESCALEDB。

每线程1000W行数据batchsize=1000
线程平均速率(行/s)单线程8线程
timescaledb2673211916
PG3911314972
   
   
总速率(行/s)单线程8线程
timescaledb2673295140
PG39113119528

资源占用

TDSB 32线程, CPU平均占用 57%。 比PG高10%。

PG 32线程, CPU平均占用 46%.

CASE 2 增加一个索引

 增加id为索引

ts1=# \d+ ckts1
                                            Table "public.ckts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "ckts1_id_idx" btree (id)
    "ckts1_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON ckts1 FOR EACH ROW EXECUTE PROCEDURE _timescaledb_internal.insert_blocker()

ts1=# 

postgres=# \d+ cts1
                                            Table "public.cts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "cst1_id_index" btree (id)
    "cts1_time_index" btree ("time")

单行写入

10万行数据,单条写入

和没有添加索引时性能差不多,PG看起来性能下降更多一点。

总速率(行/s)单线程
timescaledb1051
PG1019

 

BATCH写入

每线程1000万行数据,batchsize设为1000, 8线程处理,13.9G数据

增加一个索引以后,PG和TSDB比之前性能都有所降低,PG写入仍旧比TSDB快。

每线程1000W行数据batchsize=1000
线程平均速率(行/s)单线程8线程
timescaledb2614210591
PG3686113037
   
   
总速率(行/s)单线程8线程
timescaledb2614284588
PG36861103806

资源占用

8线程,batchsize=1000, TSDB CPU占用80%左右

8线程,batchsize=1000, PG CPU占用60%左右

 

CASE 3 大量数据

设置PG的表cts1索引time为DESC(倒序),测试结果与上面并无不同

postgres=# \d+ cts1
                                            Table "public.cts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "cts1_id_idx" btree (id)
    "cts1_time_idx" btree ("time" DESC)

ts1=# \d+ ckts1
                                            Table "public.ckts1"
 Column |           Type           | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+--------------------------+-----------+----------+---------+----------+--------------+-------------
 time   | timestamp with time zone |           | not null |         | plain    |              | 
 id     | integer                  |           |          |         | plain    |              | 
 col2   | integer                  |           |          |         | plain    |              | 
 col3   | integer                  |           |          |         | plain    |              | 
 col4   | integer                  |           |          |         | plain    |              | 
 col5   | integer                  |           |          |         | plain    |              | 
 col6   | integer                  |           |          |         | plain    |              | 
 col7   | integer                  |           |          |         | plain    |              | 
 col8   | integer                  |           |          |         | plain    |              | 
 col9   | integer                  |           |          |         | plain    |              | 
 col10  | integer                  |           |          |         | plain    |              | 
 col11  | integer                  |           |          |         | plain    |              | 
 col12  | character varying(30)    |           |          |         | extended |              | 
 col13  | character varying(30)    |           |          |         | extended |              | 
 col14  | character varying(30)    |           |          |         | extended |              | 
 col15  | character varying(30)    |           |          |         | extended |              | 
 col16  | character varying(30)    |           |          |         | extended |              | 
 col17  | character varying(30)    |           |          |         | extended |              | 
 col18  | character varying(30)    |           |          |         | extended |              | 
 col19  | character varying(30)    |           |          |         | extended |              | 
 col20  | character varying(30)    |           |          |         | extended |              | 
Indexes:
    "ckts1_id_idx" btree (id)
    "ckts1_time_idx" btree ("time" DESC)
Triggers:
    ts_insert_blocker BEFORE INSERT ON ckts1 FOR EACH ROW EXECUTE PROCEDURE _timescaledb_internal.insert_blocker()

怀疑因为数据量不够大,导致TSDB写入性能优势没能体现

增大数据量到1亿行

batchsize = 1000,单线程写入

行数字节数PG执行时间TSDB执行时间PG行速率TSDB行速率(行/s)TSDB TRUNK数量
2000万3.45GB565 s817 s35398 (行/s)24480 (行/s)30
1亿17.4GB2782 s3992 s35945 (行/s)25050 (行/s)166

结果仍然是PG写入速度更快。

To be continued...


http://www.niftyadmin.cn/n/549214.html

相关文章

redis全内存运行

2019独角兽企业重金招聘Python工程师标准>>> 在某些使用场景中,我们并不需要使用redis的持久化,反而需要发挥redis的内存数据库特性,实现完全内存运行,达到需要的高性能。 Redis 本身支持持久化,通过在一定…

CASE WHEN 及 SELECT CASE WHEN的用法

Case具有两种格式。简单Case函数和Case搜索函数。简单Case函数CASE sexWHEN 1 THEN 男WHEN 2 THEN 女ELSE 其他 END--Case搜索函数 CASE WHEN sex 1 THEN 男 WHEN sex 2 THEN 女 ELSE 其他 END 种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁&a…

PageAddItemExtended流程

学习PG写入数据,从PageAddItemExtended开始 参考文章:https://www.jianshu.com/p/e86989dbda92 源码位置:bufpage.c:190 OffsetNumber PageAddItemExtended(Page page,Item item,Size size,OffsetNumber offsetNumber,int flags) Page结构…

Starting MySQL...The server quit without updating PID file

首先来说下环境:操作系统:openSUSE enterprise 11MySQL版本:MySQL-server-5.6.22-1.sles11.x86_64.rpmMySQL读取配置文件的顺序:Default options are read from the following files in the given order:/etc/my.cnf ,…

11个实用但你可能不知道的Python程序库

目前,网上已有成千上万个Python包,但几乎没有人能够全部知道它们。单单PyPi上就有超过47000个包列表。 现在,越来越多的数据科学家开始使用Python,虽然他们从pandas,scikit-learn,numpy中获得了不少好处&am…

关于程序员的59条搞笑但却真实无比的编程语录

我收集了很多编程语录,基本上都跟程序员的生活有关。这些语录涉及软件开发,代码维护,调试纠错,软件bug,系统设计、文档,代码质量,测试和软件开发团队管理等方面。下面的这59条语录虽然很搞笑&am…

PG copyinsert性能对比

目录 测试环境 表结构 CASE1 结果 CASE 2 结果 CASE 3 结果 TPS修正 CASE 4 结果 结论 测试环境 Intel(R) Core(TM) i7-4790 CPU 3.60GHz 32G memory SSD harddisk. postgresql.conf max_connections 256shared_buffers 3GB # min 128kBw…

取代Exchange,TurboMail部署美林基业集团邮件系统

2019独角兽企业重金招聘Python工程师标准>>> 美林基业集团有限公司是以房地产开发为核心业务的大型现代企业集团,是以房地产开发为支柱,在建筑、商业、酒店、物业管理、教育等领域综合发展的现代大型企业集团。 自 1999年成立以来&…