SlideShare a Scribd company logo
PostgreSQL: So
 powerful, you won’t
believe it’s open source
   Reuven M. Lerner • reuven@lerner.co.il
               Database 2011
             January 13th, 2011
Who am I?
• Web developer, software architect,
  consultant
• Linux Journal columnist since 1996
• Mostly Ruby on Rails + PostgreSQL, but
  also Python, PHP, jQuery, and lots more...
• PostgreSQL user since (at least) 1997
Lots of options!

• Oracle
• Microsoft SQL Server
• IBM DB2
• MySQL
• PostgreSQL
How do you choose?
•   Integrity (ACID compliance)

•   Data types

•   Functionality

•   Tools

•   Extensibility

•   Documentation

•   Community
PostgreSQL
• Very fast, very scalable. (Just ask Skype.)
• Amazingly flexible, easily extensible.
• Rock-solid — no crashes, corruption,
  security issues for years
• Ridiculously easy administration
• It also happens to be free (MIT/BSD)
Brief history
• Ingres (Stonebreaker, Berkeley)
• Postgres (Stonebreaker, Berkeley)
• PostgreSQL project = Postgres + SQL
• About one major release per year
• Version 8.x — Windows port, recovery
• Version 9.0 — hot replication, upgrades
PostgreSQL
PostgreSQL
PostgreSQL
PostgreSQL
PostgreSQL
PostgreSQL
Data types
• Boolean
• Numeric (integer, float, decimal)
• (var)char, text (infinitely large), binary
• sequences (guaranteed unique)
• Date/time and time intervals
• IP addresses, XML, enums, arrays
Or create your own!
Or create your own!

CREATE TYPE Person AS
(first_name TEXT, last_name
TEXT);
Or create your own!

CREATE TYPE Person AS
(first_name TEXT, last_name
TEXT);
Or create your own!

CREATE TYPE Person AS
(first_name TEXT, last_name
TEXT);


CREATE TABLE Members (group_id
INTEGER, member Person);
PostGIS
• Some people took this all the way
• Want to include geographical information?
• No problem — we’ve got PostGIS!
• Complete GIS solution, with data types and
  functions
• Keeps pace with main PostgreSQL revisions
Flexible internal types

• For example, text/binary storage
   • Inline or in a separate table (TOAST)
   • Compressed or not
  ALTER TABLE Foo ALTER COLUMN
  mytext SET STORAGE EXTERNAL;
Foreign keys that work
CREATE TABLE DVDs (id SERIAL, title TEXT, store_id
INTEGER REFERENCES Stores);

