POSTGRESQL QUERY PERFORMANCE INSIGHTS
Hamid Quddus Akhtar
Technical Product Manager - PostgreSQL
Percona
Keeping Open Source Open
© 2021 Percona | Confidential
About Myself
2
© 2021 Percona
© 2021 Percona | Confidential
Contacts
3
© 2021 Percona
© 2021 Percona | Confidential
Presentation Outline
4
© 2021 Percona
© 2021 Percona | Confidential
Initial Thoughts
© 2021 Percona | Confidential
Observing Query Performance - Overview
6
© 2021 Percona
© 2021 Percona | Confidential
EXPLAIN and ANALYZE…
© 2021 Percona | Confidential
Components of Query Processing
8
© 2021 Percona
© 2021 Percona | Confidential
EXPLAIN - Basics
9
regression=# EXPLAIN SELECT * FROM tenk1;
QUERY PLAN
-------------------------------------------------------------
Seq Scan on tenk1 (cost=0.00..445.00 rows=10000 width=244)
(1 row)
© 2021 Percona
© 2021 Percona | Confidential
EXPLAIN - Basics: Costs
10
© 2021 Percona
© 2021 Percona | Confidential
EXPLAIN - Basics: Example
11
regression=# EXPLAIN SELECT *
regression-# FROM tenk1 t1, tenk2 t2
regression-# WHERE t1.unique1 < 10 AND t2.unique2 < 10 AND t1.hundred < t2.hundred;
QUERY PLAN
---------------------------------------------------------------------------------------------
Nested Loop (cost=4.65..49.36 rows=33 width=488)
Join Filter: (t1.hundred < t2.hundred)
-> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.38 rows=10 width=244)
Recheck Cond: (unique1 < 10)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..4.36 rows=10 width=0)
Index Cond: (unique1 < 10)
-> Materialize (cost=0.29..8.51 rows=10 width=244)
-> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..8.46 rows=10 width=244)
Index Cond: (unique2 < 10)
(9 rows)
© 2021 Percona
© 2021 Percona | Confidential
EXPLAIN - Basics: Nodes
12
© 2021 Percona
© 2021 Percona | Confidential
EXPLAIN ANALYZE - Basics
13
regression=# EXPLAIN ANALYZE SELECT * FROM tenk1;
QUERY PLAN
------------------------------------------------------------------------------------------------------------
Seq Scan on tenk1 (cost=0.00..445.00 rows=10000 width=244) (actual time=1.777..18.050 rows=10000 loops=1)
Planning Time: 0.248 ms
Execution Time: 18.853 ms
(3 rows)
© 2021 Percona
© 2021 Percona | Confidential
EXPLAIN ANALYZE - Basics
14
© 2021 Percona
© 2021 Percona | Confidential
The Tools
© 2021 Percona | Confidential
The Tools
16
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_activity
© 2021 Percona | Confidential
pg_stat_activity
18
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_activity: Take Aways
19
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_statements
© 2021 Percona | Confidential
pg_stat_statements
21
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_statements View
22
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_statements View
23
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_statements_info
24
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_statements View Example
a
* Query and data copied from PostgreSQL documentation for pg_stat_statements and adopted for the example.
25
bench=# \x
bench=# SELECT query, calls, total_exec_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 2;
-[ RECORD 1 ]---+--------------------------------------------------------------------
query | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2
calls | 3000
total_exec_time | 25565.855387
rows | 3000
hit_percent | 100.0000000000000000
-[ RECORD 2 ]---+--------------------------------------------------------------------
query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2
calls | 3000
total_exec_time | 271.232977
rows | 3000
hit_percent | 98.8454011741682975
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_statements - Challenges
26
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_statements - Challenges
27
© 2021 Percona
© 2021 Percona | Confidential
auto_explain
© 2021 Percona | Confidential
auto_explain Extension
29
© 2021 Percona
© 2021 Percona | Confidential
auto_explain Extension
30
© 2021 Percona
© 2021 Percona | Confidential
pgbadger
https://github.com/darold/pgbadger
© 2021 Percona | Confidential
pgbadger Tool
32
© 2021 Percona
© 2021 Percona | Confidential
pgbadger Statistics
33
© 2021 Percona
© 2021 Percona | Confidential
pgbadger - HTML Report
34
© 2021 Percona
© 2021 Percona | Confidential
pgbadger Challenges
35
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_monitor
https://github.com/percona/pg_stat_monitor
© 2021 Percona | Confidential
pg_stat_monitor Extension
37
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_monitor Extension
38
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_monitor View
39
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_monitor View
40
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_monitor - Histogram
41
© 2021 Percona
© 2021 Percona | Confidential
pg_stat_monitor
42
© 2021 Percona
© 2021 Percona | Confidential
Summarizing
© 2021 Percona | Confidential
Tools for the Use Case
44
© 2021 Percona
© 2021 Percona | Confidential
Tools for the Use Case
45
© 2021 Percona
© 2021 Percona | Confidential
Tools for the Use Case
46
© 2021 Percona
© 2021 Percona | Confidential
Percona stands for evolution
Percona stands for ease-of-use
Percona stands for freedom
Percona & PostgreSQL - Better Together
© 2021 Percona | Confidential
© 2021 Percona | Confidential
If you have 30 mins, I’d love to talk to you about PostgreSQL.
© 2021 Percona | Confidential
Thank you!
Questions?
© 2021 Percona | Confidential