PostgreSQL DBA( - PG 12 Improving Partition Select

PG 10 when executing a query, one by one check constraint for each partition to see whether in the partition table, there will be a lot if the partition in the planning stage large performance loss. PG 11 by "partition pruning" algorithm to quickly identify the matching partitions to improve performance, but PG 11 still did some unnecessary processing involved still loads such as whether or not the metadata for all partitions. 
PG 12 Furthermore, it is loaded metadata after pruning, if it does not involve the majority of zoning in the planning phase can bring significant performance gains.

Create a partition table

[local]:5432 pg12@testdb=# drop table if exists t_counter;NOTICE:  table "t_counter" does not exist, skippingDROP TABLETime: 29.768 ms[local]:5432 pg12@testdb=# create table t_counter(id int);CREATE TABLETime: 120.165 ms[local]:5432 pg12@testdb=# insert into t_counter select generate_series(0,100000);INSERT 0 100001Time: 333.637 ms[local]:5432 pg12@testdb=# drop table if exists t_hash_manypartitions;NOTICE:  table "t_hash_manypartitions" does not exist, skippingDROP TABLETime: 1.536 ms[local]:5432 pg12@testdb=# create table t_hash_manypartitions (c1 int,c2  varchar(40),c3 varchar(40)) partition by hash(c2);CREATE TABLETime: 45.986 ms[local]:5432 pg12@testdb=# [local]:5432 pg12@testdb=# \o /tmp/script.sql[local]:5432 pg12@testdb=# select 'create table t_hash_manypartitions_'pg12@testdb-#       ||idpg12@testdb-#       ||' partition of t_hash_manypartitions for values with (modulus 8192,remainder '||id||');'pg12@testdb-# from t_counterpg12@testdb-# where id < 8192pg12@testdb-# order by id ;Time: 78.499 ms[local]:5432 pg12@testdb=# \o[local]:5432 pg12@testdb=# [root@localhost ~]# tail -n 10 /tmp/script.sql  create table t_hash_manypartitions_8184 partition of t_hash_manypartitions for values with (modulus 8192,remainder 8184); create table t_hash_manypartitions_8185 partition of t_hash_manypartitions for values with (modulus 8192,remainder 8185); create table t_hash_manypartitions_8186 partition of t_hash_manypartitions for values with (modulus 8192,remainder 8186); create table t_hash_manypartitions_8187 partition of t_hash_manypartitions for values with (modulus 8192,remainder 8187); create table t_hash_manypartitions_8188 partition of t_hash_manypartitions for values with (modulus 8192,remainder 8188); create table t_hash_manypartitions_8189 partition of t_hash_manypartitions for values with (modulus 8192,remainder 8189); create table t_hash_manypartitions_8190 partition of t_hash_manypartitions for values with (modulus 8192,remainder 8190); create table t_hash_manypartitions_8191 partition of t_hash_manypartitions for values with (modulus 8192,remainder 8191);(8192 rows)[local]:5432 pg12@testdb=# \i /tmp/script.sql...CREATE TABLETime: 20.784 msCREATE TABLETime: 21.107 mspsql:/tmp/script.sql:8196: ERROR:  syntax error at or near "8192"LINE 1: (8192 rows)         ^Time: 0.198 ms[local]:5432 pg12@testdb=#

Insert data

insert into t_hash_manypartitions(c1,c2,c3) values(1,'c2-1','c3-1');

PG 11 
perform a query condition c2 = 'c2-1'

testdb=# begin;BEGINtestdb=# explain analyze select * from t_hash_manypartitions where c2 = 'c2-1';                                                         QUERY PLAN                         ----------------------------------------------------------------------------------------------------------------------------- Append  (cost=0.00..14.38 rows=2 width=200) (actual time=1.516..1.516 rows=0 loops=1)   ->  Seq Scan on t_hash_manypartitions_4956  (cost=0.00..14.38 rows=2 width=200) (actual time=1.491..1.491 rows=0 loops=1)         Filter: ((c2)::text = 'c2-1'::text) Planning Time: 1585.294 ms Execution Time: 2.502 ms(5 rows)

Plans for more than 1.5s, relatively poor results. 

Zhengzhou regular hospital infertility: http: //www.xbzztj.com/

Query lock information

[xdb@localhost ~]$ psql -d testdb -p 5433psql (11.2)Type "help" for help.testdb=# select relation::regclass,locktype,virtualxid,transactionid,virtualtransaction,pid,mode,granted,fastpath testdb-# from pg_locks testdb-# where pid <> pg_backend_pid();          relation          |  locktype  | virtualxid | transactionid | virtualtransaction | pid  |      mode       | granted | fastpath ----------------------------+------------+------------+---------------+--------------------+------+-----------------+---------+---------- t_hash_manypartitions_15   | relation   |            |               | 4/2                | 2695 | AccessShareLock | t       | t t_hash_manypartitions_14   | relation   |            |               | 4/2                | 2695 | AccessShareLock | t       | t t_hash_manypartitions_13   | relation   |            |               | 4/2                | 2695 | AccessShareLock | t       | t...testdb=# select count(*) from pg_locks where pid <> pg_backend_pid(); count -------  8193(1 row)

PG 12 
执行查询

[local]:5432 pg12@testdb=# begin;BEGINTime: 0.639 ms[local]:5432 pg12@testdb=#* explain analyze select * from t_hash_manypartitions where c2 = 'c2-1';                                                       QUERY PLAN                           ------------------------------------------------------------------------------------------------------------------------- Seq Scan on t_hash_manypartitions_4956  (cost=0.00..14.38 rows=2 width=200) (actual time=22.356..22.356 rows=0 loops=1)   Filter: ((c2)::text = 'c2-1'::text) Planning Time: 75.491 ms Execution Time: 22.603 ms(4 rows)Time: 519.835 ms[local]:5432 pg12@testdb=#*

计划时间75ms,比起PG 11的1500ms快了2个数量级。 郑州不育不孕医院:http://www.zzchyy110.com/

查询锁信息

[local]:5432 pg12@testdb=# select relation::regclass,locktype,virtualxid,transactionid,virtualtransaction,pid,mode,granted,fastpath from pg_locks where pid <> pg_backend_pid();          relation          |  locktype  | virtualxid | transactionid | virtualtransaction | pid  |      mode       | granted | fastpath ----------------------------+------------+------------+---------------+--------------------+------+-----------------+---------+---------- t_hash_manypartitions_4956 | relation   |            |               | 3/4                | 1591 | AccessShareLock | t       | t t_hash_manypartitions      | relation   |            |               | 3/4                | 1591 | AccessShareLock | t       | t                            | virtualxid | 3/4        |               | 3/4                | 1591 | ExclusiveLock   | t       | t(3 rows)Time: 1.935 ms

很好,只是给涉及的分区上锁而已。


Guess you like

Origin blog.51cto.com/14510351/2440423