INSERT INTO DVDs (title, store_id) VALUES ('Attack of
the Killer Tomatoes', 500);
Foreign keys that work
CREATE TABLE DVDs (id SERIAL, title TEXT, store_id
INTEGER REFERENCES Stores);

INSERT INTO DVDs (title, store_id) VALUES ('Attack of
the Killer Tomatoes', 500);

ERROR: insert or update on table "dvds" violates
foreign key constraint "dvds_store_id_fkey"
Foreign keys that work
CREATE TABLE DVDs (id SERIAL, title TEXT, store_id
INTEGER REFERENCES Stores);

INSERT INTO DVDs (title, store_id) VALUES ('Attack of
the Killer Tomatoes', 500);

ERROR: insert or update on table "dvds" violates
foreign key constraint "dvds_store_id_fkey"

DETAIL: Key (store_id)=(500) is not present in table
"stores".
Foreign keys that work
CREATE TABLE DVDs (id SERIAL, title TEXT, store_id
INTEGER REFERENCES Stores);

INSERT INTO DVDs (title, store_id) VALUES ('Attack of
the Killer Tomatoes', 500);

ERROR: insert or update on table "dvds" violates
foreign key constraint "dvds_store_id_fkey"

DETAIL: Key (store_id)=(500) is not present in table
"stores".

ERROR: insert or update on table "dvds" violates
foreign key constraint "dvds_store_id_fkey"
Foreign keys that work
CREATE TABLE DVDs (id SERIAL, title TEXT, store_id
INTEGER REFERENCES Stores);

INSERT INTO DVDs (title, store_id) VALUES ('Attack of
the Killer Tomatoes', 500);

ERROR: insert or update on table "dvds" violates
foreign key constraint "dvds_store_id_fkey"

DETAIL: Key (store_id)=(500) is not present in table
"stores".

ERROR: insert or update on table "dvds" violates
foreign key constraint "dvds_store_id_fkey"

DETAIL: Key (store_id)=(500) is not present in table
"stores".
Custom validity checks
CREATE TABLE DVDs (id SERIAL, title
TEXT check (length(title) > 3),
store_id INTEGER REFERENCES
Stores);
INSERT INTO DVDs (title, store_id)
VALUES ('AB', 500);
Custom validity checks
CREATE TABLE DVDs (id SERIAL, title
TEXT check (length(title) > 3),
store_id INTEGER REFERENCES
Stores);
INSERT INTO DVDs (title, store_id)
VALUES ('AB', 500);
ERROR: new row for relation "dvds"
violates check constraint
"dvds_title_check"
Timestamp vs. Interval
testdb=# select now();
              now
-------------------------------
 2010-10-31 08:58:23.365792+02
(1 row)
                                  Point in time

testdb=# select now() - interval '3 days';
           ?column?
-------------------------------
 2010-10-28 08:58:28.870011+02
                                  Difference between
(1 row)                              points in time
Built-in functions
• Math
• Text processing (including regexps)
• Date/time calculations
• Conditionals (CASE, COALESCE, NULLIF)
  for use in queries
• Extensive library of geometrical functions
Or write your own!
• PL/pgSQL
• PL/Perl
• PL/Python
• PL/Ruby
• PL/R
• PL/Tcl
Triggers
• Write a function, and use it as a trigger
• The function can run before or after
  inserts, deletes, or updates
• What do they do?
 • Stop certain actions from happening
 • Change the data before it’s really used
Windowing functions

• Calculate aggregate amounts on each row,
  taking other rows into consideration
• For example: Rank each person’s salary
  within their department
Smart indexing
• Functional indexes
  CREATE UNIQUE INDEX on
  People(lower(email_address));
• Conditional indexes
  CREATE INDEX on People WHERE
  is_admin = true;
• Background (concurrent) indexing
Transactions
• In PostgreSQL from the beginning
• Use transactions for just about anything:
  BEGIN
  DROP TABLE DVDs;
  ROLLBACK;
  SELECT * FROM DVDs; -- Works!
Savepoints
(or, sub-transactions)
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint;
INSERT INTO table1 VALUES (3);
COMMIT;
MVCC
• Readers and writers don’t block each other
• “Multi-version concurrency control”
• xmin, xmax on each tuple; rows are those
  tuples with txid_current between them
• Old versions stick around until vacuumed
 • Autovacuum removes even this issue
Full-text indexing
• Built-in, Unicode-aware full-text indexing
  has been in PostgreSQL for a few years
• It’s simply a different type of index, as well
  as a different search operator (@@)
• Custom dictionaries for different
  languages, indicating stop words and
  stemming rules
CTEs
• Adds a “WITH” statement, which defines a
  sorta-kinda temp table
• You can then query that same temp table
• Makes many queries easier to read, write,
  without a real temp table
• Better yet: CTEs can be recursive, for
  everything from Fibonacci to org charts
WITH regional_sales AS (
     SELECT region, SUM(amount) AS total_sales
     FROM orders GROUP BY region
     ),
     top_regions AS (
          SELECT region FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10
FROM regional_sales)
     )
SELECT region,
         product,
         SUM(quantity) AS product_units,
         SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
WITH regional_sales AS (
     SELECT region, SUM(amount) AS total_sales
     FROM orders GROUP BY region
     ),
     top_regions AS (
          SELECT region FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10
FROM regional_sales)
     )
SELECT region,
         product,
         SUM(quantity) AS product_units,
         SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
WITH regional_sales AS (
     SELECT region, SUM(amount) AS total_sales
     FROM orders GROUP BY region
     ),
     top_regions AS (
          SELECT region FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10
FROM regional_sales)
     )
SELECT region,
         product,
         SUM(quantity) AS product_units,
         SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
WITH regional_sales AS (
     SELECT region, SUM(amount) AS total_sales
     FROM orders GROUP BY region
     ),
     top_regions AS (
          SELECT region FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10
FROM regional_sales)
     )
SELECT region,
         product,
         SUM(quantity) AS product_units,
         SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
WITH regional_sales AS (
     SELECT region, SUM(amount) AS total_sales
     FROM orders GROUP BY region
     ),
     top_regions AS (
          SELECT region FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10
FROM regional_sales)
     )
