SlideShare a Scribd company logo
Performance Enhancements in
       PostgreSQL 8.4
        Magnus Hagander
         Redpill Linpro AB
        PostgreSQL Europe
PostgreSQL 8.4
●   Released July 2009
    ●   8.4.1 released September 2009
●   Major upgrade from 8.3
●   New features and enhancements of
    existing ones
Using PostgreSQL performance
●   “ORM-like queries” only get you so far
●   Application specific optimizations
●   Don't be afraid to let the database
    work!
Performance enhancements
●   Some are application transparent
    ●   Possibly even DBA transparent
●   Some require application changes
Let's get started
●   Query execution optimizations
Anti-joins and Semi-joins
●   Formalized JOIN methods for
    inequality joins
●   Better performance for EXISTS / NOT
    EXISTS
Anti-joins and Semi-joins
●   8.3
pagila=# EXPLAIN SELECT * FROM actor a WHERE NOT EXISTS
   (SELECT * FROM film_actor fa WHERE fa.actor_id=a.actor_id);
 Seq Scan on actor (cost=0.00..288.99 rows=100 width=25)
   Filter: (NOT (subplan))
   SubPlan
     -> Index Scan using film_actor_pkey on film_actor
            (cost=0.00..38.47 rows=27 width=12)
           Index Cond: (actor_id = $0)
Anti-joins and Semi-joins
●   8.3
pagila=# EXPLAIN SELECT * FROM actor a WHERE NOT EXISTS
   (SELECT * FROM film_actor fa WHERE fa.actor_id=a.actor_id);
 Nested Loop Anti Join (cost=0.00..30.57 rows=1 width=25)
   -> Seq Scan on actor (cost=0.00..4.00 rows=200 width=25)
   -> Index Scan using film_actor_pkey on film_actor
           (cost=0.00..1.54 rows=27 width=2)
         Index Cond: (film_actor.actor_id = actor.actor_id)
Anti-joins and Semi-joins
●   8.3
pagila=# EXPLAIN SELECT * FROM actor a WHERE EXISTS
   (SELECT * FROM film_actor fa WHERE fa.actor_id=a.actor_id);
 Nested Loop Semi Join (cost=0.00..30.57 rows=200 width=25)
   -> Seq Scan on actor (cost=0.00..4.00 rows=200 width=25)
   -> Index Scan using film_actor_pkey on film_actor
           (cost=0.00..1.54 rows=27 width=2)
         Index Cond: (film_actor.actor_id = actor.actor_id)
Hash for DISTINCT/UNION
●   Previously, always a sort+unique
●   No longer guaranteed sorted!
    ●   Add ORDER BY
    ●   Both plans will be considered
●   Also affects EXCEPT & INTERSECT
Hash improvements
●   Faster algorithms
●   Also faster hash indexes
    ●   Still not WAL-logged
●   And optimizations of HASH joins
    ●   Particularly around large joins
Moving on
●   DBA optimizations
Function level statistics
●   pg_stat_user_functions
●   Controlled by “track_functions”
    ●   none, pl or all
●   Tracks calls, time, and internal time
postgres=# select * from pg_stat_user_functions ;
-[ RECORD 1 ]------
funcid     | 101414
schemaname | public
funcname   | foo
calls      | 1003
total_time | 6
self_time | 6
Free Space Map (FSM)
●   Stores list of free blocks in relations
    ●   Caused by DELETE and UPDATE
●   Used by INSERT & UPDATE
New Free Space Map (FSM)
●   No more max_fsm_pages!
●   Dynamically tuned
●   Uses normal buffer cache
New Free Space Map (FSM)
●   No global lock
●   Not lost on crash
New Free Space Map (FSM)
●   No global lock
●   Not lost on crash


●   VACUUM is still needed, of course...
Visibility Map
●   Tracks pages that are “visible to all
    transactions” in bitmap
●   Set by VACUUM
●   Cleared by INSERT/UPDATE/DELETE
Partial VACUUM
●   “Visible to all” pages skipped by
    VACUUM
●   Only heap tables, not indexes
●   Still requires freezing
VACUUM snapshot tracking
●   Snapshot tracking for idle sessions
●   Makes VACUUM clean up better with
    long running transactions
●   <IDLE> In Transaction
Stats temp file improvements
●   Previously, unconditionally written
    twice/sec in data dir
●   Now, written only on demand
●   And in configurable location (tmpfs!)
Parallel pg_restore
●   Restore from dump was single
    threaded
