SlideShare a Scribd company logo
PostgreSQL 9.0 / Prolog




                      •   Want to play along?

                      •   PostgreSQL 9.0

                          •   git clone git://git.postgresql.org/git/postgresql.git

                          •   http://www.postgresql.org/docs/current/static/anoncvs.html

                          •   ./configure; make; make install;

                      •   Pagila Sample Database

                          •   http://pgfoundry.org/frs/?group_id=1000150&release_id=998




Thursday, April 8, 2010
No More Waiting
                   A Guide to PostgreSQL 9.0



                              / Presentation / Robert Treat



Thursday, April 8, 2010
Know More Waiting
                   A Guide to PostgreSQL 9.0



                              / Presentation / Robert Treat



Thursday, April 8, 2010
Know More Waiting
                   A Guide to Postgres 9.0



                               / Presentation / Robert Treat



Thursday, April 8, 2010
Postgres 9.0




                      •   Performance

                      •   Administration

                      •   Development

                      •   Procedures

                      •   Replication




Thursday, April 8, 2010
Postgres 9.0




                          BUT FIRST!




Thursday, April 8, 2010
Postgres 9.0 / Recap




Thursday, April 8, 2010
Postgres 9.0 / Recap




                      •   8.4 Released (2009-07-01)




Thursday, April 8, 2010
Postgres 9.0 / Recap




                      •   8.4 Released (2009-07-01)

                      •   Commit Fests (July,September,November,January)




Thursday, April 8, 2010
Postgres 9.0 / Recap




                      •   8.4 Released (2009-07-01)

                      •   Commit Fests (July,September,November,January)

                      •   Alpha Release after each Commit Fest




Thursday, April 8, 2010
Postgres 9.0 / Recap




                      •   8.4 Released (2009-07-01)

                      •   Commit Fests (July,September,November,January)

                      •   Alpha Release after each Commit Fest

                      •   Feature Freeze (February)




Thursday, April 8, 2010
Postgres 9.0 / Recap




                      •   8.4 Released (2009-07-01)

                      •   Commit Fests (July,September,November,January)

                      •   Alpha Release after each Commit Fest

                      •   Feature Freeze (February)

                      •   9.0 ?!?




Thursday, April 8, 2010
Postgres 9.0 / Recap




                      •   8.4 Released (2009-07-01)

                      •   Commit Fests (July,September,November,January)

                      •   Alpha Release after each Commit Fest

                      •   Feature Freeze (February)

                      •   9.0 ?!?

                      •   Beta (April?)




Thursday, April 8, 2010
Postgres 9.0 / Recap




                      •   8.4 Released (2009-07-01)

                      •   Commit Fests (July,September,November,January)

                      •   Alpha Release after each Commit Fest

                      •   Feature Freeze (February)

                      •   9.0 ?!?

                      •   Beta (April?)

                      •   Release (May ? June ? July)




Thursday, April 8, 2010
Postgres 9.0 / Stats




Thursday, April 8, 2010
Postgres 9.0 / Stats




                      •   New feature patches: 204




Thursday, April 8, 2010
Postgres 9.0 / Stats




                      •   New feature patches: 204

                          •   doesn’t include direct commits




Thursday, April 8, 2010
Postgres 9.0 / Stats




                      •   New feature patches: 204

                          •   doesn’t include direct commits

                      •   Submitters: 84




Thursday, April 8, 2010
Postgres 9.0 / Stats




                      •   New feature patches: 204

                          •   doesn’t include direct commits

                      •   Submitters: 84

                          •   doesn’t include committers




Thursday, April 8, 2010
Postgres 9.0 / Stats




                      •   New feature patches: 204

                          •   doesn’t include direct commits

                      •   Submitters: 84

                          •   doesn’t include committers

                      •   1860 files changed




Thursday, April 8, 2010
Postgres 9.0 / Stats




                      •   New feature patches: 204

                          •   doesn’t include direct commits

                      •   Submitters: 84

                          •   doesn’t include committers

                      •   1860 files changed

                          •   150951 insertions




Thursday, April 8, 2010
Postgres 9.0 / Stats




                      •   New feature patches: 204

                          •   doesn’t include direct commits

                      •   Submitters: 84

                          •   doesn’t include committers

                      •   1860 files changed

                          •   150951 insertions

                          •   82558 deletions




Thursday, April 8, 2010
Postgres 9.0




                      •   Performance

                      •   Administration

                      •   Development

                      •   Procedures

                      •   Replication




Thursday, April 8, 2010
Postgres 9.0 / Perf / vacuum full




Thursday, April 8, 2010
Postgres 9.0 / Perf / vacuum full


                      •   VACUUM FULL now works like CLUSTER

                          •   The Old

                              •   move rows around, heavy scans, bloat indexes

                              •   syntax available with VACUUM FULL INPLACE

                              •   still used for system catalogs




Thursday, April 8, 2010
Postgres 9.0 / Perf / vacuum full


                      •   VACUUM FULL now works like CLUSTER

                          •   The Old

                              •   move rows around, heavy scans, bloat indexes

                              •   syntax available with VACUUM FULL INPLACE

                              •   still used for system catalogs

                          •   NEW

                              •   rewrite table and indexes

                              •   ~ 2% less efficient for tables, 90% more efficient for indexes

                              •   1/3 the amount of time

                              •   continue to avoid it :-)




Thursday, April 8, 2010
Postgres 9.0 / Perf / vacuum full




Thursday, April 8, 2010
Postgres 9.0 / Perf / explain buffers

                                       explain can now show buffers information



          pagila=# explain (analyze, buffers) select * from actor;
                                                 QUERY PLAN
          ----------------------------------------------------------------------------------------------------
           Seq Scan on actor (cost=0.00..4.00 rows=200 width=25) (actual time=0.034..0.089 rows=200 loops=1)
             Buffers: shared read=2
          Total runtime: 0.149 ms
          (3 rows)

          pagila=# explain (analyze, buffers) select count(*) from actor;
                                                  QUERY PLAN
          ---------------------------------------------------------------------------------------------------------
           Aggregate (cost=4.50..4.51 rows=1 width=0) (actual time=0.109..0.109 rows=1 loops=1)
             Buffers: shared hit=2
             -> Seq Scan on actor (cost=0.00..4.00 rows=200 width=0) (actual time=0.010..0.048 rows=200 loops=1)
                  Buffers: shared hit=2
          Total runtime: 0.173 ms
          (5 rows)




Thursday, April 8, 2010
Postgres 9.0 / Perf / index not null

                                    support index use for IS NOT NULL

             PostgreSQL 8.4

          pagila=# explain select * from address where address2 is not null;
                                 QUERY PLAN
          ---------------------------------------------------------
           Seq Scan on address (cost=0.00..20.03 rows=1 width=70)
             Filter: (address2 IS NOT NULL)
          (2 rows)




             PostgreSQL 9.0 Alpha 4

          pagila=# explain select * from address where address2 is not null;
                                                QUERY PLAN
          -------------------------------------------------------------------------------------
           Index Scan using address_address2_idx on address (cost=0.00..8.27 rows=1 width=70)
             Index Cond: (address2 IS NOT NULL)
          (2 rows)




