CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.
PostgreSQL 12
What is coming up?
Devrim Gündüz
Principal Systems Engineer
@DevrimGunduz
1
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.2
SELF INTRODUCTION
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.3
ME:
• Using PostgreSQL since 1998.
• London PostgreSQL Prime Minister
• “The Guy With The PostgreSQL Tattoo”
• Responsible for PostgreSQL YUM (https://yum.postgresql.org) and ZYPP
(https://zypp.postgresql.org) repositories, where we host 200+ software
• PostgreSQL Major Contributor
• Fedora / EPEL packager for 50+ packages.
• London, UK.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.4
SOCIAL MEDIA
• Please follow:
 @EDBPostgres
 @PostgreSQL
 @PGConf_EU
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.5
SPECIAL THANKS
• Robert Haas, for many of the slides
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.6
SPECIAL THANKS
• Robert Haas, for many of the slides
• Anja, for the great event.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.7
AGENDA
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.8
AGENDA
• JIT
• psql
improvements
• DBA features
• Table
Partitioning
•
• Indexes
• The Query
Planner
• SQL Features
• Odds and
Ends
• DoS
prevention for
some
commands
• Postscript:
Advanced
Server
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.9
JIT
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.10
JIT
 Now enabled by default
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.11
JIT
 Now enabled by default
 auto_explain and EXPLAIN exposes more info about JIT
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.12
JIT
 Now enabled by default
 auto_explain and EXPLAIN exposes more info about JIT
 Red Hat / CentOS / Fedora requires postgresql12-llvmjit
 Debian / Ubuntu already bundles in core package.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.13
PSQL IMPROVEMENTS
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.14
psql improvements
• Add options for procedures in df
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.15
psql improvements
• Add options for procedures in df
• Show IP addresses in conninfo
 $ psql -p 5412 -h localhost -U postgres -c "conninfo"
 You are connected to database "postgres" as user "postgres" on
host "localhost" (address "127.0.0.1") at port "5412".
 $ psql -p 5412 -U postgres -c "conninfo"
 You are connected to database "postgres" as user "postgres" via
socket in "/var/run/postgresql" at port "5412".
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.16
psql: Improvements
• Add options for procedures in df
• Show IP addresses in conninfo
 $ psql -p 5412 -h localhost -U postgres -c "conninfo"
 You are connected to database "postgres" as user "postgres" on
host "localhost" (address "127.0.0.1") at port "5412".
 $ psql -p 5412 -U postgres -c "conninfo"
 You are connected to database "postgres" as user "postgres" via
socket in "/var/run/postgresql" at port "5412".
• Useful if hostname resolves to multiple IP addresses
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.17
psql: URLs in HELP
• [postgres] # help CREATE DATABASE
• Command: CREATE DATABASE
• Description: create a new database
• Syntax:
• CREATE DATABASE name
• [ [ WITH ] [ OWNER [=] user_name ]
• [ TEMPLATE [=] template ]
• <trrimmed>
• URL: https://www.postgresql.org/docs/12/sql-createdatabase.html
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.18
psql: Tab complete improvements
• ALTER DATABASE … SET TABLESPACE
• Include partitioned tables in what's offered after ANALYZE.
• Include toast_tuple_target in what's offered after ALTER TABLE ...
SET|RESET.
• Include HASH in what's offered after PARTITION BY.
• CREATE TABLE <name> with '(', OF or PARTITION OF.
• CREATE TABLE <name> OF with list of composite types.
• CREATE TABLE name (...) with PARTITION OF, WITH, TABLESPACE,
ON
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.19
psql: Tab complete improvements
• COMMIT (depending on the presence of a temporary table).
• -CREATE TABLE ON COMMIT with actions (only for temporary tables).
• SKIP_LOCKED option for VACUUM and ANALYZE
• ALTER INDEX … ALTER COLUMN … <column number goes here)
• Add completion for storage parameters after CREATE TABLE WITH
• Improve tab completion of ALTER INDEX/TABLE with SET
STATISTICS in psql
• ...and a few more.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.20
DBA FEATURES
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.21
SKIP_LOCKED for VACUUM and ANALYZE
• Allows VACUUM to skip the work on a relation if there is a conflicting
lock on it when trying to open it at the beginning of its processing.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.22
SKIP_LOCKED for VACUUM and ANALYZE
• Allows VACUUM to skip the work on a relation if there is a conflicting
lock on it when trying to open it at the beginning of its processing.
• Note: v11: VACUUM can process multiple tables
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.23
SKIP_LOCKED for VACUUM and ANALYZE
• Allows VACUUM to skip the work on a relation if there is a conflicting
lock on it when trying to open it at the beginning of its processing.
• Note: v11: VACUUM can process multiple tables
• vacuumdb also now has--skip-locked.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.24
SKIP_LOCKED for VACUUM and ANALYZE
• [pagila] # VACUUM (FULL, SKIP_LOCKED,VERBOSE) film,language;
• WARNING: skipping vacuum of "film" --- lock not available
• INFO: vacuuming "public.language"
• INFO: "language": found 0 removable, 6 nonremovable row versions in
1 pages
• DETAIL: 0 dead row versions cannot be removed yet.
• CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.07 s.
• VACUUM
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.25
vacuumdb: --min-xid-age and --min-mxid-age
• Improves the selectivity of the relations to vacuum or and analyze
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.26
vacuumdb: --min-xid-age and --min-mxid-age
• Improves the selectivity of the relations to vacuum or and analyze
• Transaction ID or multixact ID
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.27
vacuumdb: --min-xid-age and --min-mxid-age
• Improves the selectivity of the relations to vacuum or and analyze
• Transaction ID or multixact ID
• Chance to prioritize tables to prevent wraparound of one or the other.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.28
vacuumdb: --min-xid-age and --min-mxid-age
• Improves the selectivity of the relations to vacuum or and analyze
• Transaction ID or multixact ID
• Chance to prioritize tables to prevent wraparound of one or the other.
• When used with --table, opportunity to target subset of tables
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.29
max_connections and max_wal_senders
• max_wal_senders is no more a part of max_connections
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.30
max_connections and max_wal_senders
• max_wal_senders is no more a part of max_connections
• No more blocking of base backups, if there are enough
max_wal_senders are available
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.31
max_connections and max_wal_senders
• max_wal_senders is no more a part of max_connections
• No more blocking of base backups, if there are enough
max_wal_senders are available
• Now it is like autovacuum and bgworkers.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.32
pg_dumpall and pg_dump
• pg_dumpall: Now can exclude a database from pg_dumpall
 Can be given once
 The argument can be a pattern including wildcard characters.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.33
pg_dumpall and pg_dump
• pg_dumpall: Now can exclude a database from pg_dumpall
 Can be given once
 The argument can be a pattern including wildcard characters.
• pg_dump: Include ALTER INDEX … ALTER COLUMN … SET
STATISTICS info
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.34
pg_dumpall and pg_dump
• pg_dumpall: Now can exclude a database from pg_dumpall
 Can be given once
 The argument can be a pattern including wildcard characters.
• pg_dump: Include ALTER INDEX … ALTER COLUMN … SET
STATISTICS info
• pg_dump: Now allows multiple rows per insert
 Useful to speed up loading data in a different database engine.
 pg_dump dbname --inserts --rows-per-insert=250 (Default:100)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.35
postgresql.conf updates
• New parameters:
 ssl_min_protocol_version = 'TLSv1'
 ssl_max_protocol_version = ''
 shared_memory_type (Alternatives: nmap, sysv, windows)
 log_statement_sample_rate = 1 → (0.1 to 1)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.36
postgresql.conf updates
• New parameters:
 plan_cache_mode = auto (Alternatives: force_generic_plan,
force_custom_plan
 Executor level, not planner level
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.37
postgresql.conf updates
• New parameters:
 plan_cache_mode = auto (Alternatives: force_generic_plan,
force_custom_plan
 Executor level, not planner level
• Updated parameters:
 autovacuum_vacuum_cost_delay: 200 ms → 2 ms
 extra_float_digits : 0 → 1
 jit = off → on
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.38
PARTITIONING
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.39
PARTITION PRUNING
 edb=# d foo
 Table "public.foo"
 Column | Type | Collation | Nullable | Default
 --------+---------+-----------+----------+---------
 a | integer | | |
 b | text | | |
 Partition key: RANGE (a)
 Indexes:
 "foo_a_idx" UNIQUE, btree (a)
 Number of partitions: 1000 (Use d+ to list them.)
 edb=# select * from foo where a = 20190625;
 a | b
 ----------+--------
 20190625 | filler
 (1 row)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.40
PARTITION PRUNING
edb=# EXPLAIN UPDATE foo set b = 'modification' WHERE a =
20190625;
QUERY PLAN
------------------------------------------------------
Update on foo (cost=0.42..8.44 rows=1 width=42)
Update on foo20
-> Index Scan using foo20_a_idx on foo20
(cost=0.42..8.44 rows=1 width=42)
Index Cond: (a = 20190625)
(4 rows)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.41
PARTITION PRUNING: RESULTS
Version SELECT EXPLAIN
UPDATE
v11 33.114 ms 223.592 ms
v12beta 0.432 ms 0.535 ms
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.42
FASTER COPY INTO PARTITIONED TABLES
rhaas=# d bar
Table "public.bar"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | not null |
b | text | | |
Partition key: HASH (a)
Indexes:
"bar_pkey" PRIMARY KEY, btree (a)
Number of partitions: 8 (Use d+ to list them.)
rhaas=# copy bar from '/Users/rhaas/testcase/testbar.csv'
csv; -- 100k rows
Time: 330.384 ms (on v11)
Time: 276.175 ms (on v12beta, ~16% faster)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.43
CONCURRENT ATTACH PARTITION
rhaas=# select count(*) from foo;
...
rhaas=# create table foo1000 (a int, b text);
CREATE TABLE
rhaas=# alter table foo attach partition foo1000 for values
from (1000000000) to (1001000000);
ALTER TABLE
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.44
CONCURRENT ATTACH PARTITION
rhaas=# select count(*) from foo;
...
rhaas=# create table foo1000 (a int, b text);
CREATE TABLE
rhaas=# alter table foo attach partition foo1000 for values
from (1000000000) to (1001000000);
ALTER TABLE
On v11, the ALTER TABLE will block until the query
completes.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.45
CONCURRENT ATTACH PARTITION
rhaas=# select count(*) from foo;
...
rhaas=# create table foo1000 (a int, b text);
CREATE TABLE
rhaas=# alter table foo attach partition foo1000 for values
from (1000000000) to (1001000000);
ALTER TABLE
On v11, the ALTER TABLE will block until the query
completes.
On v12, it will not block.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.46
FOREIGN KEYS TO PARTITIONED TABLES
rhaas=# d bar
Table "public.bar"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | not null |
b | text | | |
Partition key: HASH (a)
Indexes:
"bar_pkey" PRIMARY KEY, btree (a)
Number of partitions: 8 (Use d+ to list them.)
rhaas=# create table bar_details (id serial primary key, a integer
references bar (a), s text);
ERROR: cannot reference partitioned table "bar"
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.47
FOREIGN KEYS TO PARTITIONED TABLES
rhaas=# d bar
Table "public.bar"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | not null |
b | text | | |
Partition key: HASH (a)
Indexes:
"bar_pkey" PRIMARY KEY, btree (a)
Number of partitions: 8 (Use d+ to list them.)
rhaas=# create table bar_details (id serial primary key, a integer
references bar (a), s text);
ERROR: cannot reference partitioned table "bar"
• On v12, the error is gone!
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.48
AVOIDING MERGE APPEND
v11:
rhaas=# EXPLAIN SELECT * FROM foo ORDER BY a;
QUERY PLAN
----------------------------------------------------
Merge Append (cost=475.04..86230275.02 rows=1000001270
width=11)
Sort Key: foo0.a
-> Index Scan using foo0_a_idx on foo0
(cost=0.42..31389.42 rows=1000000 width=11)
...
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.49
AVOIDING MERGE APPEND
v12:
rhaas=# EXPLAIN SELECT * FROM foo ORDER BY a;
QUERY PLAN
----------------------------------------------------
Append (cost=425.15..36394030.55 rows=1000001270
width=11)
-> Index Scan using foo0_a_idx on foo0
(cost=0.42..31389.42 rows=1000000 width=11)
...
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.50
AVOIDING MERGE APPEND: RESULTS
rhaas=# SELECT * FROM foo ORDER BY a OFFSET 1000000000;
a | b
---+---
(0 rows)
Time: 209820.957 ms (03:29.821) (on v11)
Time: 169733.233 ms (02:49.733) (on v12beta,
about 19% faster)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.51
INDEXING IMPROVEMENTS
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.52
BTREE INDEX IMPROVEMENTS: TEST
SETUP
pgbench -i -s 100
CREATE INDEX on pgbench_accounts (filler);
SELECT oid::regclass, pg_relation_size(oid) FROM pg_class
WHERE relname LIKE 'pgbench%' AND relkind = 'i';
pgbench -T 300 -c 8 -j 8 -N
SELECT oid::regclass, pg_relation_size(oid) from pg_class
WHERE relname like 'pgbench%' and relkind = 'i';
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.53
BTREE INDEX IMPROVEMENTS: RESULTS
Version Index on “filler” Index on “aid”
v11 (initial) 1089 MB 214 MB
v11 (final) 1204 MB 240 MB
v12beta (initial) 1091 MB (+0.1%) 214 MB (+0.0%)
v12beta (final) 1118 MB (-7.2%) 214 MB (-10.9%)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.54
REINDEX CONCURRENTLY
REINDEX takes ShareLock on table and AccessExclusiveLock on index,
blocking basically all access to the table – everything except prepared
queries that don’t use the index in question.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.55
REINDEX CONCURRENTLY
REINDEX takes ShareLock on table and AccessExclusiveLock on index,
blocking basically all access to the table – everything except prepared
queries that don’t use the index in question.
REINDEX CONCURRENTLY takes ShareUpdateExclusiveLock on both
table and index, permitting concurrent reads and writes.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.56
REINDEX CONCURRENTLY
REINDEX takes ShareLock on table and AccessExclusiveLock on index,
blocking basically all access to the table – everything except prepared
queries that don’t use the index in question.
REINDEX CONCURRENTLY takes ShareUpdateExclusiveLock on both
table and index, permitting concurrent reads and writes.
Similar to DROP INDEX CONCURRENTLY + CREATE INDEX
CONCURRENTLY.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.57
REINDEX CONCURRENTLY
REINDEX takes ShareLock on table and AccessExclusiveLock on index,
blocking basically all access to the table – everything except prepared
queries that don’t use the index in question.
REINDEX CONCURRENTLY takes ShareUpdateExclusiveLock on both
table and index, permitting concurrent reads and writes.
Similar to DROP INDEX CONCURRENTLY + CREATE INDEX
CONCURRENTLY.
Waits for concurrent transactions to end, twice.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.58
REINDEX CONCURRENTLY
REINDEX takes ShareLock on table and AccessExclusiveLock on index,
blocking basically all access to the table – everything except prepared
queries that don’t use the index in question.
REINDEX CONCURRENTLY takes ShareUpdateExclusiveLock on both
table and index, permitting concurrent reads and writes.
Similar to DROP INDEX CONCURRENTLY + CREATE INDEX
CONCURRENTLY.
Waits for concurrent transactions to end, twice.
Watch out for invalid indexes if fails or is interrupted.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.59
CREATE INDEX PROGRESS REPORTING
(1/2)
-[ RECORD 1 ]------+-------------------------------
pid | 66541
datid | 16384
datname | rhaas
relid | 23914
index_relid | 0
command | CREATE INDEX
phase | building index: scanning table
lockers_total | 0
lockers_done | 0
current_locker_pid | 0
blocks_total | 1639345
blocks_done | 523774
tuples_total | 0
tuples_done | 0
partitions_total | 0
partitions_done | 0
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.60
CREATE INDEX PROGRESS REPORTING
(2/2)
-[ RECORD 1 ]------+-------------------------------
pid | 66541
datid | 16384
datname | rhaas
relid | 23914
index_relid | 0
command | CREATE INDEX
phase | building index: loading tuples in tree
lockers_total | 0
lockers_done | 0
current_locker_pid | 0
blocks_total | 0
blocks_done | 0
tuples_total | 100000000
tuples_done | 10409041
partitions_total | 0
partitions_done | 0
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.61
GiST and SP-GiST Indexes
• GiST indexes now support INCLUDE columns.
• SP-GiST indexes now support K-nearest-neighbor
searches.
• GiST, GIN, and SP-GiST indexes now generate less WAL
during index creation.
• VACUUM of GiST indexes is now more efficient and can
recycle empty leaf pages.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.62
QUERY PLANNER
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.63
PLAN CACHE MODE
• Prepared queries can be handled in two ways.
 Strategy #1: Replan the query each time it’s executed for the
particular parameter values in use. (“custom plan”)
 Strategy #2: Create a plan that will work with any parameter values
and reuse it. (“generic plan”)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.64
PLAN CACHE MODE
• Prepared queries can be handled in two ways.
 Strategy #1: Replan the query each time it’s executed for the
particular parameter values in use. (“custom plan”)
 Strategy #2: Create a plan that will work with any parameter values
and reuse it. (“generic plan”)
• By default, PostgreSQL will try to adaptively pick the best
strategy.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.65
PLAN CACHE MODE
• If you know better, you can set plan_cache_mode.
 Typical use: Force custom plans, because the generic plans are
worse than the planner thinks.
 Possible use: Don’t waste any planning time trying to create
worthless custom plans.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.66
SUPPORT FUNCTIONS FOR SQL
FUNCTIONS
• v12:
• rhaas=# explain select * from
generate_series(1, 437218) g;
QUERY PLAN ----------------------------
--------------------------
• Function Scan on generate_series g (cost=0.00..4372.18
rows=437218 width=4)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.67
SQL FEATURES
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.68
SUPPORT FUNCTIONS FOR SQL
FUNCTIONS
• v11:
• rhaas=# EXPLAIN SELECT * FROM
generate_series(1, 437218) g;
• QUERY PLAN
• ------------------------------------------------------
• Function Scan on generate_series g
(cost=0.00..10.00 rows=1000 width=4)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.69
SUPPORT FUNCTIONS FOR SQL
FUNCTIONS
• v12:
rhaas=# EXPLAIN SELECT * FROM
generate_series(1, 437218) g;
QUERY PLAN ------------------------------
------------------------
Function Scan on generate_series g (cost=0.00..4372.18
rows=437218 width=4)
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.70
GENERATED COLUMNS
• rhaas=# CREATE TABLE gce (a int, b int, c int GENERATED
ALWAYS AS(a + b) stored);
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.71
GENERATED COLUMNS
• rhaas=# CREATE TABLE gce (a int, b int, c int GENERATED
ALWAYS AS(a + b) stored);
• Column c can’t be manually updated.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.72
GENERATED COLUMNS
• rhaas=# CREATE TABLE gce (a int, b int, c int GENERATED
ALWAYS AS(a + b) stored);
• Column c can’t be manually updated.
• It will be recomputed after every INSERT/UPDATE.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.73
GENERATED COLUMNS
• rhaas=# CREATE TABLE gce (a int, b int, c int GENERATED
ALWAYS AS(a + b) stored);
• Column c can’t be manually updated.
• It will be recomputed after every INSERT/UPDATE.
• Easier (but not necessarily faster) than a TRIGGER.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.74
OTHER FEATURES
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.75
R.I.P. TO RECOVERY.CONF
• Finally…
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.76
R.I.P. TO RECOVERY.CONF
• Finally…
• PostgreSQL now throws an error if recovery.conf is found.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.77
R.I.P. TO RECOVERY.CONF
• Finally…
• PostgreSQL now throws an error if recovery.conf is found.
• (Almost) everything is moved into postgresql.conf
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.78
R.I.P. TO RECOVERY.CONF
• Finally…
• PostgreSQL now throws an error if recovery.conf is found.
• (Almost) everything is moved into postgresql.conf
• No more standby_mode
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.79
R.I.P. TO RECOVERY.CONF
• Finally…
• PostgreSQL now throws an error if recovery.conf is found.
• (Almost) everything is moved into postgresql.conf
• No more standby_mode
• recovery_target_timeline=latest by default
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.80
R.I.P. TO RECOVERY.CONF
• Settings previously stored in recovery.conf are now in postgresql.conf
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.81
R.I.P. TO RECOVERY.CONF
• Settings previously stored in recovery.conf are now in postgresql.conf
• Use recovery.signal or standby.signal to trigger recovery or standby
mode
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.82
R.I.P. TO RECOVERY.CONF
• Settings previously stored in recovery.conf are now in postgresql.conf
• Use recovery.signal or standby.signal to trigger recovery or standby
mode
• Your backup management tool (or scripts) will likely need an update.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.83
R.I.P. TO RECOVERY.CONF
• Settings previously stored in recovery.conf are now in postgresql.conf
• Use recovery.signal or standby.signal to trigger recovery or standby
mode
• Your backup management tool (or scripts) will likely need an update.
• A few recovery-related parameters can now be changed without
restarting the server: archive_cleanup_command, promote_trigger_file,
recovery_end_command, and recovery_min_apply_delay.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.84
R.I.P. TO RECOVERY.CONF
• trigger_file → promote_trigger_file
• pg_basebackup -R appends to postgresql.conf
• A reload is enough for these parameters now:
• archive_cleanup_command
• promote_trigger_file
• recovery_end_command
• recovery_min_apply_delay;
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.85
ENABLE OR DISABLE CHECKSUMS
OFFLINE
[rhaas ~]$ pg_ctl stop
waiting for server to shut down.... done
server stopped
[rhaas ~]$ time pg_checksums -e
Checksum operation completed
Files scanned: 6289
Blocks scanned: 10080538
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums enabled in cluster
real 2m42.120s
user 0m20.674s
sys 1m30.388s
[rhaas ~]$ du -hs $PGDATA
87G /Users/rhaas/pgdata
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.86
TABLE ACCESS METHODS
• PostgreSQL can now support multiple table storage
formats, just as we have for years been able to support
multiple index formats (hash, btree, gist, etc.).
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.87
TABLE ACCESS METHODS
• PostgreSQL can now support multiple table storage
formats, just as we have for years been able to support
multiple index formats (hash, btree, gist, etc.).
• Currently, the only in-core table storage method is ‘heap’.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.88
TABLE ACCESS METHODS
• PostgreSQL can now support multiple table storage
formats, just as we have for years been able to support
multiple index formats (hash, btree, gist, etc.).
• Currently, the only in-core table storage method is ‘heap’.
• Expect more choices in a year or two.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.89
TABLE ACCESS METHODS
• PostgreSQL can now support multiple table storage
formats, just as we have for years been able to support
multiple index formats (hash, btree, gist, etc.).
• Currently, the only in-core table storage method is ‘heap’.
• Expect more choices in a year or two.
• Support for hidden OID columns removed.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.90
SOME OTHER STUFF
• GSSAPI encryption support
• Progress reporting for CLUSTER and VACUUM FULL
• SERIALIZABLE for parallel query
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.91
SOME OTHER STUFF
• pg_upgrade can use filesystem cloning.
• Unified logging framework for client tools, including
colorization support.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.92
SOME OTHER STUFF
• Avoid some rewrites in “ALTER TABLE … SET DATA TYPE timestamp”
• When the timezone is UTC, timestamptz and timestamp are binary
coercible, avoid the table rewrite, and continue to needlessly rewrite
any index on an affected column.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.93
SOME OTHER STUFF
• Log PostgreSQL version number on startup
 2019-03-14 11:33:39.842 CET [7829] LOG: starting PostgreSQL