●   Can now load in <n> sessions
●   At least one table per session
●   No single-transaction!
int8 pass by value
●   64-bit integers finally take advantage
    of 64-bit CPUs
Moving on
●   Application features
Subselects in LIMIT/OFFSET
●   Previously, only constants allowed
●   Required two queries / roundtrips
    ●   Or cursor in function
●   SELECT * FROM … LIMIT (
       SELECT something FROM other
    )
WINDOW aggregates
●   Perform aggregates over parts of
    data
●   Avoid requiring multiple queries
●   Avoid multiple scans
SELECT name, department, salary,
  rank() OVER (
    PARTITION BY department
    ORDER BY salary DESC
  )
FROM employees
name | department | salary | rank
-------+------------+--------+------
 Berra | Ekonomi    | 29400 |     1
 Åke   | Ekonomi    | 29400 |     1
 Sune | Ekonomi     | 24000 |     3
 Arne | IT          | 24000 |     1
 Pelle | IT         | 22000 |     2
 Kalle | IT         | 18000 |     3
(6 rows)
SELECT name, department, salary,
  rank() OVER (
    PARTITION BY department
    ORDER BY salary DESC
  ),
  rank() OVER (
    ORDER BY salary DESC)
FROM employees
Common Table Expressions
●   WITH RECURSIVE
●   Traverse trees and graphs in SQL
●   .. avoid multiple queries
    ●   (also makes your life easier)
WITH RECURSIVE t(id, department, name, manager) AS
(
   SELECT id, department, name, manager
    FROM emp WHERE name='Kalle'
  UNION ALL
   SELECT emp.id,emp.department,emp.name,emp.manager
    FROM emp JOIN t ON t.manager=emp.id
)
SELECT * FROM t;
id | department | name | manager
----+------------+-------+---------
  1 | IT         | Kalle |       3
  3 | IT         | Arne |        5
  5 | Ekonomi    | Berra |
(3 rows)
id | department | name | manager
----+------------+-------+---------
  1 | IT         | Kalle |       3
  3 | IT         | Arne |        5
  5 | Ekonomi    | Berra |
(3 rows)



                 Very important!
Lots of more improvements!
●   But that's it for now..
●   Go download and test!
Questions?
       magnus@hagander.net

     Twitter: @magnushagander

      http://blog.hagander.net/

More Related Content

DOCX
Queries assignment udf_and_triggers
PPTX
SQL Keywords
PPT
Single row functions
PDF
TechEvent 2019: Uses of Row Pattern Matching; Kim Berg Hansen - Trivadis
PPTX
Assembly line balancing
DOC
Ramco C Question Paper 2003
Queries assignment udf_and_triggers
SQL Keywords
Single row functions
TechEvent 2019: Uses of Row Pattern Matching; Kim Berg Hansen - Trivadis
Assembly line balancing
Ramco C Question Paper 2003
Ad

Viewers also liked (6)