Thursday, April 8, 2010
Postgres 9.0 / Perf / join removal

                              remove joins from execution plan where not needed



           PostgreSQL 9.0 Alpha 4

          pagila=# explain analyze select actor.last_name from actor left join film_actor using (actor_id) where
          actor.last_update > current_date;
                                                        QUERY PLAN
          ------------------------------------------------------------------------------------------------------
           Nested Loop Left Join (cost=4.46..38.48 rows=27 width=35) (actual time=0.258..0.258 rows=0 loops=1)
             -> Seq Scan on actor (cost=0.00..5.50 rows=1 width=25) (actual time=0.257..0.257 rows=0 loops=1)
                   Filter: (last_update > ('now'::text)::date)
             -> Bitmap Heap Scan on film_actor (cost=4.46..32.64 rows=27 width=12) (never executed)
                   Recheck Cond: (actor.actor_id = film_actor.actor_id)
                   -> Bitmap Index Scan on film_actor_pkey (cost=0.00..4.45 rows=27 width=0) (never executed)
                         Index Cond: (actor.actor_id = film_actor.actor_id)
           Total runtime: 0.340 ms
          (8 rows)




                                                this is not join removal!



Thursday, April 8, 2010
Postgres 9.0 / Perf / join removal
              PostgreSQL 8.4

            pagila=# explain analyze select city from city left join country using (country_id) where city.last_update
            > current_date;
                                                           QUERY PLAN
            --------------------------------------------------------------------------------------------------------
             Nested Loop Left Join (cost=0.00..17.95 rows=1 width=9) (actual time=28.022..28.022 rows=0 loops=1)
               Join Filter: (city.country_id = country.country_id)
               -> Seq Scan on city (cost=0.00..14.50 rows=1 width=11) (actual time=28.021..28.021 rows=0 loops=1)
                     Filter: (last_update > ('now'::text)::date)
               -> Seq Scan on country (cost=0.00..2.09 rows=109 width=4) (never executed)
             Total runtime: 30.567 ms
            (6 rows)




              PostgreSQL 9.0 Alpha 4

            pagila=# explain analyze select city from city left join country using (country_id) where city.last_update
            > current_date;
                                                       QUERY PLAN
            ------------------------------------------------------------------------------------------------
             Seq Scan on city (cost=0.00..14.50 rows=1 width=11) (actual time=0.748..0.748 rows=0 loops=1)
               Filter: (last_update > ('now'::text)::date)
             Total runtime: 0.777 ms
            (3 rows)




Thursday, April 8, 2010
Postgres 9.0 / Perf / tablespace costs




Thursday, April 8, 2010
Postgres 9.0 / Perf / tablespace costs




                      •   Per Tablespace GUC Options

                          •   seq_page_cost

                          •   random_page_cost

                      •   ALTER TABLESPACE ... SET / RESET




Thursday, April 8, 2010
Postgres 9.0 / Perf / tablespace costs




Thursday, April 8, 2010
Postgres 9.0 / Perf / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0 / Perf / Wait, there’s more!




                      •   Increased GIN index creation for pre-ordered data

                      •   ALTER TABLE “rewrite” commands can skip xlogging

                      •   ALTER TABLE ... ALTER COLUMN ... SET DISTINCT

                      •   Optimize foo <> true => foo = false, foo <> false => foo = true

                      •   Improve pg_restore multi-workers logic for faster restores

                      •   Windows 64bit Support




Thursday, April 8, 2010
Postgres 9.0 / Perf / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0




                      •   Performance

                      •   Administration

                      •   Development

                      •   Procedures

                      •   Replication




Thursday, April 8, 2010
Postgres 9.0 / Admin / pg_ctl initdb


                                               initdb is dead (well, to me)




          sa-x:postgres rob$ pgsql90/bin/pg_ctl -D data/ initdb -o "--locale=en_US.UTF-8"
          The files belonging to this database system will be owned by user "rob".
          This user must also own the server process.

          The database cluster will be initialized with locale en_US.UTF-8.
          The default database encoding has accordingly been set to UTF8.
          The default text search configuration will be set to "english".
          ...




Thursday, April 8, 2010
Postgres 9.0 / Admin / grant all
                                  GRANT/REVOKE ON ALL object IN SCHEMA

          pagila=# create role dylan;
          CREATE ROLE
          pagila=# grant select on all tables in schema public to dylan;
          GRANT
          pagila=# select oid::regclass, relacl from pg_class where relkind='r' and relnamespace='2200';
                  oid       |                    relacl
          ------------------+----------------------------------------------
           film_actor       | {postgres=arwdDxt/postgres,dylan=r/postgres}
           payment_p2007_02 | {postgres=arwdDxt/postgres,dylan=r/postgres}
           payment_p2007_03 | {postgres=arwdDxt/postgres,dylan=r/postgres}
           city             | {postgres=arwdDxt/postgres,dylan=r/postgres}
           actor            | {postgres=arwdDxt/postgres,dylan=r/postgres}
           category         | {postgres=arwdDxt/postgres,dylan=r/postgres}
           film             | {postgres=arwdDxt/postgres,dylan=r/postgres}
           address          | {postgres=arwdDxt/postgres,dylan=r/postgres}
           store            | {postgres=arwdDxt/postgres,dylan=r/postgres}
           staff            | {postgres=arwdDxt/postgres,dylan=r/postgres}
           payment_p2007_04 | {postgres=arwdDxt/postgres,dylan=r/postgres}
           payment_p2007_05 | {postgres=arwdDxt/postgres,dylan=r/postgres}
           payment_p2007_06 | {postgres=arwdDxt/postgres,dylan=r/postgres}
           rental           | {postgres=arwdDxt/postgres,dylan=r/postgres}
           payment_p2007_01 | {postgres=arwdDxt/postgres,dylan=r/postgres}
           country          | {postgres=arwdDxt/postgres,dylan=r/postgres}
           payment          | {postgres=arwdDxt/postgres,dylan=r/postgres}
           film_category    | {postgres=arwdDxt/postgres,dylan=r/postgres}
           language         | {postgres=arwdDxt/postgres,dylan=r/postgres}
           customer         | {postgres=arwdDxt/postgres,dylan=r/postgres}
           inventory        | {postgres=arwdDxt/postgres,dylan=r/postgres}




Thursday, April 8, 2010
Postgres 9.0 / Admin / default privs

                                   ALTER DEFAULT PRIVILEGES




          pagila=# alter default privileges grant select on tables to dylan;
          ALTER DEFAULT PRIVILEGES
          pagila=# create table payment_p2007_07 () inherits (payment);
          CREATE TABLE
          pagila=# z payment_p2007_07
                                              Access privileges
           Schema |       Name        | Type |     Access privileges      | Column access
          privileges
          --------+------------------+-------+---------------------------
          +--------------------------
           public | payment_p2007_07 | table | postgres=arwdDxt/postgres+|
                  |                   |      | dylan=r/postgres           |
          (1 row)