12devel on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.3.1
20190223 (Red Hat 8.3.1-2), 64-bit
 2019-03-14 11:33:39.842 CET [7829] LOG: listening on IPv4
address "127.0.0.1", port 5412
 2019-03-14 11:33:39.916 CET [7829] LOG: listening on Unix
socket "/var/run/postgresql/.s.PGSQL.5412"
 2019-03-14 11:33:40.059 CET [7829] LOG: listening on Unix
socket "/tmp/.s.PGSQL.5412"
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.94
SOME OTHER STUFF
• Allow COPY FROM to filter data using WHERE conditions
 Extends the COPY FROM command with a WHERE condition,
which allows doing various types of filtering while importing the
data (random sampling, condition on a data column, etc.).
 Low overhead
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.95
SOME OTHER STUFF
• Allow COPY FROM to filter data using WHERE conditions
 Extends the COPY FROM command with a WHERE condition,
which allows doing various types of filtering while importing the
data (random sampling, condition on a data column, etc.).
 Low overhead
• pg_upgrade: --socketdir option
 This allows control of the directory in which the postmaster sockets
are created for the temporary postmasters started by pg_upgrade
 Useful for long path names.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.96
SOME OTHER STUFF
• Do not log empty incomplete startup packet
• Change "checkpoint starting" message to use "wal"
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.97
SOME OTHER STUFF
• pg_stat_statements_reset can now reset statistics specific to a
particular user/db/query.
 Now, it can discard the statistics gathered so far by