PPTX
Why PG deserves noSQL fans' respect
PPTX
Mongo db v3_deep_dive
PDF
Advanced Replication Internals
PDF
Mongo db3.0 wired_tiger_storage_engine
PDF
Postgre sql intro 0
PDF
Webinar slides: Become a MongoDB DBA - What to Monitor (if you’re really a My...
Why PG deserves noSQL fans' respect
Mongo db v3_deep_dive
Advanced Replication Internals
Mongo db3.0 wired_tiger_storage_engine
Postgre sql intro 0
Webinar slides: Become a MongoDB DBA - What to Monitor (if you’re really a My...
Ad

Similar to Performance Enhancements In Postgre Sql 8.4 (20)

PDF
Scaling MySQL Strategies for Developers
PPT
Explain that explain
PPTX
Sql analytic queries tips
PDF
Mysql query optimization
PDF
SQL: Query optimization in practice
KEY
10x improvement-mysql-100419105218-phpapp02
KEY
10x Performance Improvements
PPT
Phoenix h basemeetup
PDF
Optimizer features in recent releases of other databases
PDF
Modern query optimisation features in MySQL 8.
ODP
San diegophp
PDF
Quick Wins
PDF
Advanced query optimization
PDF
MySQL Indexing Crash Course
PDF
Postgres can do THAT?
PPTX
Building scalable application with sql server
PDF
Tech Talk - JPA and Query Optimization - publish
PDF
Microsoft SQL Server Filtered Indexes & Sparse Columns Feb 2011
PDF
MySQL Query Optimisation 101
PPTX
SQL Server 2012 Best Practices
Scaling MySQL Strategies for Developers
Explain that explain
Sql analytic queries tips
Mysql query optimization
SQL: Query optimization in practice
10x improvement-mysql-100419105218-phpapp02
10x Performance Improvements
Phoenix h basemeetup
Optimizer features in recent releases of other databases
Modern query optimisation features in MySQL 8.
San diegophp
Quick Wins
Advanced query optimization
MySQL Indexing Crash Course
Postgres can do THAT?
Building scalable application with sql server
Tech Talk - JPA and Query Optimization - publish
Microsoft SQL Server Filtered Indexes & Sparse Columns Feb 2011
MySQL Query Optimisation 101
SQL Server 2012 Best Practices

More from HighLoad2009 (20)

ODP
Krizhanovsky Vm
PPT
Eremkin Cboss Smsc Hl2009
PPTX
PPT
Kosmodemiansky
POTX
Scalaxy
PPT
Hl++2009 Ayakovlev Pochta
PPT
PPT
архитектура новой почты рамблера
ODP
PPT
Hl2009 1c Bitrix
PDF
Php Daemon
PPTX
Dz Java Hi Load 0.4
PDF
Highload Perf Tuning
PPT
Hl2009 Pr V2
PPTX
Highload2009
PPTX
особенности использования Times Ten In Memory Database в высоконагруженной среде
PPT
бегун
PPT
Hl Nekoval
PPTX
High Load 2009 Dimaa Rus Ready
PPTX
High Load 2009 Dimaa Rus Ready 16 9
Krizhanovsky Vm
Eremkin Cboss Smsc Hl2009
Kosmodemiansky
Scalaxy
Hl++2009 Ayakovlev Pochta
архитектура новой почты рамблера
Hl2009 1c Bitrix
Php Daemon
Dz Java Hi Load 0.4
Highload Perf Tuning
Hl2009 Pr V2
Highload2009
особенности использования Times Ten In Memory Database в высоконагруженной среде
бегун
Hl Nekoval
High Load 2009 Dimaa Rus Ready
High Load 2009 Dimaa Rus Ready 16 9

Performance Enhancements In Postgre Sql 8.4

  • 1. Performance Enhancements in PostgreSQL 8.4 Magnus Hagander Redpill Linpro AB PostgreSQL Europe
  • 2. PostgreSQL 8.4 ● Released July 2009 ● 8.4.1 released September 2009 ● Major upgrade from 8.3 ● New features and enhancements of existing ones
  • 3. Using PostgreSQL performance ● “ORM-like queries” only get you so far ● Application specific optimizations ● Don't be afraid to let the database work!
  • 4. Performance enhancements ● Some are application transparent ● Possibly even DBA transparent ● Some require application changes
  • 5. Let's get started ● Query execution optimizations
  • 6. Anti-joins and Semi-joins ● Formalized JOIN methods for inequality joins ● Better performance for EXISTS / NOT EXISTS
  • 7. Anti-joins and Semi-joins ● 8.3 pagila=# EXPLAIN SELECT * FROM actor a WHERE NOT EXISTS (SELECT * FROM film_actor fa WHERE fa.actor_id=a.actor_id); Seq Scan on actor (cost=0.00..288.99 rows=100 width=25) Filter: (NOT (subplan)) SubPlan -> Index Scan using film_actor_pkey on film_actor (cost=0.00..38.47 rows=27 width=12) Index Cond: (actor_id = $0)
  • 8. Anti-joins and Semi-joins ● 8.3 pagila=# EXPLAIN SELECT * FROM actor a WHERE NOT EXISTS (SELECT * FROM film_actor fa WHERE fa.actor_id=a.actor_id); Nested Loop Anti Join (cost=0.00..30.57 rows=1 width=25) -> Seq Scan on actor (cost=0.00..4.00 rows=200 width=25) -> Index Scan using film_actor_pkey on film_actor (cost=0.00..1.54 rows=27 width=2) Index Cond: (film_actor.actor_id = actor.actor_id)
  • 9. Anti-joins and Semi-joins ● 8.3 pagila=# EXPLAIN SELECT * FROM actor a WHERE EXISTS (SELECT * FROM film_actor fa WHERE fa.actor_id=a.actor_id); Nested Loop Semi Join (cost=0.00..30.57 rows=200 width=25) -> Seq Scan on actor (cost=0.00..4.00 rows=200 width=25) -> Index Scan using film_actor_pkey on film_actor (cost=0.00..1.54 rows=27 width=2) Index Cond: (film_actor.actor_id = actor.actor_id)
  • 10. Hash for DISTINCT/UNION ● Previously, always a sort+unique ● No longer guaranteed sorted! ● Add ORDER BY ● Both plans will be considered ● Also affects EXCEPT & INTERSECT
  • 11. Hash improvements ● Faster algorithms ● Also faster hash indexes ● Still not WAL-logged ● And optimizations of HASH joins ● Particularly around large joins
  • 12. Moving on ● DBA optimizations
  • 13. Function level statistics ● pg_stat_user_functions ● Controlled by “track_functions” ● none, pl or all ● Tracks calls, time, and internal time
  • 14. postgres=# select * from pg_stat_user_functions ; -[ RECORD 1 ]------ funcid | 101414 schemaname | public funcname | foo calls | 1003 total_time | 6 self_time | 6
  • 15. Free Space Map (FSM) ● Stores list of free blocks in relations ● Caused by DELETE and UPDATE ● Used by INSERT & UPDATE
  • 16. New Free Space Map (FSM) ● No more max_fsm_pages! ● Dynamically tuned ● Uses normal buffer cache
  • 17. New Free Space Map (FSM) ● No global lock ● Not lost on crash
  • 18. New Free Space Map (FSM) ● No global lock ● Not lost on crash ● VACUUM is still needed, of course...
  • 19. Visibility Map ● Tracks pages that are “visible to all transactions” in bitmap ● Set by VACUUM ● Cleared by INSERT/UPDATE/DELETE
  • 20. Partial VACUUM ● “Visible to all” pages skipped by VACUUM ● Only heap tables, not indexes ● Still requires freezing
  • 21. VACUUM snapshot tracking ● Snapshot tracking for idle sessions ● Makes VACUUM clean up better with long running transactions ● <IDLE> In Transaction
  • 22. Stats temp file improvements ● Previously, unconditionally written twice/sec in data dir ● Now, written only on demand ● And in configurable location (tmpfs!)
  • 23. Parallel pg_restore ● Restore from dump was single threaded ● Can now load in <n> sessions ● At least one table per session ● No single-transaction!
  • 24. int8 pass by value ● 64-bit integers finally take advantage of 64-bit CPUs
  • 25. Moving on ● Application features
  • 26. Subselects in LIMIT/OFFSET ● Previously, only constants allowed ● Required two queries / roundtrips ● Or cursor in function ● SELECT * FROM … LIMIT ( SELECT something FROM other )
  • 27. WINDOW aggregates ● Perform aggregates over parts of data ● Avoid requiring multiple queries ● Avoid multiple scans
  • 28. SELECT name, department, salary, rank() OVER ( PARTITION BY department ORDER BY salary DESC ) FROM employees
  • 29. name | department | salary | rank -------+------------+--------+------ Berra | Ekonomi | 29400 | 1 Åke | Ekonomi | 29400 | 1 Sune | Ekonomi | 24000 | 3 Arne | IT | 24000 | 1 Pelle | IT | 22000 | 2 Kalle | IT | 18000 | 3 (6 rows)
  • 30. SELECT name, department, salary, rank() OVER ( PARTITION BY department ORDER BY salary DESC ), rank() OVER ( ORDER BY salary DESC) FROM employees
  • 31. Common Table Expressions ● WITH RECURSIVE ● Traverse trees and graphs in SQL ● .. avoid multiple queries ● (also makes your life easier)
  • 32. WITH RECURSIVE t(id, department, name, manager) AS ( SELECT id, department, name, manager FROM emp WHERE name='Kalle' UNION ALL SELECT emp.id,emp.department,emp.name,emp.manager FROM emp JOIN t ON t.manager=emp.id ) SELECT * FROM t;
  • 33. id | department | name | manager ----+------------+-------+--------- 1 | IT | Kalle | 3 3 | IT | Arne | 5 5 | Ekonomi | Berra | (3 rows)
  • 34. id | department | name | manager ----+------------+-------+--------- 1 | IT | Kalle | 3 3 | IT | Arne | 5 5 | Ekonomi | Berra | (3 rows) Very important!
  • 35. Lots of more improvements! ● But that's it for now.. ● Go download and test!
  • 36. Questions? magnus@hagander.net Twitter: @magnushagander http://blog.hagander.net/