Thursday, April 8, 2010
Postgres 9.0 / Admin / d for children



          pagila=# d payment
                                                    Table "public.payment"
              Column    |            Type             |                          Modifiers
          --------------+-----------------------------+-------------------------------------------------------------
           payment_id   | integer                     | not null default nextval('payment_payment_id_seq'::regclass)
           customer_id | smallint                     | not null
           staff_id     | smallint                    | not null
           rental_id    | integer                     | not null
           amount       | numeric(5,2)                | not null
           payment_date | timestamp without time zone | not null
          Indexes:
              "payment_pkey" PRIMARY KEY, btree (payment_id)
              "idx_fk_customer_id" btree (customer_id)
              "idx_fk_staff_id" btree (staff_id)
              "payment_rental_id_idx" btree (rental_id)
          Foreign-key constraints:
              "payment_customer_id_fkey" FOREIGN KEY (customer_id) REFERENCES customer(customer_id) ON UPDATE CASCADE ON DELETE RESTRICT
              "payment_rental_id_fkey" FOREIGN KEY (rental_id) REFERENCES rental(rental_id) ON UPDATE CASCADE ON DELETE SET NULL
              "payment_staff_id_fkey" FOREIGN KEY (staff_id) REFERENCES staff(staff_id) ON UPDATE CASCADE ON DELETE RESTRICT
          Rules:
           <snip>


          Number of child tables: 7 (Use d+ to list them.)




Thursday, April 8, 2010
Postgres 9.0 / Admin / d for children
          pagila=# d+ payment
                                                                          Table "public.payment"
              Column    |            Type             |                                    Modifiers                                       | Storage |
          Description
          --------------+-----------------------------+-------------------------------------------------------------
           payment_id   | integer                     | not null default nextval('payment_payment_id_seq'::regclass)                       |   plain   |
           customer_id | smallint                     | not null                                                                           |   plain   |
           staff_id     | smallint                    | not null                                                                           |   plain   |
           rental_id    | integer                     | not null                                                                           |   plain   |
           amount       | numeric(5,2)                | not null                                                                           |   main    |
           payment_date | timestamp without time zone | not null                                                                           |   plain   |
          Indexes:
              "payment_pkey" PRIMARY KEY, btree (payment_id)
              "idx_fk_customer_id" btree (customer_id)
              "idx_fk_staff_id" btree (staff_id)
              "payment_rental_id_idx" btree (rental_id)
          Foreign-key constraints:
              "payment_customer_id_fkey" FOREIGN KEY (customer_id) REFERENCES customer(customer_id) ON UPDATE CASCADE ON DELETE RESTRICT
              "payment_rental_id_fkey" FOREIGN KEY (rental_id) REFERENCES rental(rental_id) ON UPDATE CASCADE ON DELETE SET NULL
              "payment_staff_id_fkey" FOREIGN KEY (staff_id) REFERENCES staff(staff_id) ON UPDATE CASCADE ON DELETE RESTRICT
          Rules:
               <snip>

            Child tables: payment_p2007_01,
                        payment_p2007_02,
                        payment_p2007_03,
                        payment_p2007_04,
                        payment_p2007_05,
                        payment_p2007_06,
                        payment_p2007_07
          Has OIDs: no




Thursday, April 8, 2010
Postgres 9.0 / Admin / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0 / Admin / Wait, there’s more!


                      •   show value when unique
                                                           •   reindexing shared system
                          constraints are violated
                                                               catalogs is now crash safe
                      •   radius authentication
                                                           •   add ability to reset statistics
                                                               on individual tables
                      •   add SQLSTATE as option to
                          log_line_prefix
                                                           •   support samehost/samenet
                                                               options in pg_hba.conf
                      •   allow collection of statistics
                          on sequences
                                                           •   added string_agg function
                                                               (group_concat)
                      •   GUC can now be configured
                          based on user/database
                          combination                      •   improved tabular display for
                                                               psql rows with null data
                      •   log changes to postgresql.conf
                                                           •   add index methods to di
                          during reload




Thursday, April 8, 2010
Postgres 9.0 / Admin / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0




                      •   Performance

                      •   Administration

                      •   Development

                      •   Procedures

                      •   Replication




Thursday, April 8, 2010
Postgres 9.0 / Dev / conditional triggers


          CREATE TRIGGER notify_waiting_list

          AFTER UPDATE ON rental FOR EACH ROW

          WHEN NEW.return_date <> OLD.return_date

          THEN EXECUTE procedure send_notices();




                          •   improves control for execution of triggers

                          •   any boolean expression

                          •   shows up in d output

                          •   some after triggers will gain significant speed up




Thursday, April 8, 2010
Postgres 9.0 / Dev / conditional triggers

          CREATE TRIGGER film_fulltext_trigger

          BEFORE INSERT OR UPDATE of title, description

          ON FILM FOR EACH ROW EXECUTE PROCEDURE

          tsvector_update_trigger('fulltext', 'pg_catalog.english', 'title', 'description')




                          •   improves control for execution of triggers

                          •   shows up in d output

                          •   simplify code

                          •   trigger only fires based on column declaration in update clause




Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints



              This is not the same thing as constraint exclusion!




                          “Yes, we suck at naming things”
                                          - Magnus Hagander




Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints




Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints



                      •   Generic constraint infrastructure

                      •   UNIQUE constraints are like =

                          •   any indexable commutative operator

                      •   BETWEEN-rows constraint

                          •   each row can conflict with any other row in
                              the table




Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints




Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints




Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints



                          •   Examples:

                              •   non-overlapping time intervals

                                  •   calendars, scheduling, reservations

                              •   non-overlapping geometric shapes

                                  •   zoning




Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints




Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints




         Jeff Davis, “Not Just Unique”, Sat @ 2:30PM - 3:15PM


Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints



                          •   Examples:

                              •   non-overlapping time intervals

                                  •   calendars, scheduling, reservations

                              •   non-overlapping geometric shapes

                                  •   zoning



         Jeff Davis, “Not Just Unique”, Sat @ 2:30PM - 3:15PM


Thursday, April 8, 2010
Postgres 9.0 / Dev / exclusion constraints




         Jeff Davis, “Not Just Unique”, Sat @ 2:30PM - 3:15PM


Thursday, April 8, 2010
Postgres 9.0 / Dev / window functions

          pagila=# pagila=#       select date_trunc('week',payment_date), sum(avg(sum(amount))

          pagila-#        over (order by date_trunc('week', payment_date) rows between 1 preceding and 1 following)

          pagila-# from payment_p2007_04 group by date_trunc('week',payment_date) order by 1;

                  date_trunc        |       sum     |        avg

          ---------------------+---------+-----------------------

            2007-04-02 00:00:00 | 6562.62 | 7237.2300000000000000

            2007-04-09 00:00:00 | 7911.84 | 7611.8566666666666667

            2007-04-23 00:00:00 | 8361.11 | 7332.2800000000000000

            2007-04-30 00:00:00 | 5723.89 | 7042.5000000000000000

          (4 rows)




                                        •         enhancements to the frame clause

                                        •         now able to compute moving averages (easily)

                                        •         several options, check the docs!




Thursday, April 8, 2010
Postgres 9.0 / Dev / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0 / Dev / Wait, there’s more!




                      •   deferrable unique constraints

                      •   new bytea hex format output

                      •   hstore... more efficient, kv    •   drop if exists columns
                          storage
                                                          •   drop if exists constraints
                      •   show value when unique
                                                          •   ordered aggregates
                          constraints are violated

                      •   added string_agg function       •   rewrite listen/notify
                                                              (payloads)
                          (group_concat)

                      •   support SQL Standard
                          LIMIT/OFFSET




Thursday, April 8, 2010
Postgres 9.0 / Dev / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0




                      •   Performance

                      •   Administration

                      •   Development

                      •   Procedures

                      •   Replication




