Hi,

I benchmarked on a RANGE partitioned table with 1.1k leaf partitions and no 
sub-partitioned tables.
But, statement latencies on a partitioned table is much slower than on a 
non-partitioned table.

UPDATE latency is 210 times slower than a non-partitioned table.
SELECT latency is 36 times slower than a non-partitioned table.
Surprisingly INSERT latency is almost same.

Of course I'm sure table partitioning work well with up to a hundred partitions 
as written on the postgresql document.
But, my customer will use partitioned table with 1.1k leaf partitions.
So, we need to improve performance.

Any ideas?

The results of pgbench and perf are listed below.

pgbench results
---------------

transaction type: update.sql
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
duration: 180 s
number of transactions actually processed: 648
latency average = 278.202 ms
tps = 3.594512 (including connections establishing)
tps = 3.594545 (excluding connections establishing)
statement latencies in milliseconds:
         0.011  \set aid random(1, 1100 * 1)
         0.004  \set delta random(-5000, 5000)
         0.038  BEGIN;
       277.005  UPDATE test.accounts SET abalance = abalance + :delta WHERE aid 
= :aid;
         1.140  END;

transaction type: select.sql
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
duration: 180 s
number of transactions actually processed: 19415
latency average = 9.281 ms
tps = 107.745068 (including connections establishing)
tps = 107.746067 (excluding connections establishing)
statement latencies in milliseconds:
         0.800  \set aid random(1, 1100 * 1)
         0.137  \set delta random(-5000, 5000)
         1.351  BEGIN;
         4.941  SELECT abalance FROM test.accounts WHERE aid = :aid;
         2.052  END;

transaction type: insert.sql
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
duration: 180 s
number of transactions actually processed: 31895
latency average = 5.654 ms
tps = 176.865541 (including connections establishing)
tps = 176.867086 (excluding connections establishing)
statement latencies in milliseconds:
         2.083  \set aid random(1, 1100 * 1)
         0.003  \set delta random(-5000, 5000)
         0.029  BEGIN;
         3.222  INSERT INTO test.accounts_history (aid, delta, mtime) VALUES 
(:aid, :delta, CURRENT_TIMESTAMP);
         0.317  END;

Top 10 of perf report
------------

UPDATE:
21.33%  postgres  postgres           [.] range_table_mutator
12.57%  postgres  postgres           [.] AllocSetAlloc
  4.97%  postgres  postgres           [.] palloc
  4.48%  postgres  postgres           [.] make_one_rel
  3.96%  postgres  postgres           [.] lappend
  2.74%  postgres  [kernel.kallsyms]  [k] get_page_from_freelist
  1.87%  postgres  postgres           [.] setup_append_rel_array
  1.68%  postgres  [kernel.kallsyms]  [k] list_del
  1.64%  postgres  [kernel.kallsyms]  [k] __alloc_pages_nodemask
  1.62%  postgres  [kernel.kallsyms]  [k] unmap_vmas

SELECT:
14.72%  postgres  postgres           [.] AllocSetAlloc
  5.14%  postgres  postgres           [.] hash_search_with_hash_value
  4.23%  postgres  postgres           [.] palloc
  4.06%  postgres  postgres           [.] MemoryContextAllocZeroAligned
  2.61%  postgres  postgres           [.] copyObjectImpl
  2.34%  postgres  postgres           [.] expression_tree_mutator
  2.13%  postgres  [kernel.kallsyms]  [k] _spin_lock
  1.91%  postgres  postgres           [.] lappend
  1.59%  postgres  [kernel.kallsyms]  [k] __link_path_walk
  1.50%  postgres  postgres           [.] set_rel_size

INSERT:
20.75%  postgres  postgres           [.] hash_search_with_hash_value
  6.03%  postgres  postgres           [.] hash_any
  4.88%  postgres  postgres           [.] AllocSetAlloc
  4.05%  postgres  postgres           [.] LWLockRelease
  4.05%  postgres  postgres           [.] LWLockAcquire
  3.27%  postgres  postgres           [.] oid_cmp
  3.06%  postgres  postgres           [.] SearchCatCache
  2.97%  postgres  postgres           [.] LockReleaseAll
  2.57%  postgres  postgres           [.] pg_qsort
  2.37%  postgres  postgres           [.] hash_seq_search


The following is information on the environment used for the benchmark.

Server spec
-----------

  Server has 16 cpu.
  Memory size is 264GB.
  Database directory is on SSD.

database tuning
---------------

 shared_buffers = 102GB
  max_locks_per_transactions = 1000000

postgresql version
------------------

  11beta2 + patch1 + patch2

  patch1: Allow direct lookups of AppendRelInfo by child relid
          commit 7d872c91a3f9d49b56117557cdbb0c3d4c620687

  patch2: 0001-Speed-up-INSERT-and-UPDATE-on-partitioned-tables.patch
          https://commitfest.postgresql.org/18/1690/


table definition
----------------

  create table test.accounts(aid serial, abalance int) partition by range(aid));
  create table test.accounts_history(id serial, aid int, delta int, mtime 
timestamp without time zone) partition by range(aid);

  create table test.account_part_1 partition of test.accounts for values from 
(1) to (2);
  create table test.account_part_2 partition of test.accounts for values from 
(2) to (3);
  .
  .
  create table test.account_part_1100 partition of test.accounts for values 
from (1100) to (1101);

  accounts_history is also partitioned in the same way.

  There is only one data in each leaf partitions for UPDATE/SELECT benchmark.

  regards,

Reply via email to