SELECT region,
         product,
         SUM(quantity) AS product_units,
         SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
WITH regional_sales AS (
     SELECT region, SUM(amount) AS total_sales
     FROM orders GROUP BY region
     ),
     top_regions AS (
          SELECT region FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10
FROM regional_sales)
     )
SELECT region,
         product,
         SUM(quantity) AS product_units,
         SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
WITH regional_sales AS (
     SELECT region, SUM(amount) AS total_sales
     FROM orders GROUP BY region
     ),
     top_regions AS (
          SELECT region FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10
FROM regional_sales)
     )
SELECT region,
         product,
         SUM(quantity) AS product_units,
         SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;
PITR

• Store WALs (write-ahead logs) to disk
• Normally, the server will apply all WALs
  when it starts up
• By choosing which WALs to apply, you can
  bring the database up to date until a certain
  point in time
Streaming replication
• In 8.4, you could use “log shipping” to send
  the WALs from one server to another
• When the primary server went down, you
  could bring up this secondary
• In 9.0, this can happen over the network
 • Faster, more reliable, and easier to
    configure than previously
Hot standby

• In 8.4, the secondary server could not
  answer queries when it was receiving WALs
  from the primary
• 9.0 introduced “hot standby”: Secondary
  server can answer read-only queries
• Can help with balancing certain queries
It’s all in the tables
• Databases are good at working with tables
• So PostgreSQL stores info in tables
 • Configuration parameters
 • Objects (tables, indexes, functions, etc.)
 • Statistics for the optimizer
 • Look through pg_catalog ... and learn!
Client libraries
• libpq (in C)    • Java (JDBC)
• Others by 3rd   • .NET (npgsql)
  parties:        • ODBC
• Python          • JavaScript (!)
• Ruby            • Just about any
                    language you can
• Perl              imagine
Want to learn more?
• Mailing lists, wikis, and blogs
 • All at http://postgresql.org/
 • http://planetpostgresql.org
• PostgreSQL training, consulting,
  development, hand-holding, and general
  encouragement
Thanks!
(Any questions?)



     reuven@lerner.co.il
   http://www.lerner.co.il/
        054-496-8405
“reuvenlerner” on Skype/AIM

More Related Content

PDF
Mentor Your Indexes
PPTX
Syntactic sugar in postgre sql
PDF
Syntactic sugar in Postgre SQL
KEY
Git talk from Open 2011 conference in Israel
PDF
Big Data — Your new best friend
PDF
What can Ruby learn from Python (and vice versa)?
PDF
ActiveRecord 2.3
Mentor Your Indexes
Syntactic sugar in postgre sql
Syntactic sugar in Postgre SQL
Git talk from Open 2011 conference in Israel
Big Data — Your new best friend
What can Ruby learn from Python (and vice versa)?
ActiveRecord 2.3

Viewers also liked (8)

PDF
Web APIs: The future of software
PDF
Functional Python Webinar from October 22nd, 2014
KEY
Rails console
PDF
Dynamic languages, for software craftmanship group
PDF
Python's magic methods
KEY
PostgreSQL
PDF
Technical training business talk.key
PDF
Intro to cloud computing — MegaCOMM 2013, Jerusalem
Web APIs: The future of software
Functional Python Webinar from October 22nd, 2014
Rails console
Dynamic languages, for software craftmanship group
Python's magic methods
PostgreSQL
Technical training business talk.key
Intro to cloud computing — MegaCOMM 2013, Jerusalem
Ad

Similar to PostgreSQL talk, Database 2011 conference (20)