Thursday, April 8, 2010
Postgres 9.0 / Proc / by default




                          plpgsql is now created by default




Thursday, April 8, 2010
Postgres 9.0 / Proc / just DO it!


      pagila=#     DO $$
      pagila$#     DECLARE
      pagila$#       v_part record;
      pagila$#       v_sql text;
      pagila$#     BEGIN
      pagila$#       set search_path = 'public';
      pagila$#       for v_part in select tablename from pg_tables where tablename ~ 'payment' loop
      pagila$#         v_sql := 'create index '||v_part.tablename||'_rental_id_idx ON '||v_part.tablename||'(rental_id)';
      pagila$#         raise notice '%',v_sql;
      pagila$#         execute v_sql;
      pagila$#       end loop;
      pagila$#     END
      pagila$#     $$ language plpgsql;
      NOTICE:      create index payment_p2007_02_rental_id_idx ON payment_p2007_02(rental_id)
      NOTICE:      create index payment_p2007_03_rental_id_idx ON payment_p2007_03(rental_id)
      NOTICE:      create index payment_p2007_07_rental_id_idx ON payment_p2007_07(rental_id)
      NOTICE:      create index payment_p2007_04_rental_id_idx ON payment_p2007_04(rental_id)
      NOTICE:      create index payment_p2007_05_rental_id_idx ON payment_p2007_05(rental_id)
      NOTICE:      create index payment_p2007_06_rental_id_idx ON payment_p2007_06(rental_id)
      NOTICE:      create index payment_p2007_01_rental_id_idx ON payment_p2007_01(rental_id)
      NOTICE:      create index payment_rental_id_idx ON payment(rental_id)
      DO
      pagila=#




Thursday, April 8, 2010
Postgres 9.0 / Proc / just DO it!



             pagila=# di payment_p2007_0*rental*
                                            List of relations
              Schema |              Name              | Type | Owner     |      Table
             --------+--------------------------------+-------+----------+------------------
              public | payment_p2007_01_rental_id_idx | index | postgres | payment_p2007_01
              public | payment_p2007_02_rental_id_idx | index | postgres | payment_p2007_02
              public | payment_p2007_03_rental_id_idx | index | postgres | payment_p2007_03
              public | payment_p2007_04_rental_id_idx | index | postgres | payment_p2007_04
              public | payment_p2007_05_rental_id_idx | index | postgres | payment_p2007_05
              public | payment_p2007_06_rental_id_idx | index | postgres | payment_p2007_06
              public | payment_p2007_07_rental_id_idx | index | postgres | payment_p2007_07
             (7 rows)




Thursday, April 8, 2010
Postgres 9.0 / Proc / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0 / Proc / Wait, there’s more!


                      •   can now use expressions in
                          OPEN cursor FOR EXECUTE

                      •   improve variable recognition    •   use strict now works in plperl
                          within plpgsql
                                                          •   change Perl warnings to
                      •   allow assignment of values to       elog(WARNING)
                          IN parameters
                                                          •   Add Python 3 support
                      •   Allow MOVE FORWARD n/
                          ALL, MOVE BACKWARD n/           •   support for C++ stored procs
                          ALL for plpgsql cursors
                                                          •   named parameters
                      •   add utility functions for
                          plperl (quote_literal and
                          friends)




Thursday, April 8, 2010
Postgres 9.0 / Proc / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0




                      •   Performance

                      •   Administration

                      •   Procedures

                      •   Tools

                      •   Replication




Thursday, April 8, 2010
Postgres 9.0 / repl / hot standby




                      •   allows for queries against a database during crash recovery

                          •   aka pitr replication / xlog shipping

                      •   max_standby_delay




Thursday, April 8, 2010
Postgres 9.0 / repl / streaming replication




                      •   process to connect to master from slave, and “stream” changes to
                          slaves

                      •   multiple slaves

                      •   async process




Thursday, April 8, 2010
Postgres 9.0 / repl / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0 / repl / Wait, there’s more!




                      •   actually, there isn’t any more :-)




Thursday, April 8, 2010
Postgres 9.0 / repl / Wait, there’s more!




Thursday, April 8, 2010
Postgres 9.0




                      •   Performance

                      •   Administration

                      •   Procedures

                      •   Tools

                      •   Replication

                      •   Bonus Round!!




Thursday, April 8, 2010
Postgres 9.0 / Upgrades



                      •   dump / restore recommend

                      •   pg_migrator

                          •   8.3, 8.4, 9.0alpha/beta/rc

                      •   replication

                          •   ?

                      •   beware of incompatibilities

                          •   plpgsql variable compatibilities

                          •   read the release notes!




Thursday, April 8, 2010
Postgres 9.0 / Upgrades




                      •   Beware of incompatibilities

                          •   plpgsql variable conflicts

                          •   read the release notes!




Thursday, April 8, 2010
Postgres 9.0 / Testing


                          •   Download

                              •   9.0 Alpha 4 release

                              •   git, http://github.com/gregs1104/peg

                          •   Test

                              •   import existing schemas

                              •   import existing data

                              •   run application / code tests

                              •   test new features

                                  •   test pg_migrator




Thursday, April 8, 2010
Postgres 9.0 / More Info



                      •   http://www.depesz.com/

                      •   http://wiki.postgresql.org/

                      •   http://www.xzilla.net

                      •   PGEast, Philadelphia, PA, (Uh... right now)

                      •   PGCon, Ottawa, Canada, May 19th - 22nd




Thursday, April 8, 2010
Postgres 9.0 / Shout Out




                          •   Hubert Lubaczewski, aka “Depesz”

                          •   Magnus Hagander

                          •   Andreas Scherbaum

                          •   http://www.omniti.com




Thursday, April 8, 2010
Thank you for listening.



                            / Presentation



Thursday, April 8, 2010

More Related Content

Similar to A Guide To PostgreSQL 9.0 (20)

PDF
Intro to Postgres 9 Tutorial
Robert Treat
 
PDF
Intro to Postgres 8.4 Tutorial
Robert Treat
 
PDF
PostgreSQL Development Today: 9.0
PostgreSQL Experts, Inc.
 
PDF
Most Wanted: Future PostgreSQL Features
Peter Eisentraut
 
PDF
Check Please!
Robert Treat
 
PDF
Get to know PostgreSQL!
Oddbjørn Steffensen
 
PDF
PostgreSQL 9.0 & The Future
Aaron Thul
 
PDF
Pro Postgres 9
Robert Treat
 
PDF
Scaling with Postgres
elliando dias
 
PDF
8.4 Upcoming Features
PostgreSQL Experts, Inc.
 
PDF
PostgreSQL 9.4
Satoshi Nagayasu
 
PDF
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
Satoshi Nagayasu
 
PDF
What's New in PostgreSQL 9.6
EDB
 
PDF
The Essential PostgreSQL.conf
Robert Treat
 
PDF
What's New in Postgres 9.4
EDB
 
ODP
Introduction to PostgreSQL
Jim Mlodgenski
 
PDF
Scaling with Postgres (Robert Treat)
Ontico
 
PDF
Letters from the open source trenches - Postgres community
Selena Deckelmann
 
KEY
PostgreSQL
Reuven Lerner
 
PDF
PGConf APAC 2018 Keynote: PostgreSQL goes eleven
PGConf APAC
 
Intro to Postgres 9 Tutorial
Robert Treat
 