pg_stat_statements corresponding to the specified userid, dbid,
and queryid.
 If no parameter is specified or all the specified parameters have
default value 0, it will discard all statistics as per the old behavior.
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.98
ENTERPRISEDB POSTGRES ADVANCED
SERVERWhat is new in v12?
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.99
WHAT IS NEW IN ADVANCED SERVER 12?
• Interval Partitioning
• Compound Triggers
• MEDIAN, LISTAGG
• CAST(MULTISET)
• System View Improvements
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.
QUESTIONS & DISCUSSION
100
CONFIDENTIAL © Copyright EnterpriseDB Corporation, 2019. All rights reserved.
THANK YOU
info@enterprisedb.com
www.enterprisedb.com
101

PostgreSQL 12: What is coming up?, Enterprise Postgres Day

  • 1.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved. PostgreSQL 12 What is coming up? Devrim Gündüz Principal Systems Engineer @DevrimGunduz 1
  • 2.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.2 SELF INTRODUCTION
  • 3.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.3 ME: • Using PostgreSQL since 1998. • London PostgreSQL Prime Minister • “The Guy With The PostgreSQL Tattoo” • Responsible for PostgreSQL YUM (https://yum.postgresql.org) and ZYPP (https://zypp.postgresql.org) repositories, where we host 200+ software • PostgreSQL Major Contributor • Fedora / EPEL packager for 50+ packages. • London, UK.
  • 4.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.4 SOCIAL MEDIA • Please follow:  @EDBPostgres  @PostgreSQL  @PGConf_EU
  • 5.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.5 SPECIAL THANKS • Robert Haas, for many of the slides
  • 6.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.6 SPECIAL THANKS • Robert Haas, for many of the slides • Anja, for the great event.
  • 7.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.7 AGENDA
  • 8.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.8 AGENDA • JIT • psql improvements • DBA features • Table Partitioning • • Indexes • The Query Planner • SQL Features • Odds and Ends • DoS prevention for some commands • Postscript: Advanced Server
  • 9.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.9 JIT
  • 10.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.10 JIT  Now enabled by default
  • 11.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.11 JIT  Now enabled by default  auto_explain and EXPLAIN exposes more info about JIT
  • 12.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.12 JIT  Now enabled by default  auto_explain and EXPLAIN exposes more info about JIT  Red Hat / CentOS / Fedora requires postgresql12-llvmjit  Debian / Ubuntu already bundles in core package.
  • 13.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.13 PSQL IMPROVEMENTS
  • 14.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.14 psql improvements • Add options for procedures in df
  • 15.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.15 psql improvements • Add options for procedures in df • Show IP addresses in conninfo  $ psql -p 5412 -h localhost -U postgres -c "conninfo"  You are connected to database "postgres" as user "postgres" on host "localhost" (address "127.0.0.1") at port "5412".  $ psql -p 5412 -U postgres -c "conninfo"  You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5412".
  • 16.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.16 psql: Improvements • Add options for procedures in df • Show IP addresses in conninfo  $ psql -p 5412 -h localhost -U postgres -c "conninfo"  You are connected to database "postgres" as user "postgres" on host "localhost" (address "127.0.0.1") at port "5412".  $ psql -p 5412 -U postgres -c "conninfo"  You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5412". • Useful if hostname resolves to multiple IP addresses
  • 17.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.17 psql: URLs in HELP • [postgres] # help CREATE DATABASE • Command: CREATE DATABASE • Description: create a new database • Syntax: • CREATE DATABASE name • [ [ WITH ] [ OWNER [=] user_name ] • [ TEMPLATE [=] template ] • <trrimmed> • URL: https://www.postgresql.org/docs/12/sql-createdatabase.html
  • 18.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.18 psql: Tab complete improvements • ALTER DATABASE … SET TABLESPACE • Include partitioned tables in what's offered after ANALYZE. • Include toast_tuple_target in what's offered after ALTER TABLE ... SET|RESET. • Include HASH in what's offered after PARTITION BY. • CREATE TABLE <name> with '(', OF or PARTITION OF. • CREATE TABLE <name> OF with list of composite types. • CREATE TABLE name (...) with PARTITION OF, WITH, TABLESPACE, ON
  • 19.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.19 psql: Tab complete improvements • COMMIT (depending on the presence of a temporary table). • -CREATE TABLE ON COMMIT with actions (only for temporary tables). • SKIP_LOCKED option for VACUUM and ANALYZE • ALTER INDEX … ALTER COLUMN … <column number goes here) • Add completion for storage parameters after CREATE TABLE WITH • Improve tab completion of ALTER INDEX/TABLE with SET STATISTICS in psql • ...and a few more.
  • 20.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.20 DBA FEATURES
  • 21.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.21 SKIP_LOCKED for VACUUM and ANALYZE • Allows VACUUM to skip the work on a relation if there is a conflicting lock on it when trying to open it at the beginning of its processing.
  • 22.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.22 SKIP_LOCKED for VACUUM and ANALYZE • Allows VACUUM to skip the work on a relation if there is a conflicting lock on it when trying to open it at the beginning of its processing. • Note: v11: VACUUM can process multiple tables
  • 23.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.23 SKIP_LOCKED for VACUUM and ANALYZE • Allows VACUUM to skip the work on a relation if there is a conflicting lock on it when trying to open it at the beginning of its processing. • Note: v11: VACUUM can process multiple tables • vacuumdb also now has--skip-locked.
  • 24.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.24 SKIP_LOCKED for VACUUM and ANALYZE • [pagila] # VACUUM (FULL, SKIP_LOCKED,VERBOSE) film,language; • WARNING: skipping vacuum of "film" --- lock not available • INFO: vacuuming "public.language" • INFO: "language": found 0 removable, 6 nonremovable row versions in 1 pages • DETAIL: 0 dead row versions cannot be removed yet. • CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.07 s. • VACUUM
  • 25.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.25 vacuumdb: --min-xid-age and --min-mxid-age • Improves the selectivity of the relations to vacuum or and analyze
  • 26.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.26 vacuumdb: --min-xid-age and --min-mxid-age • Improves the selectivity of the relations to vacuum or and analyze • Transaction ID or multixact ID
  • 27.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.27 vacuumdb: --min-xid-age and --min-mxid-age • Improves the selectivity of the relations to vacuum or and analyze • Transaction ID or multixact ID • Chance to prioritize tables to prevent wraparound of one or the other.
  • 28.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.28 vacuumdb: --min-xid-age and --min-mxid-age • Improves the selectivity of the relations to vacuum or and analyze • Transaction ID or multixact ID • Chance to prioritize tables to prevent wraparound of one or the other. • When used with --table, opportunity to target subset of tables
  • 29.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.29 max_connections and max_wal_senders • max_wal_senders is no more a part of max_connections
  • 30.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.30 max_connections and max_wal_senders • max_wal_senders is no more a part of max_connections • No more blocking of base backups, if there are enough max_wal_senders are available
  • 31.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.31 max_connections and max_wal_senders • max_wal_senders is no more a part of max_connections • No more blocking of base backups, if there are enough max_wal_senders are available • Now it is like autovacuum and bgworkers.
  • 32.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.32 pg_dumpall and pg_dump • pg_dumpall: Now can exclude a database from pg_dumpall  Can be given once  The argument can be a pattern including wildcard characters.
  • 33.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.33 pg_dumpall and pg_dump • pg_dumpall: Now can exclude a database from pg_dumpall  Can be given once  The argument can be a pattern including wildcard characters. • pg_dump: Include ALTER INDEX … ALTER COLUMN … SET STATISTICS info
  • 34.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.34 pg_dumpall and pg_dump • pg_dumpall: Now can exclude a database from pg_dumpall  Can be given once  The argument can be a pattern including wildcard characters. • pg_dump: Include ALTER INDEX … ALTER COLUMN … SET STATISTICS info • pg_dump: Now allows multiple rows per insert  Useful to speed up loading data in a different database engine.  pg_dump dbname --inserts --rows-per-insert=250 (Default:100)
  • 35.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.35 postgresql.conf updates • New parameters:  ssl_min_protocol_version = 'TLSv1'  ssl_max_protocol_version = ''  shared_memory_type (Alternatives: nmap, sysv, windows)  log_statement_sample_rate = 1 → (0.1 to 1)
  • 36.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.36 postgresql.conf updates • New parameters:  plan_cache_mode = auto (Alternatives: force_generic_plan, force_custom_plan  Executor level, not planner level
  • 37.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.37 postgresql.conf updates • New parameters:  plan_cache_mode = auto (Alternatives: force_generic_plan, force_custom_plan  Executor level, not planner level • Updated parameters:  autovacuum_vacuum_cost_delay: 200 ms → 2 ms  extra_float_digits : 0 → 1  jit = off → on
  • 38.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.38 PARTITIONING
  • 39.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.39 PARTITION PRUNING  edb=# d foo  Table "public.foo"  Column | Type | Collation | Nullable | Default  --------+---------+-----------+----------+---------  a | integer | | |  b | text | | |  Partition key: RANGE (a)  Indexes:  "foo_a_idx" UNIQUE, btree (a)  Number of partitions: 1000 (Use d+ to list them.)  edb=# select * from foo where a = 20190625;  a | b  ----------+--------  20190625 | filler  (1 row)
  • 40.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.40 PARTITION PRUNING edb=# EXPLAIN UPDATE foo set b = 'modification' WHERE a = 20190625; QUERY PLAN ------------------------------------------------------ Update on foo (cost=0.42..8.44 rows=1 width=42) Update on foo20 -> Index Scan using foo20_a_idx on foo20 (cost=0.42..8.44 rows=1 width=42) Index Cond: (a = 20190625) (4 rows)
  • 41.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.41 PARTITION PRUNING: RESULTS Version SELECT EXPLAIN UPDATE v11 33.114 ms 223.592 ms v12beta 0.432 ms 0.535 ms
  • 42.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.42 FASTER COPY INTO PARTITIONED TABLES rhaas=# d bar Table "public.bar" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- a | integer | | not null | b | text | | | Partition key: HASH (a) Indexes: "bar_pkey" PRIMARY KEY, btree (a) Number of partitions: 8 (Use d+ to list them.) rhaas=# copy bar from '/Users/rhaas/testcase/testbar.csv' csv; -- 100k rows Time: 330.384 ms (on v11) Time: 276.175 ms (on v12beta, ~16% faster)
  • 43.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.43 CONCURRENT ATTACH PARTITION rhaas=# select count(*) from foo; ... rhaas=# create table foo1000 (a int, b text); CREATE TABLE rhaas=# alter table foo attach partition foo1000 for values from (1000000000) to (1001000000); ALTER TABLE
  • 44.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.44 CONCURRENT ATTACH PARTITION rhaas=# select count(*) from foo; ... rhaas=# create table foo1000 (a int, b text); CREATE TABLE rhaas=# alter table foo attach partition foo1000 for values from (1000000000) to (1001000000); ALTER TABLE On v11, the ALTER TABLE will block until the query completes.
  • 45.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.45 CONCURRENT ATTACH PARTITION rhaas=# select count(*) from foo; ... rhaas=# create table foo1000 (a int, b text); CREATE TABLE rhaas=# alter table foo attach partition foo1000 for values from (1000000000) to (1001000000); ALTER TABLE On v11, the ALTER TABLE will block until the query completes. On v12, it will not block.
  • 46.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.46 FOREIGN KEYS TO PARTITIONED TABLES rhaas=# d bar Table "public.bar" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- a | integer | | not null | b | text | | | Partition key: HASH (a) Indexes: "bar_pkey" PRIMARY KEY, btree (a) Number of partitions: 8 (Use d+ to list them.) rhaas=# create table bar_details (id serial primary key, a integer references bar (a), s text); ERROR: cannot reference partitioned table "bar"
  • 47.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.47 FOREIGN KEYS TO PARTITIONED TABLES rhaas=# d bar Table "public.bar" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- a | integer | | not null | b | text | | | Partition key: HASH (a) Indexes: "bar_pkey" PRIMARY KEY, btree (a) Number of partitions: 8 (Use d+ to list them.) rhaas=# create table bar_details (id serial primary key, a integer references bar (a), s text); ERROR: cannot reference partitioned table "bar" • On v12, the error is gone!
  • 48.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.48 AVOIDING MERGE APPEND v11: rhaas=# EXPLAIN SELECT * FROM foo ORDER BY a; QUERY PLAN ---------------------------------------------------- Merge Append (cost=475.04..86230275.02 rows=1000001270 width=11) Sort Key: foo0.a -> Index Scan using foo0_a_idx on foo0 (cost=0.42..31389.42 rows=1000000 width=11) ...
  • 49.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.49 AVOIDING MERGE APPEND v12: rhaas=# EXPLAIN SELECT * FROM foo ORDER BY a; QUERY PLAN ---------------------------------------------------- Append (cost=425.15..36394030.55 rows=1000001270 width=11) -> Index Scan using foo0_a_idx on foo0 (cost=0.42..31389.42 rows=1000000 width=11) ...
  • 50.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.50 AVOIDING MERGE APPEND: RESULTS rhaas=# SELECT * FROM foo ORDER BY a OFFSET 1000000000; a | b ---+--- (0 rows) Time: 209820.957 ms (03:29.821) (on v11) Time: 169733.233 ms (02:49.733) (on v12beta, about 19% faster)
  • 51.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.51 INDEXING IMPROVEMENTS
  • 52.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.52 BTREE INDEX IMPROVEMENTS: TEST SETUP pgbench -i -s 100 CREATE INDEX on pgbench_accounts (filler); SELECT oid::regclass, pg_relation_size(oid) FROM pg_class WHERE relname LIKE 'pgbench%' AND relkind = 'i'; pgbench -T 300 -c 8 -j 8 -N SELECT oid::regclass, pg_relation_size(oid) from pg_class WHERE relname like 'pgbench%' and relkind = 'i';
  • 53.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.53 BTREE INDEX IMPROVEMENTS: RESULTS Version Index on “filler” Index on “aid” v11 (initial) 1089 MB 214 MB v11 (final) 1204 MB 240 MB v12beta (initial) 1091 MB (+0.1%) 214 MB (+0.0%) v12beta (final) 1118 MB (-7.2%) 214 MB (-10.9%)
  • 54.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.54 REINDEX CONCURRENTLY REINDEX takes ShareLock on table and AccessExclusiveLock on index, blocking basically all access to the table – everything except prepared queries that don’t use the index in question.
  • 55.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.55 REINDEX CONCURRENTLY REINDEX takes ShareLock on table and AccessExclusiveLock on index, blocking basically all access to the table – everything except prepared queries that don’t use the index in question. REINDEX CONCURRENTLY takes ShareUpdateExclusiveLock on both table and index, permitting concurrent reads and writes.
  • 56.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.56 REINDEX CONCURRENTLY REINDEX takes ShareLock on table and AccessExclusiveLock on index, blocking basically all access to the table – everything except prepared queries that don’t use the index in question. REINDEX CONCURRENTLY takes ShareUpdateExclusiveLock on both table and index, permitting concurrent reads and writes. Similar to DROP INDEX CONCURRENTLY + CREATE INDEX CONCURRENTLY.
  • 57.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.57 REINDEX CONCURRENTLY REINDEX takes ShareLock on table and AccessExclusiveLock on index, blocking basically all access to the table – everything except prepared queries that don’t use the index in question. REINDEX CONCURRENTLY takes ShareUpdateExclusiveLock on both table and index, permitting concurrent reads and writes. Similar to DROP INDEX CONCURRENTLY + CREATE INDEX CONCURRENTLY. Waits for concurrent transactions to end, twice.
  • 58.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.58 REINDEX CONCURRENTLY REINDEX takes ShareLock on table and AccessExclusiveLock on index, blocking basically all access to the table – everything except prepared queries that don’t use the index in question. REINDEX CONCURRENTLY takes ShareUpdateExclusiveLock on both table and index, permitting concurrent reads and writes. Similar to DROP INDEX CONCURRENTLY + CREATE INDEX CONCURRENTLY. Waits for concurrent transactions to end, twice. Watch out for invalid indexes if fails or is interrupted.
  • 59.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.59 CREATE INDEX PROGRESS REPORTING (1/2) -[ RECORD 1 ]------+------------------------------- pid | 66541 datid | 16384 datname | rhaas relid | 23914 index_relid | 0 command | CREATE INDEX phase | building index: scanning table lockers_total | 0 lockers_done | 0 current_locker_pid | 0 blocks_total | 1639345 blocks_done | 523774 tuples_total | 0 tuples_done | 0 partitions_total | 0 partitions_done | 0
  • 60.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.60 CREATE INDEX PROGRESS REPORTING (2/2) -[ RECORD 1 ]------+------------------------------- pid | 66541 datid | 16384 datname | rhaas relid | 23914 index_relid | 0 command | CREATE INDEX phase | building index: loading tuples in tree lockers_total | 0 lockers_done | 0 current_locker_pid | 0 blocks_total | 0 blocks_done | 0 tuples_total | 100000000 tuples_done | 10409041 partitions_total | 0 partitions_done | 0
  • 61.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.61 GiST and SP-GiST Indexes • GiST indexes now support INCLUDE columns. • SP-GiST indexes now support K-nearest-neighbor searches. • GiST, GIN, and SP-GiST indexes now generate less WAL during index creation. • VACUUM of GiST indexes is now more efficient and can recycle empty leaf pages.
  • 62.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.62 QUERY PLANNER
  • 63.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.63 PLAN CACHE MODE • Prepared queries can be handled in two ways.  Strategy #1: Replan the query each time it’s executed for the particular parameter values in use. (“custom plan”)  Strategy #2: Create a plan that will work with any parameter values and reuse it. (“generic plan”)
  • 64.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.64 PLAN CACHE MODE • Prepared queries can be handled in two ways.  Strategy #1: Replan the query each time it’s executed for the particular parameter values in use. (“custom plan”)  Strategy #2: Create a plan that will work with any parameter values and reuse it. (“generic plan”) • By default, PostgreSQL will try to adaptively pick the best strategy.
  • 65.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.65 PLAN CACHE MODE • If you know better, you can set plan_cache_mode.  Typical use: Force custom plans, because the generic plans are worse than the planner thinks.  Possible use: Don’t waste any planning time trying to create worthless custom plans.
  • 66.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.66 SUPPORT FUNCTIONS FOR SQL FUNCTIONS • v12: • rhaas=# explain select * from generate_series(1, 437218) g; QUERY PLAN ---------------------------- -------------------------- • Function Scan on generate_series g (cost=0.00..4372.18 rows=437218 width=4)
  • 67.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.67 SQL FEATURES
  • 68.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.68 SUPPORT FUNCTIONS FOR SQL FUNCTIONS • v11: • rhaas=# EXPLAIN SELECT * FROM generate_series(1, 437218) g; • QUERY PLAN • ------------------------------------------------------ • Function Scan on generate_series g (cost=0.00..10.00 rows=1000 width=4)
  • 69.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.69 SUPPORT FUNCTIONS FOR SQL FUNCTIONS • v12: rhaas=# EXPLAIN SELECT * FROM generate_series(1, 437218) g; QUERY PLAN ------------------------------ ------------------------ Function Scan on generate_series g (cost=0.00..4372.18 rows=437218 width=4)
  • 70.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.70 GENERATED COLUMNS • rhaas=# CREATE TABLE gce (a int, b int, c int GENERATED ALWAYS AS(a + b) stored);
  • 71.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.71 GENERATED COLUMNS • rhaas=# CREATE TABLE gce (a int, b int, c int GENERATED ALWAYS AS(a + b) stored); • Column c can’t be manually updated.
  • 72.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.72 GENERATED COLUMNS • rhaas=# CREATE TABLE gce (a int, b int, c int GENERATED ALWAYS AS(a + b) stored); • Column c can’t be manually updated. • It will be recomputed after every INSERT/UPDATE.
  • 73.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.73 GENERATED COLUMNS • rhaas=# CREATE TABLE gce (a int, b int, c int GENERATED ALWAYS AS(a + b) stored); • Column c can’t be manually updated. • It will be recomputed after every INSERT/UPDATE. • Easier (but not necessarily faster) than a TRIGGER.
  • 74.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.74 OTHER FEATURES
  • 75.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.75 R.I.P. TO RECOVERY.CONF • Finally…
  • 76.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.76 R.I.P. TO RECOVERY.CONF • Finally… • PostgreSQL now throws an error if recovery.conf is found.
  • 77.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.77 R.I.P. TO RECOVERY.CONF • Finally… • PostgreSQL now throws an error if recovery.conf is found. • (Almost) everything is moved into postgresql.conf
  • 78.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.78 R.I.P. TO RECOVERY.CONF • Finally… • PostgreSQL now throws an error if recovery.conf is found. • (Almost) everything is moved into postgresql.conf • No more standby_mode
  • 79.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.79 R.I.P. TO RECOVERY.CONF • Finally… • PostgreSQL now throws an error if recovery.conf is found. • (Almost) everything is moved into postgresql.conf • No more standby_mode • recovery_target_timeline=latest by default
  • 80.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.80 R.I.P. TO RECOVERY.CONF • Settings previously stored in recovery.conf are now in postgresql.conf
  • 81.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.81 R.I.P. TO RECOVERY.CONF • Settings previously stored in recovery.conf are now in postgresql.conf • Use recovery.signal or standby.signal to trigger recovery or standby mode
  • 82.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.82 R.I.P. TO RECOVERY.CONF • Settings previously stored in recovery.conf are now in postgresql.conf • Use recovery.signal or standby.signal to trigger recovery or standby mode • Your backup management tool (or scripts) will likely need an update.
  • 83.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.83 R.I.P. TO RECOVERY.CONF • Settings previously stored in recovery.conf are now in postgresql.conf • Use recovery.signal or standby.signal to trigger recovery or standby mode • Your backup management tool (or scripts) will likely need an update. • A few recovery-related parameters can now be changed without restarting the server: archive_cleanup_command, promote_trigger_file, recovery_end_command, and recovery_min_apply_delay.
  • 84.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.84 R.I.P. TO RECOVERY.CONF • trigger_file → promote_trigger_file • pg_basebackup -R appends to postgresql.conf • A reload is enough for these parameters now: • archive_cleanup_command • promote_trigger_file • recovery_end_command • recovery_min_apply_delay;
  • 85.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.85 ENABLE OR DISABLE CHECKSUMS OFFLINE [rhaas ~]$ pg_ctl stop waiting for server to shut down.... done server stopped [rhaas ~]$ time pg_checksums -e Checksum operation completed Files scanned: 6289 Blocks scanned: 10080538 pg_checksums: syncing data directory pg_checksums: updating control file Checksums enabled in cluster real 2m42.120s user 0m20.674s sys 1m30.388s [rhaas ~]$ du -hs $PGDATA 87G /Users/rhaas/pgdata
  • 86.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.86 TABLE ACCESS METHODS • PostgreSQL can now support multiple table storage formats, just as we have for years been able to support multiple index formats (hash, btree, gist, etc.).
  • 87.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.87 TABLE ACCESS METHODS • PostgreSQL can now support multiple table storage formats, just as we have for years been able to support multiple index formats (hash, btree, gist, etc.). • Currently, the only in-core table storage method is ‘heap’.
  • 88.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.88 TABLE ACCESS METHODS • PostgreSQL can now support multiple table storage formats, just as we have for years been able to support multiple index formats (hash, btree, gist, etc.). • Currently, the only in-core table storage method is ‘heap’. • Expect more choices in a year or two.
  • 89.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.89 TABLE ACCESS METHODS • PostgreSQL can now support multiple table storage formats, just as we have for years been able to support multiple index formats (hash, btree, gist, etc.). • Currently, the only in-core table storage method is ‘heap’. • Expect more choices in a year or two. • Support for hidden OID columns removed.
  • 90.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.90 SOME OTHER STUFF • GSSAPI encryption support • Progress reporting for CLUSTER and VACUUM FULL • SERIALIZABLE for parallel query
  • 91.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.91 SOME OTHER STUFF • pg_upgrade can use filesystem cloning. • Unified logging framework for client tools, including colorization support.
  • 92.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.92 SOME OTHER STUFF • Avoid some rewrites in “ALTER TABLE … SET DATA TYPE timestamp” • When the timezone is UTC, timestamptz and timestamp are binary coercible, avoid the table rewrite, and continue to needlessly rewrite any index on an affected column.
  • 93.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.93 SOME OTHER STUFF • Log PostgreSQL version number on startup  2019-03-14 11:33:39.842 CET [7829] LOG: starting PostgreSQL 12devel on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2), 64-bit  2019-03-14 11:33:39.842 CET [7829] LOG: listening on IPv4 address "127.0.0.1", port 5412  2019-03-14 11:33:39.916 CET [7829] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5412"  2019-03-14 11:33:40.059 CET [7829] LOG: listening on Unix socket "/tmp/.s.PGSQL.5412"
  • 94.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.94 SOME OTHER STUFF • Allow COPY FROM to filter data using WHERE conditions  Extends the COPY FROM command with a WHERE condition, which allows doing various types of filtering while importing the data (random sampling, condition on a data column, etc.).  Low overhead
  • 95.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.95 SOME OTHER STUFF • Allow COPY FROM to filter data using WHERE conditions  Extends the COPY FROM command with a WHERE condition, which allows doing various types of filtering while importing the data (random sampling, condition on a data column, etc.).  Low overhead • pg_upgrade: --socketdir option  This allows control of the directory in which the postmaster sockets are created for the temporary postmasters started by pg_upgrade  Useful for long path names.
  • 96.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.96 SOME OTHER STUFF • Do not log empty incomplete startup packet • Change "checkpoint starting" message to use "wal"
  • 97.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.97 SOME OTHER STUFF • pg_stat_statements_reset can now reset statistics specific to a particular user/db/query.  Now, it can discard the statistics gathered so far by pg_stat_statements corresponding to the specified userid, dbid, and queryid.  If no parameter is specified or all the specified parameters have default value 0, it will discard all statistics as per the old behavior.
  • 98.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.98 ENTERPRISEDB POSTGRES ADVANCED SERVERWhat is new in v12?
  • 99.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved.99 WHAT IS NEW IN ADVANCED SERVER 12? • Interval Partitioning • Compound Triggers • MEDIAN, LISTAGG • CAST(MULTISET) • System View Improvements
  • 100.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved. QUESTIONS & DISCUSSION 100
  • 101.
    CONFIDENTIAL © CopyrightEnterpriseDB Corporation, 2019. All rights reserved. THANK YOU info@enterprisedb.com www.enterprisedb.com 101