PDF
Really Big Elephants: PostgreSQL DW
PDF
Advanced SQL For Data Scientists
PDF
FOUNDATION OF DATA SCIENCE SQL QUESTIONS
PDF
Advanced MariaDB features that developers love.pdf
PPTX
Pass 2018 introduction to dax
PDF
Crunching Data with Google BigQuery. JORDAN TIGANI at Big Data Spain 2012
PPT
INTRODUCTION TO SQL QUERIES REALTED BRIEF
PPT
What's New for Developers in SQL Server 2008?
PPT
SQL Server 2008 Overview
PDF
esProc introduction
PDF
From 0 to DAX…………………………………………………………..pdf
PPTX
In memory databases presentation
PDF
Improve Your Salesforce Efficiency: Formulas for the Everyday Admin
PDF
Improve Your Salesforce Efficiency: Formulas for the Everyday Admin
PPT
15 Ways to Kill Your Mysql Application Performance
PPTX
Vertica-Database
DOCX
PDF
Access 04
PDF
20180420 hk-the powerofmysql8
PPTX
Data Query Using Structured Query Language - WITH NOTES.pptx
Really Big Elephants: PostgreSQL DW
Advanced SQL For Data Scientists
FOUNDATION OF DATA SCIENCE SQL QUESTIONS
Advanced MariaDB features that developers love.pdf
Pass 2018 introduction to dax
Crunching Data with Google BigQuery. JORDAN TIGANI at Big Data Spain 2012
INTRODUCTION TO SQL QUERIES REALTED BRIEF
What's New for Developers in SQL Server 2008?
SQL Server 2008 Overview
esProc introduction
From 0 to DAX…………………………………………………………..pdf
In memory databases presentation
Improve Your Salesforce Efficiency: Formulas for the Everyday Admin
Improve Your Salesforce Efficiency: Formulas for the Everyday Admin
15 Ways to Kill Your Mysql Application Performance
Vertica-Database
Access 04
20180420 hk-the powerofmysql8
Data Query Using Structured Query Language - WITH NOTES.pptx
Ad

More from Reuven Lerner (9)

PDF
PostgreSQL, your NoSQL database
PDF
Rails israel 2013
KEY
Rails traps
KEY
Modern Web technologies (and why you should care): Megacomm, Jerusalem, Febru...
KEY
Rails development environment talk
KEY
Modern Web Technologies — Jerusalem Web Professionals, January 2011
KEY
Ruby objects
KEY
Rails tools
KEY
Why ruby and rails
PostgreSQL, your NoSQL database
Rails israel 2013
Rails traps
Modern Web technologies (and why you should care): Megacomm, Jerusalem, Febru...
Rails development environment talk
Modern Web Technologies — Jerusalem Web Professionals, January 2011
Ruby objects
Rails tools
Why ruby and rails

Recently uploaded (20)

PDF
Sensors and Actuators in IoT Systems using pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Modernizing your data center with Dell and AMD
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
cuic standard and advanced reporting.pdf
PDF
Advanced Soft Computing BINUS July 2025.pdf
PDF
CIFDAQ's Market Wrap: Ethereum Leads, Bitcoin Lags, Institutions Shift
PDF
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
PPTX
MYSQL Presentation for SQL database connectivity
PDF
HCSP-Presales-Campus Network Planning and Design V1.0 Training Material-Witho...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
PPT
Teaching material agriculture food technology
Sensors and Actuators in IoT Systems using pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Modernizing your data center with Dell and AMD
NewMind AI Monthly Chronicles - July 2025
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
NewMind AI Weekly Chronicles - August'25 Week I
Per capita expenditure prediction using model stacking based on satellite ima...
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
cuic standard and advanced reporting.pdf
Advanced Soft Computing BINUS July 2025.pdf
CIFDAQ's Market Wrap: Ethereum Leads, Bitcoin Lags, Institutions Shift
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
MYSQL Presentation for SQL database connectivity
HCSP-Presales-Campus Network Planning and Design V1.0 Training Material-Witho...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Diabetes mellitus diagnosis method based random forest with bat algorithm
Advanced methodologies resolving dimensionality complications for autism neur...
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
Teaching material agriculture food technology