Intro to Postgres 8.4 Tutorial
Robert Treat
 
PostgreSQL Development Today: 9.0
PostgreSQL Experts, Inc.
 
Most Wanted: Future PostgreSQL Features
Peter Eisentraut
 
Check Please!
Robert Treat
 
Get to know PostgreSQL!
Oddbjørn Steffensen
 
PostgreSQL 9.0 & The Future
Aaron Thul
 
Pro Postgres 9
Robert Treat
 
Scaling with Postgres
elliando dias
 
8.4 Upcoming Features
PostgreSQL Experts, Inc.
 
PostgreSQL 9.4
Satoshi Nagayasu
 
PostgreSQL 9.4 and Beyond @ FOSSASIA 2015 Singapore
Satoshi Nagayasu
 
What's New in PostgreSQL 9.6
EDB
 
The Essential PostgreSQL.conf
Robert Treat
 
What's New in Postgres 9.4
EDB
 
Introduction to PostgreSQL
Jim Mlodgenski
 
Scaling with Postgres (Robert Treat)
Ontico
 
Letters from the open source trenches - Postgres community
Selena Deckelmann
 
PostgreSQL
Reuven Lerner
 
PGConf APAC 2018 Keynote: PostgreSQL goes eleven
PGConf APAC
 

More from Robert Treat (15)

PDF
Advanced Int->Bigint Conversions
Robert Treat
 
PDF
Explaining Explain
Robert Treat
 
PDF
the-lost-art-of-plpgsql
Robert Treat
 
PDF
Managing Chaos In Production: Testing vs Monitoring
Robert Treat
 
PDF
Postgres 9.4 First Look
Robert Treat
 
PDF
Less Alarming Alerts!
Robert Treat
 
PDF
Past, Present, and Pachyderm - All Things Open - 2013
Robert Treat
 
PDF
Big Bad "Upgraded" Postgres
Robert Treat
 
PDF
Managing Databases In A DevOps Environment
Robert Treat
 
PDF
Scaling with Postgres (Highload++ 2010)
Robert Treat
 
PDF
The Essential postgresql.conf
Robert Treat
 
PDF
PostgreSQL Partitioning, PGCon 2007
Robert Treat
 
ODP
Pro PostgreSQL, OSCon 2008
Robert Treat
 
PDF
Database Anti Patterns
Robert Treat
 
ODP
Pro PostgreSQL
Robert Treat
 
Advanced Int->Bigint Conversions
Robert Treat
 
Explaining Explain
Robert Treat
 
the-lost-art-of-plpgsql
Robert Treat
 
Managing Chaos In Production: Testing vs Monitoring
Robert Treat
 
Postgres 9.4 First Look
Robert Treat
 
Less Alarming Alerts!
Robert Treat
 
Past, Present, and Pachyderm - All Things Open - 2013
Robert Treat
 
Big Bad "Upgraded" Postgres
Robert Treat
 
Managing Databases In A DevOps Environment
Robert Treat
 
Scaling with Postgres (Highload++ 2010)
Robert Treat
 
The Essential postgresql.conf
Robert Treat
 
PostgreSQL Partitioning, PGCon 2007
Robert Treat
 
Pro PostgreSQL, OSCon 2008
Robert Treat
 
Database Anti Patterns
Robert Treat
 
Pro PostgreSQL
Robert Treat
 
Ad

Recently uploaded (20)

PDF
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
PDF
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PPTX
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
PPTX
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
PPTX
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Peak of Data & AI Encore AI-Enhanced Workflows for the Real World
Safe Software
 
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Ad

