Time scaledb and PG write performance test

Keywords: Database PostgreSQL

testing environment

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  
--------------------- 
Author: Kun_Tsai 
Source: CSDN 
Original: https://blog.csdn.net/jacicson 1987/article/details/82988556?Utm_source=copy 
Copyright Statement: This article is the original article of the blogger. Please attach a link to the blog article for reprinting.

CASE 1 Single TIME Index

timescaledb does not set the index (default time index)

PG Sets time Index

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")

Result

Single line write

10W rows per thread. About 180 bytes per line. One thread writes about 18 MB.

It seems that the performance of PG is slightly stronger than that of PG by 5%~10%.

Thread Average Rate (Row/s) Single thread 2 thread 4 thread 8 thread 16 thread 32 thread
timescaledb 1075 1008 1026 1045 923 654
PG 1092 1020 1070 1120 982 737
             
             
Total Rate (Row/s) Single thread 2 thread 4 thread 8 thread 16 thread 32 thread
timescaledb 1075 2011 4000 8166 14358 20337
PG 1092 2037 4037 8734 15087 22445

WAL file size

They are basically the same, about twice the amount of data.

Thread count Bytes PG_WAL_SIZE TS_WAL_SIZE
1 18697562 37428272 37464824
2 37379223 74547144 75026672
4 74785548 149803536 149525488
8 149548561 298455240 298400040
16 299134911 596227840 596302792
32 598385115 1191610952 1194038480

BATCH writes

Set the number of single-threaded rows to 10 million and BATCHSIZE to 1000

PG is superior to TIMESCALEDB.

1000W rows per thread batchsize=1000
Thread Average Rate (Row/s) Single thread 8 thread
timescaledb 26732 11916
PG 39113 14972
     
     
Total Rate (Row/s) Single thread 8 thread
timescaledb 26732 95140
PG 39113 119528


Increase id to add an index to index CASE 2

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")

Single line write

100,000 rows of data, single write

The performance of PG looks a little bit worse than that without adding indexes.

Total Rate (Row/s) Single thread
timescaledb 1051
PG 1019

 

BATCH writes

10 million rows per thread, batchsize set to 1000, 8 threads to process, 13.9G data

After adding an index, the performance of PG and TSDB is lower than before, and PG writing is still faster than TSDB.

1000W rows per thread batchsize=1000
Thread Average Rate (Row/s) Single thread 8 thread
timescaledb 26142 10591
PG 36861 13037
     
     
Total Rate (Row/s) Single thread 8 thread
timescaledb 26142 84588
PG 36861 103806

 

So far, the test has not seen the write performance advantages of timescaledb, especially after introducing more than one index, the performance has declined. Considering whether the data design or the amount of data is insufficient, it can not reflect the advantages of timescaledb.

 

Posted by rkstevens on Sat, 02 Feb 2019 15:27:15 -0800