PostgreSQL talk, Database 2011 conference

  • 1. PostgreSQL: So powerful, you won’t believe it’s open source Reuven M. Lerner • [email protected] Database 2011 January 13th, 2011
  • 2. Who am I? • Web developer, software architect, consultant • Linux Journal columnist since 1996 • Mostly Ruby on Rails + PostgreSQL, but also Python, PHP, jQuery, and lots more... • PostgreSQL user since (at least) 1997
  • 3. Lots of options! • Oracle • Microsoft SQL Server • IBM DB2 • MySQL • PostgreSQL
  • 4. How do you choose? • Integrity (ACID compliance) • Data types • Functionality • Tools • Extensibility • Documentation • Community
  • 5. PostgreSQL • Very fast, very scalable. (Just ask Skype.) • Amazingly flexible, easily extensible. • Rock-solid — no crashes, corruption, security issues for years • Ridiculously easy administration • It also happens to be free (MIT/BSD)
  • 6. Brief history • Ingres (Stonebreaker, Berkeley) • Postgres (Stonebreaker, Berkeley) • PostgreSQL project = Postgres + SQL • About one major release per year • Version 8.x — Windows port, recovery • Version 9.0 — hot replication, upgrades
  • 13. Data types • Boolean • Numeric (integer, float, decimal) • (var)char, text (infinitely large), binary • sequences (guaranteed unique) • Date/time and time intervals • IP addresses, XML, enums, arrays
  • 15. Or create your own! CREATE TYPE Person AS (first_name TEXT, last_name TEXT);
  • 16. Or create your own! CREATE TYPE Person AS (first_name TEXT, last_name TEXT);
  • 17. Or create your own! CREATE TYPE Person AS (first_name TEXT, last_name TEXT); CREATE TABLE Members (group_id INTEGER, member Person);
  • 18. PostGIS • Some people took this all the way • Want to include geographical information? • No problem — we’ve got PostGIS! • Complete GIS solution, with data types and functions • Keeps pace with main PostgreSQL revisions
  • 19. Flexible internal types • For example, text/binary storage • Inline or in a separate table (TOAST) • Compressed or not ALTER TABLE Foo ALTER COLUMN mytext SET STORAGE EXTERNAL;
  • 20. Foreign keys that work CREATE TABLE DVDs (id SERIAL, title TEXT, store_id INTEGER REFERENCES Stores); INSERT INTO DVDs (title, store_id) VALUES ('Attack of the Killer Tomatoes', 500);
  • 21. Foreign keys that work CREATE TABLE DVDs (id SERIAL, title TEXT, store_id INTEGER REFERENCES Stores); INSERT INTO DVDs (title, store_id) VALUES ('Attack of the Killer Tomatoes', 500); ERROR: insert or update on table "dvds" violates foreign key constraint "dvds_store_id_fkey"
  • 22. Foreign keys that work CREATE TABLE DVDs (id SERIAL, title TEXT, store_id INTEGER REFERENCES Stores); INSERT INTO DVDs (title, store_id) VALUES ('Attack of the Killer Tomatoes', 500); ERROR: insert or update on table "dvds" violates foreign key constraint "dvds_store_id_fkey" DETAIL: Key (store_id)=(500) is not present in table "stores".
  • 23. Foreign keys that work CREATE TABLE DVDs (id SERIAL, title TEXT, store_id INTEGER REFERENCES Stores); INSERT INTO DVDs (title, store_id) VALUES ('Attack of the Killer Tomatoes', 500); ERROR: insert or update on table "dvds" violates foreign key constraint "dvds_store_id_fkey" DETAIL: Key (store_id)=(500) is not present in table "stores". ERROR: insert or update on table "dvds" violates foreign key constraint "dvds_store_id_fkey"
  • 24. Foreign keys that work CREATE TABLE DVDs (id SERIAL, title TEXT, store_id INTEGER REFERENCES Stores); INSERT INTO DVDs (title, store_id) VALUES ('Attack of the Killer Tomatoes', 500); ERROR: insert or update on table "dvds" violates foreign key constraint "dvds_store_id_fkey" DETAIL: Key (store_id)=(500) is not present in table "stores". ERROR: insert or update on table "dvds" violates foreign key constraint "dvds_store_id_fkey" DETAIL: Key (store_id)=(500) is not present in table "stores".
  • 25. Custom validity checks CREATE TABLE DVDs (id SERIAL, title TEXT check (length(title) > 3), store_id INTEGER REFERENCES Stores); INSERT INTO DVDs (title, store_id) VALUES ('AB', 500);
  • 26. Custom validity checks CREATE TABLE DVDs (id SERIAL, title TEXT check (length(title) > 3), store_id INTEGER REFERENCES Stores); INSERT INTO DVDs (title, store_id) VALUES ('AB', 500); ERROR: new row for relation "dvds" violates check constraint "dvds_title_check"
  • 27. Timestamp vs. Interval testdb=# select now(); now ------------------------------- 2010-10-31 08:58:23.365792+02 (1 row) Point in time testdb=# select now() - interval '3 days'; ?column? ------------------------------- 2010-10-28 08:58:28.870011+02 Difference between (1 row) points in time
  • 28. Built-in functions • Math • Text processing (including regexps) • Date/time calculations • Conditionals (CASE, COALESCE, NULLIF) for use in queries • Extensive library of geometrical functions
  • 29. Or write your own! • PL/pgSQL • PL/Perl • PL/Python • PL/Ruby • PL/R • PL/Tcl
  • 30. Triggers • Write a function, and use it as a trigger • The function can run before or after inserts, deletes, or updates • What do they do? • Stop certain actions from happening • Change the data before it’s really used
  • 31. Windowing functions • Calculate aggregate amounts on each row, taking other rows into consideration • For example: Rank each person’s salary within their department
  • 32. Smart indexing • Functional indexes CREATE UNIQUE INDEX on People(lower(email_address)); • Conditional indexes CREATE INDEX on People WHERE is_admin = true; • Background (concurrent) indexing
  • 33. Transactions • In PostgreSQL from the beginning • Use transactions for just about anything: BEGIN DROP TABLE DVDs; ROLLBACK; SELECT * FROM DVDs; -- Works!
  • 34. Savepoints (or, sub-transactions) BEGIN; INSERT INTO table1 VALUES (1); SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (2); ROLLBACK TO SAVEPOINT my_savepoint; INSERT INTO table1 VALUES (3); COMMIT;
  • 35. MVCC • Readers and writers don’t block each other • “Multi-version concurrency control” • xmin, xmax on each tuple; rows are those tuples with txid_current between them • Old versions stick around until vacuumed • Autovacuum removes even this issue
  • 36. Full-text indexing • Built-in, Unicode-aware full-text indexing has been in PostgreSQL for a few years • It’s simply a different type of index, as well as a different search operator (@@) • Custom dictionaries for different languages, indicating stop words and stemming rules
  • 37. CTEs • Adds a “WITH” statement, which defines a sorta-kinda temp table • You can then query that same temp table • Makes many queries easier to read, write, without a real temp table • Better yet: CTEs can be recursive, for everything from Fibonacci to org charts
  • 38. WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units, SUM(amount) AS product_sales FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product;
  • 39. WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units, SUM(amount) AS product_sales FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product;
  • 40. WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units, SUM(amount) AS product_sales FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product;
  • 41. WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units, SUM(amount) AS product_sales FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product;
  • 42. WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units, SUM(amount) AS product_sales FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product;
  • 43. WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units, SUM(amount) AS product_sales FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product;
  • 44. WITH regional_sales AS ( SELECT region, SUM(amount) AS total_sales FROM orders GROUP BY region ), top_regions AS ( SELECT region FROM regional_sales WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales) ) SELECT region, product, SUM(quantity) AS product_units, SUM(amount) AS product_sales FROM orders WHERE region IN (SELECT region FROM top_regions) GROUP BY region, product;
  • 45. PITR • Store WALs (write-ahead logs) to disk • Normally, the server will apply all WALs when it starts up • By choosing which WALs to apply, you can bring the database up to date until a certain point in time
  • 46. Streaming replication • In 8.4, you could use “log shipping” to send the WALs from one server to another • When the primary server went down, you could bring up this secondary • In 9.0, this can happen over the network • Faster, more reliable, and easier to configure than previously
  • 47. Hot standby • In 8.4, the secondary server could not answer queries when it was receiving WALs from the primary • 9.0 introduced “hot standby”: Secondary server can answer read-only queries • Can help with balancing certain queries
  • 48. It’s all in the tables • Databases are good at working with tables • So PostgreSQL stores info in tables • Configuration parameters • Objects (tables, indexes, functions, etc.) • Statistics for the optimizer • Look through pg_catalog ... and learn!
  • 49. Client libraries • libpq (in C) • Java (JDBC) • Others by 3rd • .NET (npgsql) parties: • ODBC • Python • JavaScript (!) • Ruby • Just about any language you can • Perl imagine
  • 50. Want to learn more? • Mailing lists, wikis, and blogs • All at http://postgresql.org/ • http://planetpostgresql.org • PostgreSQL training, consulting, development, hand-holding, and general encouragement
  • 51. Thanks! (Any questions?) [email protected] http://www.lerner.co.il/ 054-496-8405 “reuvenlerner” on Skype/AIM

Editor's Notes