A Guide To PostgreSQL 9.0

  • 1. PostgreSQL 9.0 / Prolog • Want to play along? • PostgreSQL 9.0 • git clone git://git.postgresql.org/git/postgresql.git • http://www.postgresql.org/docs/current/static/anoncvs.html • ./configure; make; make install; • Pagila Sample Database • http://pgfoundry.org/frs/?group_id=1000150&release_id=998 Thursday, April 8, 2010
  • 2. No More Waiting A Guide to PostgreSQL 9.0 / Presentation / Robert Treat Thursday, April 8, 2010
  • 3. Know More Waiting A Guide to PostgreSQL 9.0 / Presentation / Robert Treat Thursday, April 8, 2010
  • 4. Know More Waiting A Guide to Postgres 9.0 / Presentation / Robert Treat Thursday, April 8, 2010
  • 5. Postgres 9.0 • Performance • Administration • Development • Procedures • Replication Thursday, April 8, 2010
  • 6. Postgres 9.0 BUT FIRST! Thursday, April 8, 2010
  • 7. Postgres 9.0 / Recap Thursday, April 8, 2010
  • 8. Postgres 9.0 / Recap • 8.4 Released (2009-07-01) Thursday, April 8, 2010
  • 9. Postgres 9.0 / Recap • 8.4 Released (2009-07-01) • Commit Fests (July,September,November,January) Thursday, April 8, 2010
  • 10. Postgres 9.0 / Recap • 8.4 Released (2009-07-01) • Commit Fests (July,September,November,January) • Alpha Release after each Commit Fest Thursday, April 8, 2010
  • 11. Postgres 9.0 / Recap • 8.4 Released (2009-07-01) • Commit Fests (July,September,November,January) • Alpha Release after each Commit Fest • Feature Freeze (February) Thursday, April 8, 2010
  • 12. Postgres 9.0 / Recap • 8.4 Released (2009-07-01) • Commit Fests (July,September,November,January) • Alpha Release after each Commit Fest • Feature Freeze (February) • 9.0 ?!? Thursday, April 8, 2010
  • 13. Postgres 9.0 / Recap • 8.4 Released (2009-07-01) • Commit Fests (July,September,November,January) • Alpha Release after each Commit Fest • Feature Freeze (February) • 9.0 ?!? • Beta (April?) Thursday, April 8, 2010
  • 14. Postgres 9.0 / Recap • 8.4 Released (2009-07-01) • Commit Fests (July,September,November,January) • Alpha Release after each Commit Fest • Feature Freeze (February) • 9.0 ?!? • Beta (April?) • Release (May ? June ? July) Thursday, April 8, 2010
  • 15. Postgres 9.0 / Stats Thursday, April 8, 2010
  • 16. Postgres 9.0 / Stats • New feature patches: 204 Thursday, April 8, 2010
  • 17. Postgres 9.0 / Stats • New feature patches: 204 • doesn’t include direct commits Thursday, April 8, 2010
  • 18. Postgres 9.0 / Stats • New feature patches: 204 • doesn’t include direct commits • Submitters: 84 Thursday, April 8, 2010
  • 19. Postgres 9.0 / Stats • New feature patches: 204 • doesn’t include direct commits • Submitters: 84 • doesn’t include committers Thursday, April 8, 2010
  • 20. Postgres 9.0 / Stats • New feature patches: 204 • doesn’t include direct commits • Submitters: 84 • doesn’t include committers • 1860 files changed Thursday, April 8, 2010
  • 21. Postgres 9.0 / Stats • New feature patches: 204 • doesn’t include direct commits • Submitters: 84 • doesn’t include committers • 1860 files changed • 150951 insertions Thursday, April 8, 2010
  • 22. Postgres 9.0 / Stats • New feature patches: 204 • doesn’t include direct commits • Submitters: 84 • doesn’t include committers • 1860 files changed • 150951 insertions • 82558 deletions Thursday, April 8, 2010
  • 23. Postgres 9.0 • Performance • Administration • Development • Procedures • Replication Thursday, April 8, 2010
  • 24. Postgres 9.0 / Perf / vacuum full Thursday, April 8, 2010
  • 25. Postgres 9.0 / Perf / vacuum full • VACUUM FULL now works like CLUSTER • The Old • move rows around, heavy scans, bloat indexes • syntax available with VACUUM FULL INPLACE • still used for system catalogs Thursday, April 8, 2010
  • 26. Postgres 9.0 / Perf / vacuum full • VACUUM FULL now works like CLUSTER • The Old • move rows around, heavy scans, bloat indexes • syntax available with VACUUM FULL INPLACE • still used for system catalogs • NEW • rewrite table and indexes • ~ 2% less efficient for tables, 90% more efficient for indexes • 1/3 the amount of time • continue to avoid it :-) Thursday, April 8, 2010
  • 27. Postgres 9.0 / Perf / vacuum full Thursday, April 8, 2010
  • 28. Postgres 9.0 / Perf / explain buffers explain can now show buffers information pagila=# explain (analyze, buffers) select * from actor; QUERY PLAN ---------------------------------------------------------------------------------------------------- Seq Scan on actor (cost=0.00..4.00 rows=200 width=25) (actual time=0.034..0.089 rows=200 loops=1) Buffers: shared read=2 Total runtime: 0.149 ms (3 rows) pagila=# explain (analyze, buffers) select count(*) from actor; QUERY PLAN --------------------------------------------------------------------------------------------------------- Aggregate (cost=4.50..4.51 rows=1 width=0) (actual time=0.109..0.109 rows=1 loops=1) Buffers: shared hit=2 -> Seq Scan on actor (cost=0.00..4.00 rows=200 width=0) (actual time=0.010..0.048 rows=200 loops=1) Buffers: shared hit=2 Total runtime: 0.173 ms (5 rows) Thursday, April 8, 2010
  • 29. Postgres 9.0 / Perf / index not null support index use for IS NOT NULL PostgreSQL 8.4 pagila=# explain select * from address where address2 is not null; QUERY PLAN --------------------------------------------------------- Seq Scan on address (cost=0.00..20.03 rows=1 width=70) Filter: (address2 IS NOT NULL) (2 rows) PostgreSQL 9.0 Alpha 4 pagila=# explain select * from address where address2 is not null; QUERY PLAN ------------------------------------------------------------------------------------- Index Scan using address_address2_idx on address (cost=0.00..8.27 rows=1 width=70) Index Cond: (address2 IS NOT NULL) (2 rows) Thursday, April 8, 2010
  • 30. Postgres 9.0 / Perf / join removal remove joins from execution plan where not needed PostgreSQL 9.0 Alpha 4 pagila=# explain analyze select actor.last_name from actor left join film_actor using (actor_id) where actor.last_update > current_date; QUERY PLAN ------------------------------------------------------------------------------------------------------ Nested Loop Left Join (cost=4.46..38.48 rows=27 width=35) (actual time=0.258..0.258 rows=0 loops=1) -> Seq Scan on actor (cost=0.00..5.50 rows=1 width=25) (actual time=0.257..0.257 rows=0 loops=1) Filter: (last_update > ('now'::text)::date) -> Bitmap Heap Scan on film_actor (cost=4.46..32.64 rows=27 width=12) (never executed) Recheck Cond: (actor.actor_id = film_actor.actor_id) -> Bitmap Index Scan on film_actor_pkey (cost=0.00..4.45 rows=27 width=0) (never executed) Index Cond: (actor.actor_id = film_actor.actor_id) Total runtime: 0.340 ms (8 rows) this is not join removal! Thursday, April 8, 2010
  • 31. Postgres 9.0 / Perf / join removal PostgreSQL 8.4 pagila=# explain analyze select city from city left join country using (country_id) where city.last_update > current_date; QUERY PLAN -------------------------------------------------------------------------------------------------------- Nested Loop Left Join (cost=0.00..17.95 rows=1 width=9) (actual time=28.022..28.022 rows=0 loops=1) Join Filter: (city.country_id = country.country_id) -> Seq Scan on city (cost=0.00..14.50 rows=1 width=11) (actual time=28.021..28.021 rows=0 loops=1) Filter: (last_update > ('now'::text)::date) -> Seq Scan on country (cost=0.00..2.09 rows=109 width=4) (never executed) Total runtime: 30.567 ms (6 rows) PostgreSQL 9.0 Alpha 4 pagila=# explain analyze select city from city left join country using (country_id) where city.last_update > current_date; QUERY PLAN ------------------------------------------------------------------------------------------------ Seq Scan on city (cost=0.00..14.50 rows=1 width=11) (actual time=0.748..0.748 rows=0 loops=1) Filter: (last_update > ('now'::text)::date) Total runtime: 0.777 ms (3 rows) Thursday, April 8, 2010
  • 32. Postgres 9.0 / Perf / tablespace costs Thursday, April 8, 2010
  • 33. Postgres 9.0 / Perf / tablespace costs • Per Tablespace GUC Options • seq_page_cost • random_page_cost • ALTER TABLESPACE ... SET / RESET Thursday, April 8, 2010
  • 34. Postgres 9.0 / Perf / tablespace costs Thursday, April 8, 2010
  • 35. Postgres 9.0 / Perf / Wait, there’s more! Thursday, April 8, 2010
  • 36. Postgres 9.0 / Perf / Wait, there’s more! • Increased GIN index creation for pre-ordered data • ALTER TABLE “rewrite” commands can skip xlogging • ALTER TABLE ... ALTER COLUMN ... SET DISTINCT • Optimize foo <> true => foo = false, foo <> false => foo = true • Improve pg_restore multi-workers logic for faster restores • Windows 64bit Support Thursday, April 8, 2010
  • 37. Postgres 9.0 / Perf / Wait, there’s more! Thursday, April 8, 2010
  • 38. Postgres 9.0 • Performance • Administration • Development • Procedures • Replication Thursday, April 8, 2010
  • 39. Postgres 9.0 / Admin / pg_ctl initdb initdb is dead (well, to me) sa-x:postgres rob$ pgsql90/bin/pg_ctl -D data/ initdb -o "--locale=en_US.UTF-8" The files belonging to this database system will be owned by user "rob". This user must also own the server process. The database cluster will be initialized with locale en_US.UTF-8. The default database encoding has accordingly been set to UTF8. The default text search configuration will be set to "english". ... Thursday, April 8, 2010
  • 40. Postgres 9.0 / Admin / grant all GRANT/REVOKE ON ALL object IN SCHEMA pagila=# create role dylan; CREATE ROLE pagila=# grant select on all tables in schema public to dylan; GRANT pagila=# select oid::regclass, relacl from pg_class where relkind='r' and relnamespace='2200'; oid | relacl ------------------+---------------------------------------------- film_actor | {postgres=arwdDxt/postgres,dylan=r/postgres} payment_p2007_02 | {postgres=arwdDxt/postgres,dylan=r/postgres} payment_p2007_03 | {postgres=arwdDxt/postgres,dylan=r/postgres} city | {postgres=arwdDxt/postgres,dylan=r/postgres} actor | {postgres=arwdDxt/postgres,dylan=r/postgres} category | {postgres=arwdDxt/postgres,dylan=r/postgres} film | {postgres=arwdDxt/postgres,dylan=r/postgres} address | {postgres=arwdDxt/postgres,dylan=r/postgres} store | {postgres=arwdDxt/postgres,dylan=r/postgres} staff | {postgres=arwdDxt/postgres,dylan=r/postgres} payment_p2007_04 | {postgres=arwdDxt/postgres,dylan=r/postgres} payment_p2007_05 | {postgres=arwdDxt/postgres,dylan=r/postgres} payment_p2007_06 | {postgres=arwdDxt/postgres,dylan=r/postgres} rental | {postgres=arwdDxt/postgres,dylan=r/postgres} payment_p2007_01 | {postgres=arwdDxt/postgres,dylan=r/postgres} country | {postgres=arwdDxt/postgres,dylan=r/postgres} payment | {postgres=arwdDxt/postgres,dylan=r/postgres} film_category | {postgres=arwdDxt/postgres,dylan=r/postgres} language | {postgres=arwdDxt/postgres,dylan=r/postgres} customer | {postgres=arwdDxt/postgres,dylan=r/postgres} inventory | {postgres=arwdDxt/postgres,dylan=r/postgres} Thursday, April 8, 2010
  • 41. Postgres 9.0 / Admin / default privs ALTER DEFAULT PRIVILEGES pagila=# alter default privileges grant select on tables to dylan; ALTER DEFAULT PRIVILEGES pagila=# create table payment_p2007_07 () inherits (payment); CREATE TABLE pagila=# z payment_p2007_07 Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+------------------+-------+--------------------------- +-------------------------- public | payment_p2007_07 | table | postgres=arwdDxt/postgres+| | | | dylan=r/postgres | (1 row) Thursday, April 8, 2010
  • 42. Postgres 9.0 / Admin / d for children pagila=# d payment Table "public.payment" Column | Type | Modifiers --------------+-----------------------------+------------------------------------------------------------- payment_id | integer | not null default nextval('payment_payment_id_seq'::regclass) customer_id | smallint | not null staff_id | smallint | not null rental_id | integer | not null amount | numeric(5,2) | not null payment_date | timestamp without time zone | not null Indexes: "payment_pkey" PRIMARY KEY, btree (payment_id) "idx_fk_customer_id" btree (customer_id) "idx_fk_staff_id" btree (staff_id) "payment_rental_id_idx" btree (rental_id) Foreign-key constraints: "payment_customer_id_fkey" FOREIGN KEY (customer_id) REFERENCES customer(customer_id) ON UPDATE CASCADE ON DELETE RESTRICT "payment_rental_id_fkey" FOREIGN KEY (rental_id) REFERENCES rental(rental_id) ON UPDATE CASCADE ON DELETE SET NULL "payment_staff_id_fkey" FOREIGN KEY (staff_id) REFERENCES staff(staff_id) ON UPDATE CASCADE ON DELETE RESTRICT Rules: <snip> Number of child tables: 7 (Use d+ to list them.) Thursday, April 8, 2010
  • 43. Postgres 9.0 / Admin / d for children pagila=# d+ payment Table "public.payment" Column | Type | Modifiers | Storage | Description --------------+-----------------------------+------------------------------------------------------------- payment_id | integer | not null default nextval('payment_payment_id_seq'::regclass) | plain | customer_id | smallint | not null | plain | staff_id | smallint | not null | plain | rental_id | integer | not null | plain | amount | numeric(5,2) | not null | main | payment_date | timestamp without time zone | not null | plain | Indexes: "payment_pkey" PRIMARY KEY, btree (payment_id) "idx_fk_customer_id" btree (customer_id) "idx_fk_staff_id" btree (staff_id) "payment_rental_id_idx" btree (rental_id) Foreign-key constraints: "payment_customer_id_fkey" FOREIGN KEY (customer_id) REFERENCES customer(customer_id) ON UPDATE CASCADE ON DELETE RESTRICT "payment_rental_id_fkey" FOREIGN KEY (rental_id) REFERENCES rental(rental_id) ON UPDATE CASCADE ON DELETE SET NULL "payment_staff_id_fkey" FOREIGN KEY (staff_id) REFERENCES staff(staff_id) ON UPDATE CASCADE ON DELETE RESTRICT Rules: <snip> Child tables: payment_p2007_01, payment_p2007_02, payment_p2007_03, payment_p2007_04, payment_p2007_05, payment_p2007_06, payment_p2007_07 Has OIDs: no Thursday, April 8, 2010
  • 44. Postgres 9.0 / Admin / Wait, there’s more! Thursday, April 8, 2010
  • 45. Postgres 9.0 / Admin / Wait, there’s more! • show value when unique • reindexing shared system constraints are violated catalogs is now crash safe • radius authentication • add ability to reset statistics on individual tables • add SQLSTATE as option to log_line_prefix • support samehost/samenet options in pg_hba.conf • allow collection of statistics on sequences • added string_agg function (group_concat) • GUC can now be configured based on user/database combination • improved tabular display for psql rows with null data • log changes to postgresql.conf • add index methods to di during reload Thursday, April 8, 2010
  • 46. Postgres 9.0 / Admin / Wait, there’s more! Thursday, April 8, 2010
  • 47. Postgres 9.0 • Performance • Administration • Development • Procedures • Replication Thursday, April 8, 2010
  • 48. Postgres 9.0 / Dev / conditional triggers CREATE TRIGGER notify_waiting_list AFTER UPDATE ON rental FOR EACH ROW WHEN NEW.return_date <> OLD.return_date THEN EXECUTE procedure send_notices(); • improves control for execution of triggers • any boolean expression • shows up in d output • some after triggers will gain significant speed up Thursday, April 8, 2010
  • 49. Postgres 9.0 / Dev / conditional triggers CREATE TRIGGER film_fulltext_trigger BEFORE INSERT OR UPDATE of title, description ON FILM FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('fulltext', 'pg_catalog.english', 'title', 'description') • improves control for execution of triggers • shows up in d output • simplify code • trigger only fires based on column declaration in update clause Thursday, April 8, 2010
  • 50. Postgres 9.0 / Dev / exclusion constraints This is not the same thing as constraint exclusion! “Yes, we suck at naming things” - Magnus Hagander Thursday, April 8, 2010
  • 51. Postgres 9.0 / Dev / exclusion constraints Thursday, April 8, 2010
  • 52. Postgres 9.0 / Dev / exclusion constraints • Generic constraint infrastructure • UNIQUE constraints are like = • any indexable commutative operator • BETWEEN-rows constraint • each row can conflict with any other row in the table Thursday, April 8, 2010
  • 53. Postgres 9.0 / Dev / exclusion constraints Thursday, April 8, 2010
  • 54. Postgres 9.0 / Dev / exclusion constraints Thursday, April 8, 2010
  • 55. Postgres 9.0 / Dev / exclusion constraints • Examples: • non-overlapping time intervals • calendars, scheduling, reservations • non-overlapping geometric shapes • zoning Thursday, April 8, 2010
  • 56. Postgres 9.0 / Dev / exclusion constraints Thursday, April 8, 2010
  • 57. Postgres 9.0 / Dev / exclusion constraints Jeff Davis, “Not Just Unique”, Sat @ 2:30PM - 3:15PM Thursday, April 8, 2010
  • 58. Postgres 9.0 / Dev / exclusion constraints • Examples: • non-overlapping time intervals • calendars, scheduling, reservations • non-overlapping geometric shapes • zoning Jeff Davis, “Not Just Unique”, Sat @ 2:30PM - 3:15PM Thursday, April 8, 2010
  • 59. Postgres 9.0 / Dev / exclusion constraints Jeff Davis, “Not Just Unique”, Sat @ 2:30PM - 3:15PM Thursday, April 8, 2010
  • 60. Postgres 9.0 / Dev / window functions pagila=# pagila=# select date_trunc('week',payment_date), sum(avg(sum(amount)) pagila-# over (order by date_trunc('week', payment_date) rows between 1 preceding and 1 following) pagila-# from payment_p2007_04 group by date_trunc('week',payment_date) order by 1; date_trunc | sum | avg ---------------------+---------+----------------------- 2007-04-02 00:00:00 | 6562.62 | 7237.2300000000000000 2007-04-09 00:00:00 | 7911.84 | 7611.8566666666666667 2007-04-23 00:00:00 | 8361.11 | 7332.2800000000000000 2007-04-30 00:00:00 | 5723.89 | 7042.5000000000000000 (4 rows) • enhancements to the frame clause • now able to compute moving averages (easily) • several options, check the docs! Thursday, April 8, 2010
  • 61. Postgres 9.0 / Dev / Wait, there’s more! Thursday, April 8, 2010
  • 62. Postgres 9.0 / Dev / Wait, there’s more! • deferrable unique constraints • new bytea hex format output • hstore... more efficient, kv • drop if exists columns storage • drop if exists constraints • show value when unique • ordered aggregates constraints are violated • added string_agg function • rewrite listen/notify (payloads) (group_concat) • support SQL Standard LIMIT/OFFSET Thursday, April 8, 2010
  • 63. Postgres 9.0 / Dev / Wait, there’s more! Thursday, April 8, 2010
  • 64. Postgres 9.0 • Performance • Administration • Development • Procedures • Replication Thursday, April 8, 2010
  • 65. Postgres 9.0 / Proc / by default plpgsql is now created by default Thursday, April 8, 2010
  • 66. Postgres 9.0 / Proc / just DO it! pagila=# DO $$ pagila$# DECLARE pagila$# v_part record; pagila$# v_sql text; pagila$# BEGIN pagila$# set search_path = 'public'; pagila$# for v_part in select tablename from pg_tables where tablename ~ 'payment' loop pagila$# v_sql := 'create index '||v_part.tablename||'_rental_id_idx ON '||v_part.tablename||'(rental_id)'; pagila$# raise notice '%',v_sql; pagila$# execute v_sql; pagila$# end loop; pagila$# END pagila$# $$ language plpgsql; NOTICE: create index payment_p2007_02_rental_id_idx ON payment_p2007_02(rental_id) NOTICE: create index payment_p2007_03_rental_id_idx ON payment_p2007_03(rental_id) NOTICE: create index payment_p2007_07_rental_id_idx ON payment_p2007_07(rental_id) NOTICE: create index payment_p2007_04_rental_id_idx ON payment_p2007_04(rental_id) NOTICE: create index payment_p2007_05_rental_id_idx ON payment_p2007_05(rental_id) NOTICE: create index payment_p2007_06_rental_id_idx ON payment_p2007_06(rental_id) NOTICE: create index payment_p2007_01_rental_id_idx ON payment_p2007_01(rental_id) NOTICE: create index payment_rental_id_idx ON payment(rental_id) DO pagila=# Thursday, April 8, 2010
  • 67. Postgres 9.0 / Proc / just DO it! pagila=# di payment_p2007_0*rental* List of relations Schema | Name | Type | Owner | Table --------+--------------------------------+-------+----------+------------------ public | payment_p2007_01_rental_id_idx | index | postgres | payment_p2007_01 public | payment_p2007_02_rental_id_idx | index | postgres | payment_p2007_02 public | payment_p2007_03_rental_id_idx | index | postgres | payment_p2007_03 public | payment_p2007_04_rental_id_idx | index | postgres | payment_p2007_04 public | payment_p2007_05_rental_id_idx | index | postgres | payment_p2007_05 public | payment_p2007_06_rental_id_idx | index | postgres | payment_p2007_06 public | payment_p2007_07_rental_id_idx | index | postgres | payment_p2007_07 (7 rows) Thursday, April 8, 2010
  • 68. Postgres 9.0 / Proc / Wait, there’s more! Thursday, April 8, 2010
  • 69. Postgres 9.0 / Proc / Wait, there’s more! • can now use expressions in OPEN cursor FOR EXECUTE • improve variable recognition • use strict now works in plperl within plpgsql • change Perl warnings to • allow assignment of values to elog(WARNING) IN parameters • Add Python 3 support • Allow MOVE FORWARD n/ ALL, MOVE BACKWARD n/ • support for C++ stored procs ALL for plpgsql cursors • named parameters • add utility functions for plperl (quote_literal and friends) Thursday, April 8, 2010
  • 70. Postgres 9.0 / Proc / Wait, there’s more! Thursday, April 8, 2010
  • 71. Postgres 9.0 • Performance • Administration • Procedures • Tools • Replication Thursday, April 8, 2010
  • 72. Postgres 9.0 / repl / hot standby • allows for queries against a database during crash recovery • aka pitr replication / xlog shipping • max_standby_delay Thursday, April 8, 2010
  • 73. Postgres 9.0 / repl / streaming replication • process to connect to master from slave, and “stream” changes to slaves • multiple slaves • async process Thursday, April 8, 2010
  • 74. Postgres 9.0 / repl / Wait, there’s more! Thursday, April 8, 2010
  • 75. Postgres 9.0 / repl / Wait, there’s more! • actually, there isn’t any more :-) Thursday, April 8, 2010
  • 76. Postgres 9.0 / repl / Wait, there’s more! Thursday, April 8, 2010
  • 77. Postgres 9.0 • Performance • Administration • Procedures • Tools • Replication • Bonus Round!! Thursday, April 8, 2010
  • 78. Postgres 9.0 / Upgrades • dump / restore recommend • pg_migrator • 8.3, 8.4, 9.0alpha/beta/rc • replication • ? • beware of incompatibilities • plpgsql variable compatibilities • read the release notes! Thursday, April 8, 2010
  • 79. Postgres 9.0 / Upgrades • Beware of incompatibilities • plpgsql variable conflicts • read the release notes! Thursday, April 8, 2010
  • 80. Postgres 9.0 / Testing • Download • 9.0 Alpha 4 release • git, http://github.com/gregs1104/peg • Test • import existing schemas • import existing data • run application / code tests • test new features • test pg_migrator Thursday, April 8, 2010
  • 81. Postgres 9.0 / More Info • http://www.depesz.com/ • http://wiki.postgresql.org/ • http://www.xzilla.net • PGEast, Philadelphia, PA, (Uh... right now) • PGCon, Ottawa, Canada, May 19th - 22nd Thursday, April 8, 2010
  • 82. Postgres 9.0 / Shout Out • Hubert Lubaczewski, aka “Depesz” • Magnus Hagander • Andreas Scherbaum • http://www.omniti.com Thursday, April 8, 2010
  • 83. Thank you for listening. / Presentation Thursday, April 8, 2010