Este documento resume as principais informações sobre o PostgreSQL 8.4 apresentadas por Fernando Ike de Oliveira no FISL 10. Ele discute novas funcionalidades como visibilidade maps, privilégios por coluna, bancos de dados com localizações diferentes, autenticação por certificado, funções com parâmetros padrão, tabela de estatísticas por função e auto explain. Ele também apresenta exemplos de WITH recursivo, limit na subconsulta, busca parcial e full text search.
Boas práticas de programação com Object Calisthenics
PostgreSQL 8.4
1. PostgreSQL 8.4
Fernando Ike de Oliveira
Empresa Brasil de Comunicação
FISL 10
Fernando Ike de Oliveira FISL 10
2. Como escreve/fala isso aí?
Escreve-se PostgreSQL ou postgres
Fala-se postígres-és-qüi-uel ou postígres
Não se diz/escreve: Postgree, PostGREE, Postgrí
Fernando Ike de Oliveira FISL 10
4. Ciclo atual de lançamento
Versão 8.3 (Outubro de 2008)
Commit Fests (Março, Maio, Junho)
Congelamento de Funções (Novembro)
Exodos (Dezembro, Janeiro, Feveiro)
Beta (Abril)
Lançamento (Junho ou Julho)
Mais de 200 novas funcionalidades
Fernando Ike de Oliveira FISL 10
5. Visibility Maps
Fim da configuração do FSM no postgresql.conf
Na área de armazenamento é criado um arquivo por
relação com sufixo _vm
O VM é um mapeamento indicativo de quais tuplas estão
visíveis ppara as transações e quais não precisam do
vacuum
redução de consumo de processamento e I/O
Fernando Ike de Oliveira FISL 10
6. Default Stats Target
default_statistics_target = 100
Retirado do Guia de Tuning
Alguns testes apontam problemas de performance
pgtune (ferramenta auxiliar para tuning do postgresql.conf)
Fernando Ike de Oliveira FISL 10
7. Algumas coisas mais de Performance...
pg_restore com múltiplos processos
Redução da frequência de I/O nas informações de
estatísticas
stats_temp_directory: indica um diretório que ele vai
escrever o arquivo (utilizar em memória)
Algoritmo Hash foi reescrito
Novos métodos de Join (anti e semi)
Fernando Ike de Oliveira FISL 10
8. Free Space Map
Nova implamentação do Free Space Map
Não usa mais a shared memory, agora usa o disco
Remoção do parâmetro max_fsm_pages do
postgresql.conf
Remoção do parâmetro max_fsm_relations do
postgresql.conf
Adicionado no postgresql.conf o
vacuum_freeze_table_age
ignora o visibility map
Fernando Ike de Oliveira FISL 10
9. Terminando processos
8.0 -> select pg_cancel_backend(pid)
Cancela a consulta
8.4 -> select pg_terminate_backend(pid)
Cancela o processo (conexão)
Fernando Ike de Oliveira FISL 10
10. Privilégio por coluna
Permite que criar ACL por coluna
pagila=# CREATE ROLE fulano WITH LOGIN ENCRYPTED PASSWORD ’fulano’;
CREATE ROLE
pagila=# grant select (first_name, last_name) on actor_info to fulano;
GRANT
pagila=# SET SESSION AUTHORIZATION fulano;
SET
pagila=> select * from actor_info;
ERRO: permissão negada para relação actor_info
pagila=> select first_name, last_name from actor_info limit 2;
first_name | last_name
--------+-------
PENELOPE | GUINESS
NICK | WAHLBERG
(1 registro)
pagila=> z actor_info
Privilégios de acesso
Esquema | Nome | Tipo | Privilégios de acesso | Column access privileges
------+--------+----+---------------+-----------------
public | actor_info | view | | first_name:
: fulano=r/postgres
: last_name:
: fulano=r/postgres
(1 registro)
pagila=>
Fernando Ike de Oliveira FISL 10
11. Banco de dados com localização diferentes
Permite criar LC_COLLATE diferente do instalado por
padrão
Permite criar LC_TYPE diferente do instalado por padrão
pagila=# CREATE DATABASE nova WITH ENCODING ’UTF8’
LC_COLLATE=’en_GB.UTF-8’ LC_CTYPE=’en_GB.UTF-8’
TEMPLATE template0;
CREATE DATABASE
pagila=# ł
Lista dos bancos de dados
Nome | Dono | Codificação | Collation | Ctype | Privilégios de acesso
-------+-------+---------+---------+---------+---------------
nova | postgres | UTF8 | en_GB.UTF-8 | en_GB.UTF-8 |
pagila | pagila | UTF8 | pt_BR.UTF-8 | pt_BR.UTF-8 |
postgres | postgres | UTF8 | pt_BR.UTF-8 | pt_BR.UTF-8 |
template0 | postgres | UTF8 | pt_BR.UTF-8 | pt_BR.UTF-8 | =c/postgres
: postgres=CTc/postgres
template1 | postgres | UTF8 | pt_BR.UTF-8 | pt_BR.UTF-8 | =c/postgres
: postgres=CTc/postgres
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
12. Autenticação
Suporte a autenticação com certificado SSL
Fernando Ike de Oliveira FISL 10
13. função com parâmetro
funções aceitam parâmetros padrão
pagila=# create or replace function fancy_last_day
(timestamp default current_timestamp::timestamp) returns date
immutable language sql as $$ SELECT CASE WHEN EXTRACT(MONTH FROM $1) =
12 THEN (((EXTRACT(YEAR FROM $1) + 1) operator(pg_catalog.||)
’-01-01’)::date - INTERVAL ’1 day’)::date ELSE ((EXTRACT
(YEAR FROM $1) operator(pg_catalog.||) ’-’ operator(pg_catalog.||)
(EXTRACT(MONTH FROM $1) + 1) operator(pg_catalog.||) ’-01’)::date -
INTERVAL ’1 day’)::date END $$;
CREATE FUNCTION
pagila=#
Fernando Ike de Oliveira FISL 10
14. Tabela de estatísticas por função
Tabela com estatísticas de execução de funções
pagila=# select fancy_last_day();
fancy_last_day
-----------
2009-06-30
(1 registro)
pagila=# select * from pg_stat_user_functions ;
funcid | schemaname | funcname | calls | total_time | self_time
-----+--------+-----------+-----+--------+-------
17841 | public | fancy_last_day | 12 | 6 | 6
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
15. Auto Explain
Módulo do Contrib que habilita o explain no log do
postgresql automaticamente
Pode ser carregado por sessão ou no postgresql.conf
pagila=# load ’auto_explain’;
LOAD
pagila=# set auto_explain.log_min_duration = 2000;
SET
pagila=# select pg_sleep(3);
pg_sleep
-------
(1 row)
~~
LOG: duration: 3000.196 ms plan:
Result (cost=0.00..0.01 rows=1 width=0)
STATEMENT: select pg_sleep(3);
Fernando Ike de Oliveira FISL 10
16. Novo tipo de dados: citext
No Contrib, módulo com tipo de dados não sensitivo
pagila=# CREATE TABLE usuario (nick CITEXT PRIMARY KEY, pass TEXT NOT NULL);NOTA: CREATE TABL
CREATE TABLE
pagila=# INSERT INTO usuario VALUES (’Ronaldo’, md5(random()::text));
INSERT 0 1
pagila=# SELECT * from usuario WHERE nick = ’ronaldo’;
nick | pass
------+-----------------------
Ronaldo | 65965ffb9098f448db7982aacd8c747c
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
17. Explain mais legível
Explain exibe as colunas em sua saída
pagila-# using (film_id);
om film_actor join actor using (actor_id) join filmrst_name, last_name, title fro
using (film_id);
QUERY PLAN
--------------------------------------------------------------------------------
Hash Join (cost=85.00..319.83 rows=5462 width=28) (actual time=3.413..39.603 rows=5462 loops
Output: actor.first_name, actor.last_name, film.title
Hash Cond: (film_actor.actor_id = actor.actor_id)
-> Hash Join (cost=78.50..238.22 rows=5462 width=17) (actual time=2.813..24.658 rows=5462
Output: film_actor.actor_id, film.title
Hash Cond: (film_actor.film_id = film.film_id)
-> Seq Scan on film_actor (cost=0.00..84.62 rows=5462 width=4) (actual time=0.007..
Output: film_actor.actor_id, film_actor.film_id, film_actor.last_update
-> Hash (cost=66.00..66.00 rows=1000 width=19) (actual time=2.790..2.790 rows=1000
Output: film.title, film.film_id
-> Seq Scan on film (cost=0.00..66.00 rows=1000 width=19) (actual time=0.004.
Output: film.title, film.film_id
-> Hash (cost=4.00..4.00 rows=200 width=17) (actual time=0.576..0.576 rows=200 loops=1)
Output: actor.first_name, actor.last_name, actor.actor_id
-> Seq Scan on actor (cost=0.00..4.00 rows=200 width=17) (actual time=0.010..0.271
Output: actor.first_name, actor.last_name, actor.actor_id
Total runtime: 46.285 ms
(1 registro)
Fernando Ike de Oliveira FISL 10
18. With Recursivo
Common Table Expression (CTE, Consultas com WITH)
Declaração do WITH antes da Consulta
Fernando Ike de Oliveira FISL 10
19. Exemplo do WITH em Fibonacci
pagila=# WITH recursive Fib (i, j) AS (VALUES (0, 1) UNION ALL
SELECT (i + j), (i + j) + j FROM Fib WHERE (i + j) < 100)
SELECT i FROM Fib UNION ALL SELECT j FROM Fib ORDER BY i;
i
---
0
1
1
2
3
5
8
13
21
34
55
89
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
20. Antigamente para fazer consulta recursiva
SELECT * FROM (select c1.first_name, c1.last_name, c1.store_id,
p1.total, (select 1 + count(*) from customer c2 join
(select customer_id, sum(amount) as total from only payment group by
customer_id) p2 using (customer_id) where c2.store_id =
c1.store_id and p2.total > p1.total) as rank from customer c1 join
(select customer_id, sum(amount) as total from only payment
group by customer_id) p1 using (customer_id)) x WHERE x.rank <=
3 ORDER BY x.store_id, x.rank;
Fernando Ike de Oliveira FISL 10
21. Agora com consulta recursiva...
... e com window function
pagila=# select * from (with cte as ( select first_name, last_name,
store_id, sum(amount) as total from payment join customer using
(customer_id) group by first_name, last_name, store_id) select
first_name, last_name, store_id, total, rank() over (partition by
store_id order by total desc) from cte ) x where rank <= 3;
first_name | last_name | store_id | total | rank
--------+-------+-------+-----+----
ELEANOR | HUNT | 1 | 216.54 | 1
CLARA | SHAW | 1 | 195.58 | 2
TOMMY | COLLAZO | 1 | 186.62 | 3
KARL | SEAL | 2 | 221.55 | 1
MARION | SNYDER | 2 | 194.61 | 2
RHONDA | KENNEDY | 2 | 194.61 | 2
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
22. LIMIT na subconsulta
pagila=# SELECT title FROM film ORDER BY random() LIMIT (SELECT count(*)/10 FROM film WHERE ra
title
---------------
SHIP WONDERLAND
AMELIE HELLFIGHTERS
REDS POCUS
LOCK REAR
SILENCE KANE
BENEATH RUSH
GRAPES FURY
VILLAIN DESPERATE
VANISHING ROCKY
DETAILS PACKER
FIGHT JAWBREAKER
FIDDLER LOST
DYNAMITE TARZAN
DADDY PITTSBURGH
ANACONDA CONFESSIONS
WONKA SEA
WORDS HUNTER
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
23. Busca parcial e Full Text Search
pagila=# select title, description from film where fulltext @@ to_tsquery(’dog:*’)
pagila-# except
pagila-# select title, description from film where fulltext @@ to_tsquery(’dog’);
title | description
---------+----------------------------------------------------------------------------
ARABIA DOGMA | A Touching Epistle of a Madman And a Mad Cow who must Defeat a Student in Nige
DOGMA FAMILY | A Brilliant Character Study of a Database Administrator And a Monkey who must
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
24. Comando Table
Comando que exibe todas as colunas de uma tabela
Em conformidade com padrão ANSI SQL
pagila=# table language;
language_id | name | last_update
---------+---------------+--------------
1 | English | 2006-02-15 10:02:19
2 | Italian | 2006-02-15 10:02:19
3 | Japanese | 2006-02-15 10:02:19
4 | Mandarin | 2006-02-15 10:02:19
5 | French | 2006-02-15 10:02:19
6 | German | 2006-02-15 10:02:19
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
25. Geração de tempo com intervalos
Intervalo de tempo gerado pela função generate_series
pagila=# select * from generate_series(now() - ’5 minutes’::interval,now(),’50 seconds’::
generate_series
--------------------
2009-06-26 15:26:00.74239-03
2009-06-26 15:26:50.74239-03
2009-06-26 15:27:40.74239-03
2009-06-26 15:28:30.74239-03
2009-06-26 15:29:20.74239-03
2009-06-26 15:30:10.74239-03
2009-06-26 15:31:00.74239-03
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
26. Edição mais fácil no PSQL
ef
CREATE FUNCTION add(integer, integer) RETURNS integer AS ’select 1+2;’ LANGUAGE SQL IMMUTABL
RETURNS NULL ON NULL INPUT;
Fernando Ike de Oliveira FISL 10
27. PSQL e compatibilidade
O PSQL tem compatibilidade com todas as versões
anteriores do PostgreSQL dos Comandos com barra
Fernando Ike de Oliveira FISL 10
28. Pg_Migrator
Facilita a migração entre versões do PostgreSQL
Opcionalmente não ocupa mais espaço em disco
Método de Migração Tempo em minutos
dump/restore 300.0
dump with parallel restore 180.0
pg_migrator em modo cópia 44.0
pg_migrator em modo link 0.7
Fernando Ike de Oliveira FISL 10
29. Funcionalidades para novas versões:
8.5
replicação síncrona
suporte SE-Linux (SE-Postgres)
Hot Standby
Fernando Ike de Oliveira FISL 10
30. Referências
http://www.postgresql.org/
http://www.pgfoundry.org
http://www.postgresql.org/community
Fernando Ike de Oliveira FISL 10
31. Conclusão
Contatos:
fernando.ike@ebc.com.br
fernando.ike@gmail.com
http://www.midstorm.org/~fike/weblog
PGCon Brasil 2009
http://pgcon.postgresql.org.br
Fernando Ike de Oliveira FISL 10