Upload
fernando-ike
View
1.385
Download
0
Embed Size (px)
DESCRIPTION
Apresentação do PostgreSQL 8.4
Citation preview
PostgreSQL 8.4
Fernando Ike de Oliveira
Empresa Brasil de Comunicação
FISL 10
Fernando Ike de Oliveira FISL 10
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
Evolução
Fernando Ike de Oliveira FISL 10
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
Visibility Maps
Fim da configuração do FSM no postgresql.conf
Na área de armazenamento é criado um arquivo porrelação com sufixo _vm
O VM é um mapeamento indicativo de quais tuplas estãovisíveis ppara as transações e quais não precisam dovacuum
redução de consumo de processamento e I/O
Fernando Ike de Oliveira FISL 10
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
Algumas coisas mais de Performance...
pg_restore com múltiplos processos
Redução da frequência de I/O nas informações deestatísticas
stats_temp_directory: indica um diretório que ele vaiescrever o arquivo (utilizar em memória)
Algoritmo Hash foi reescrito
Novos métodos de Join (anti e semi)
Fernando Ike de Oliveira FISL 10
Free Space Map
Nova implamentação do Free Space MapNão usa mais a shared memory, agora usa o disco
Remoção do parâmetro max_fsm_pages dopostgresql.confRemoção do parâmetro max_fsm_relations dopostgresql.conf
Adicionado no postgresql.conf ovacuum_freeze_table_age
ignora o visibility map
Fernando Ike de Oliveira FISL 10
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
Privilégio por coluna
Permite que criar ACL por coluna
pagila=# CREATE ROLE fulano WITH LOGIN ENCRYPTED PASSWORD ’fulano’;CREATE ROLEpagila=# grant select (first_name, last_name) on actor_in fo to fulano;GRANTpagila=# SET SESSION AUTHORIZATION fulano;SETpagila=> select * from actor_info;ERRO: permissão negada para relação actor_infopagila=> select first_name, last_name from actor_info lim it 2;
first_name | last_name--------+-------
PENELOPE | GUINESSNICK | WAHLBERG
(1 registro)pagila=> \z actor_info
Privilégios de acessoEsquema | Nome | Tipo | Privilégios de acesso | Column access p rivileges
------+--------+----+---------------+-------------- ---public | actor_info | view | | first_name:
: fulano=r/postgres: last_name:: fulano=r/postgres
(1 registro)
pagila=>
Fernando Ike de Oliveira FISL 10
Banco de dados com localização diferentes
Permite criar LC_COLLATE diferente do instalado porpadrã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 DATABASEpagila=# ł
Lista dos bancos de dadosNome | 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/postgrestemplate1 | postgres | UTF8 | pt_BR.UTF-8 | pt_BR.UTF-8 | =c/ postgres
: postgres=CTc/postgres(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
Autenticação
Suporte a autenticação com certificado SSL
Fernando Ike de Oliveira FISL 10
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) retur ns 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_c atalog.||)(EXTRACT(MONTH FROM $1) + 1) operator(pg_catalog.||) ’-01 ’)::date -INTERVAL ’1 day’)::date END $$;
CREATE FUNCTIONpagila=#
Fernando Ike de Oliveira FISL 10
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_ti me-----+--------+-----------+-----+--------+-------
17841 | public | fancy_last_day | 12 | 6 | 6(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
Auto Explain
Módulo do Contrib que habilita o explain no log dopostgresql automaticamente
Pode ser carregado por sessão ou no postgresql.conf
pagila=# load ’auto_explain’;LOADpagila=# set auto_explain.log_min_duration = 2000;SETpagila=# 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
Novo tipo de dados: citext
No Contrib, módulo com tipo de dados não sensitivo
pagila=# CREATE TABLE usuario (nick CITEXT PRIMARY KEY, pas s TEXT NOT NULL);NOTA: CREATE TABLECREATE TABLEpagila=# INSERT INTO usuario VALUES (’Ronaldo’, md5(rando m()::text));INSERT 0 1pagila=# SELECT * from usuario WHERE nick = ’ronaldo’;
nick | pass------+-----------------------
Ronaldo | 65965ffb9098f448db7982aacd8c747c(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
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_nam e, last_name, title frousing (film_id);
QUERY PLAN--------------------------------------------------- -----------------------------
Hash Join (cost=85.00..319.83 rows=5462 width=28) (actua l time=3.413..39.603 rows=5462 loops=1)Output: actor.first_name, actor.last_name, film.titleHash Cond: (film_actor.actor_id = actor.actor_id)-> Hash Join (cost=78.50..238.22 rows=5462 width=17) (act ual time=2.813..24.658 rows=5462
Output: film_actor.actor_id, film.titleHash Cond: (film_actor.film_id = film.film_id)-> Seq Scan on film_actor (cost=0.00..84.62 rows=5462 widt h=4) (actual time=0.007..6.952
Output: film_actor.actor_id, film_actor.film_id, film_ actor.last_update-> Hash (cost=66.00..66.00 rows=1000 width=19) (actual ti me=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..1.407
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) (a ctual time=0.010..0.271
Output: actor.first_name, actor.last_name, actor.actor _idTotal runtime: 46.285 ms
(1 registro)
Fernando Ike de Oliveira FISL 10
With Recursivo
Common Table Expression (CTE, Consultas com WITH)
Declaração do WITH antes da Consulta
Fernando Ike de Oliveira FISL 10
Exemplo do WITH em Fibonacci
pagila=# WITH recursive Fib (i, j) AS (VALUES (0, 1) UNION ALLSELECT (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---
0112358
1321345589
(1 registro)pagila=#
Fernando Ike de Oliveira FISL 10
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 paymen t group bycustomer_id) p2 using (customer_id) where c2.store_id =c1.store_id and p2.total > p1.total) as rank from customer c 1 join(select customer_id, sum(amount) as total from only paymen tgroup by customer_id) p1 using (customer_id)) x WHERE x.ran k <=3 ORDER BY x.store_id, x.rank;
Fernando Ike de Oliveira FISL 10
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 u sing
(customer_id) group by first_name, last_name, store_id) s electfirst_name, last_name, store_id, total, rank() over (part ition bystore_id order by total desc) from cte ) x where rank <= 3;
first_name | last_name | store_id | total | rank--------+-------+-------+-----+----
ELEANOR | HUNT | 1 | 216.54 | 1CLARA | SHAW | 1 | 195.58 | 2TOMMY | COLLAZO | 1 | 186.62 | 3KARL | SEAL | 2 | 221.55 | 1MARION | SNYDER | 2 | 194.61 | 2RHONDA | KENNEDY | 2 | 194.61 | 2
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
LIMIT na subconsulta
pagila=# SELECT title FROM film ORDER BY random() LIMIT (SEL ECT count( * )/10 FROM film WHERE ratingtitle
---------------SHIP WONDERLANDAMELIE HELLFIGHTERSREDS POCUSLOCK REARSILENCE KANEBENEATH RUSHGRAPES FURYVILLAIN DESPERATEVANISHING ROCKYDETAILS PACKERFIGHT JAWBREAKERFIDDLER LOSTDYNAMITE TARZANDADDY PITTSBURGHANACONDA CONFESSIONSWONKA SEAWORDS HUNTER
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
Busca parcial e Full Text Search
pagila=# select title, description from film where fulltex t @@ to_tsquery(’dog: * ’)pagila-# exceptpagila-# select title, description from film where fulltex t @@ to_tsquery(’dog’);
title | description---------+----------------------------------------- -----------------------------------
ARABIA DOGMA | A Touching Epistle of a Madman And a Mad Cow who m ust Defeat a Student in NigeriaDOGMA FAMILY | A Brilliant Character Study of a Database Admi nistrator And a Monkey who must
(1 registro)pagila=#
Fernando Ike de Oliveira FISL 10
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:192 | Italian | 2006-02-15 10:02:193 | Japanese | 2006-02-15 10:02:194 | Mandarin | 2006-02-15 10:02:195 | French | 2006-02-15 10:02:196 | German | 2006-02-15 10:02:19
(1 registro)
pagila=#
Fernando Ike de Oliveira FISL 10
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’::interval);generate_series
--------------------2009-06-26 15:26:00.74239-032009-06-26 15:26:50.74239-032009-06-26 15:27:40.74239-032009-06-26 15:28:30.74239-032009-06-26 15:29:20.74239-032009-06-26 15:30:10.74239-032009-06-26 15:31:00.74239-03
(1 registro)pagila=#
Fernando Ike de Oliveira FISL 10
Edição mais fácil no PSQL
ef
CREATE FUNCTION add(integer, integer) RETURNS integer AS ’ select 1+2;’ LANGUAGE SQL IMMUTABLERETURNS NULL ON NULL INPUT;
Fernando Ike de Oliveira FISL 10
PSQL e compatibilidade
O PSQL tem compatibilidade com todas as versõesanteriores do PostgreSQL dos Comandos com barra
Fernando Ike de Oliveira FISL 10
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 minutosdump/restore 300.0
dump with parallel restore 180.0pg_migrator em modo cópia 44.0pg_migrator em modo link 0.7
Fernando Ike de Oliveira FISL 10
Funcionalidades para novas versões:
8.5replicação síncrona
suporte SE-Linux (SE-Postgres)
Hot Standby
Fernando Ike de Oliveira FISL 10
Referências
http://www.postgresql.org/
http://www.pgfoundry.org
http://www.postgresql.org/community
Fernando Ike de Oliveira FISL 10
Conclusão
Contatos:[email protected]
http://www.midstorm.org/~fike/weblog
PGCon Brasil 2009http://pgcon.postgresql.org.br
Fernando Ike de Oliveira FISL 10