SlideShare a Scribd company logo
1 of 59
Download to read offline
PostgreSQL e porque voc^e n~ao precisa de NoSQL 
Matheus de Oliveira 
<matheus.oliveira@dextra.com.br>
Matheus de Oliveira 
<matheus.oliveira@dextra.com.br> 
DBA PostgreSQL { consultorias e suportes 
24x7/8x5 
Instrutor dos treinamentos PostgreSQL 
Concepc~ao, desenvolvimento e suporte a 
produc~ao
Matheus de Oliveira 
matheus.oliveira@dextra.com.br 
Mais de 15 anos trabalhando de suporte e 
consultoria PostgreSQL 
http://www.dextra.com.br/ 
Crafting Software, Transforming Business 
Instrutor dos treinamentos PostgreSQL 
Concepc~ao, desenvolvimento e suporte a 
produc~ao
Matheus de Oliveira 
matheus.oliveira@dextra.com.br 
Mais de 15 anos trabalhando de suporte e 
consultoria PostgreSQL 
http://www.dextra.com.br/ 
Crafting Software, Transforming Business 
10 anos e mais de 10 mil pro
ssionais 
capacitados em todo o Brasil. 
http://www.dextraining.com.br/ 
Aprenda com quem faz na pratica 
Concepc~ao, desenvolvimento e suporte a 
produc~ao
Matheus de Oliveira 
matheus.oliveira@dextra.com.br 
Mais de 15 anos trabalhando de suporte e 
consultoria PostgreSQL 
http://www.dextra.com.br/ 
Crafting Software, Transforming Business 
10 anos e mais de 10 mil pro
ssionais 
capacitados em todo o Brasil. 
http://www.dextraining.com.br/ 
Aprenda com quem faz na pratica 
SaaS para analise e monitoramento PostgreSQL 
http://www.pganalytics.com.br/ 
Facilitando a vida do DBA
Para pensar... 
A melhor soluc~ao para o seu problema agora 
VS 
A melhor soluc~ao de todas, a todo custo 
3 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Para pensar... 
A melhor soluc~ao para o seu problema agora 
VS 
A melhor soluc~ao de todas, a todo custo 
3 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Para pensar... 
Cuidado com o que voc^e pensa ser moderno. 
Armazenamentos chave/valor e documentos datam de antes das 
teorias de bancos relacionais. 
4 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Bancos de dados relacionais e NoSQLs 
Bancos relacionais: 
 Baseados no modelo relacional 
 Transac~oes ACID 
 Atomicidade 
 Consist^encia 
 Isolamento 
 Durabilidade 
 Interface de consulta padr~ao { 
SQL 
 Armazenamento em relac~oes { 
estrutura acoplada 
 ... 
Bancos NoSQL: 
 Transac~oes BASE: 
 Basic Availability 
 Soft-state 
 Eventual consistency 
 Interface de consulta propria 
 Schemaless: 
 Chave-Valor 
 Documento 
 Grafos 
 ... 
 Performance como prioridade 
 In-place update 
 Operac~oes assncronas 
 ... 
5 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
PostgreSQL 
one database to rule them all 
 FOSS { Free Open 
Source Software 
 Quase 30 anos de 
experi^encia 
 Robustez, con
abilidade, 
maturidade 
 Diversas funcionalidades, 
e novas a cada vers~ao 
 Forte extensibilidade 
6 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Voc^e n~ao precisa de NoSQL 
para: 
chave/valor
hstore { Armazenamento chave/valor 
 Presente como uma contrib do PostgreSQL desde a vers~ao 8.3 
(2008) 
 Armazenamento de chaves/valores como atributo (coluna) de uma 
tabela 
 Diversos operadores para manipulac~ao, navegac~ao e
ltragem 
(busca) 
 Indexac~ao B-tree, GIN e GIST 
 Exemplo: 
SELECT * FROM movies 
WHERE ( moviedata -’imdb_rate ’):: int  4 
AND moviedata -’ alternate_title ’ = ’Black 
Mask ’; 
8 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
hstore { Armazenamento chave/valor 
Limitac~oes: 
 Aceita apenas texto, tanto para chave quanto para valor 
 N~ao aceita valores aninhados (hstore de hstore) 
Alternativas NoSQL: 
 Redis 
 Riak 
 MemcacheDB 
 Berkeley DB 
 Dynamo 
 ... 
9 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Voc^e n~ao precisa de NoSQL 
para: 
documentos JSON
JSON 
 2012 { vers~ao 9.2 { tipo json, basicamente text com validac~oes 
 2013 { vers~ao 9.3 { ainda json, mas com func~oes fantasticas (a 
grande adoc~ao comeca) 
 2014 { vers~ao 9.4 (lancamento ainda este m^es) { tipo jsonb, 
binario (estrutura interna baseada no hstore), indexac~ao GIN { 
ultra-blaster-rapido 
11 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
JSON 
CREATE TABLE booksdata ( 
title text PRIMARY KEY , 
booksdata jsonb 
); 
12 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
JSON 
SELECT title , 
bookdata - ’ current_edition ’ AS edition , 
bookdata # ’{ publication_info , 0,  isbn } ’ 
AS isbn 
FROM booksdata 
WHERE bookdata @ ’{  publication_info  : [{ 
publisher :  Avon } ] }’:: jsonb 
ORDER BY bookdata # ’{ publication_info , 0,  
price } ’ DESC ; 
13 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
JSON 
Ah!!! E eu comentei que e indexado? 
14 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
JSON 
Ah!!! E eu comentei que e indexado? 
DE VERDADE 
CREATE INDEX booksdata_json_idx ON booksdata 
USING GIN ( booksdata ); 
14 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
JSON 
Ah!!! E eu comentei que e indexado? 
DE VERDADE 
CREATE INDEX booksdata_json_idx ON booksdata 
USING GIN ( booksdata ); 
GIN to the rescue!!! 
14 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
JSON 
Limitac~oes: 
 O tipo json e armazenado em texto e possui fraca indexac~ao, 
mas sua evoluc~ao, o tipo jsonb e armazenado em binario 
 Diferente do json, o jsonb possui as limitac~oes: 
 n~ao armazena a ordem original das chaves (elas sempre ser~ao 
mostradas em ordem lexicogra
ca) 
 n~ao aceita chaves repetidas 
 (basicamente json armazena exatamente como voc^e passa, mas 
jsonb faz um processamento extra) 
Eu diria que hoje, o PostgreSQL possui o mais avancado mecanismo 
de indexac~ao para JSON (jsonb) dos bancos de dados open 
sources (de todos? provavelmente) 
15 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
JSON 
Alguns NoSQLs orientado a documentos: 
 MongoDB 
 CouchDB 
 Cassandra 
 SimpleDB 
 ... 
16 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Voc^e n~ao precisa de NoSQL 
para: 
Full Text Search
Full Text Search 
 FTS nativo no PostgreSQL (tsvector, tsquery, ...) 
SELECT * FROM articles t(fts) 
WHERE fts @@ tsquery ’PostgreSQL  NewSQL ’ 
ORDER BY ts_rank (fts , tsquery ’PostgreSQL  
NewSQL ’); 
 Busca por similaridade (contrib pg trgm) 
SELECT set_limit (0.2) ; 
SELECT *, title - ’NewSQL ’ AS sml 
FROM articles 
WHERE title % ’NewSQL ’ 
ORDER BY sml DESC LIMIT 10; 
18 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Full Text Search 
 FTS nativo no PostgreSQL (tsvector, tsquery, ...) 
SELECT * FROM articles t(fts) 
WHERE fts @@ tsquery ’PostgreSQL  NewSQL ’ 
ORDER BY ts_rank (fts , tsquery ’PostgreSQL  
NewSQL ’); 
 Busca por similaridade (contrib pg trgm) 
SELECT set_limit (0.2) ; 
SELECT *, title - ’NewSQL ’ AS sml 
FROM articles 
WHERE title % ’NewSQL ’ 
ORDER BY sml DESC LIMIT 10; 
 Claro, tudo devidamente indexado... GIN and GIST rocks 
18 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Full Text Search 
Limitac~oes: 
 N~ao processa documentos como PDF, DOC, etc. 
 Ate a vers~ao 9.4 performance mais baixa para algumas operac~oes 
(como ordenac~ao por maior similaridade) { GIN evoluiu na vers~ao 
9.4 
Alguns NoSQLs com FTS: 
 Solr 
 Lucene 
 Elastic Search 
 Sphinx 
 e tambem MySQL 
19 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Voc^e n~ao precisa de NoSQL 
para: 
grafos e 
hierarquias
Consultas em grafos e hierarquias 
 Pode ser facilmente realizada utilizando consultas recursivas 
 O desempenho depende do
ltro e profundidade da navegac~ao 
 Exemplo, catalogo de roles (usuarios/grupos) do PostgreSQL: 
WITH RECURSIVE roles AS ( 
SELECT r. oid AS roleid , r. rolname , 
1 AS level , array [r. rolname ] AS path 
FROM pg_authid r 
WHERE r. oid NOT IN ( 
SELECT m. member FROM pg_auth_members m) 
UNION ALL 
SELECT r.oid , r. rolname , 
p. level + 1, p. path || r. rolname 
FROM pg_auth_members m 
INNER JOIN pg_authid r ON m. member = r. oid 
INNER JOIN roles p ON m. roleid = p. roleid 
) 
SELECT repeat (’|__ ’, level -1) || rolname 
FROM roles 
ORDER BY path ; 
21 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Consultas em grafos e hierarquias 
Resultado: 
administrativo 
| __comercial 
|__| __carla 
|__| __maria 
| __financeiro 
|__| __ana 
|__| __paulo 
ti 
| __beatriz 
| __julio 
| __matheus 
... 
22 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Consultas em grafos e hierarquias 
Limitac~oes: 
 Um pouco complexo, mas voc^e acostuma 
 Performance dependente principalmente da altura 
 N~ao muito bem preparado para busca em espacos de buscas 
grandes ou estruturas de grafos complexas 
Bancos NoSQL orientados a grafos: 
 Neo4j 
 OrientDB 
 ... 
23 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Voc^e n~ao precisa de NoSQL 
para: 
operac~oes 
assncronas
Operac~oes assncronas 
 Quando n~ao precisamos garantir durabilidade em tempo real: 
 Desabilite o par^ametro synchronous commit: 
SET synchronous_commit TO off ; 
 Para dados transientes: 
 UNLOGGED TABLES 
 Quando precisamos de operac~oes n~ao bloqueantes: 
 PQsendQuery, PQsendPrepare, PQconsumeInput, 
PQisBusy, ... 
 Processamento de mensagens: 
 Sincronia pode ser atingida com auxlio de advisory locks 
 Troca de mensagens (ativac~ao, pull/push, sender/receiver, etc.) com 
LISTEN/NOTIFY 
25 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Exemplo de
la 
Ideia: 
 Processos a executar s~ao guardados numa tabela: 
CREATE TABLE queue (id serial , processed boolean 
default false , ... , job jsonb ); 
 Para inserir um job para execuc~ao: 
BEGIN ; 
INSERT INTO queue (job) 
VALUES (’{ jobName : foo, ...} ’); 
NOTIFY jobexecutor ; 
COMMIT ; /* NOTIFY dispara somente depois */ 
 job executors
cam aguardando processos a executar: 
LISTEN jobexecutor ; 
e buscam trabalhos da
la... 
26 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Exemplo de
la { job executor 
1 UPDATE queue 
2 SET processed = true 
3 WHERE NOT processed AND id IN( 
4 SELECT id FROM ( 
5 SELECT id FROM queue 
6 WHERE NOT processed 
7 ORDER BY id 
8 LIMIT 100 
9 ) t 
10 WHERE 
11 pg_try_advisory_xact_lock ( 
12 tableoid :: int , id) 
13 ORDER BY id 
14 LIMIT 1 
15 ) 
16 RETURNING job; 
27 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Exemplo de
la { job executor 
1 UPDATE queue 
2 SET processed = true 
3 WHERE NOT processed AND id IN( 
4 SELECT id FROM ( 
5 SELECT id FROM queue 
6 WHERE NOT processed 
7 ORDER BY id 
8 LIMIT 100 
9 ) t 
10 WHERE 
11 pg_try_advisory_xact_lock ( 
12 tableoid :: int , id) 
13 ORDER BY id 
14 LIMIT 1 
15 ) 
16 RETURNING job; 
28 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Exemplo de
la { job executor 
1 UPDATE queue 
2 SET processed = true 
3 WHERE NOT processed AND id IN( 
4 SELECT id FROM ( 
5 SELECT id FROM queue 
6 WHERE NOT processed 
7 ORDER BY id 
8 LIMIT 100 
9 ) t 
10 WHERE 
11 pg_try_advisory_xact_lock ( 
12 tableoid :: int , id) 
13 ORDER BY id 
14 LIMIT 1 
15 ) 
16 RETURNING job; 
29 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Exemplo de
la { job executor 
1 UPDATE queue 
2 SET processed = true 
3 WHERE NOT processed AND id IN( 
4 SELECT id FROM ( 
5 SELECT id FROM queue 
6 WHERE NOT processed 
7 ORDER BY id 
8 LIMIT 100 
9 ) t 
10 WHERE 
11 pg_try_advisory_xact_lock ( 
12 tableoid :: int , id) 
13 ORDER BY id 
14 LIMIT 1 
15 ) 
16 RETURNING job; 
30 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Fila 
Limitac~oes: 
 Uso de func~oes n~ao espec
cas de SQL 
 Um pouco complicadinho, n~ao acham? 
Outras opc~oes (n~ao so NoSQL): 
 pgq {
la alta performance em PostgreSQL 
 RabbitMQ 
 ActiveMQ 
 MongoDB (tailable cursors) 
 ... 
31 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Voc^e n~ao precisa de NoSQL 
para: 
atualizac~oes 
rapidas
Usando ACID em alta concorr^encia 
 PostgreSQL e 100% ACID compilante 
 Isso nos traz um poderoso controle de transac~oes 
 Mas... Para ter transac~ao, precisamos de bloqueios, mais 
conhecido como locks 
33 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Usando ACID em alta concorr^encia 
 No PostgreSQL locks s~ao podem ser: 
 de varios modos { compartilhados, exclusivo, acesso exclusivo, etc. 
 de
nidos pelo usuario { advisory locks 
 em varios nveis { tuplas, paginas, tabelas, etc. 
 S~ao essenciais (acredite, n~ao vai querer abrir m~ao disto) 
 Mas... Muitas vezes precisamos ter um certo trabalho para reduzir 
o numero ou tempo de bloqueios 
34 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Usando ACID em alta concorr^encia 
Regra no PostgreSQL: escritores nunca bloqueiam leitores e leitores 
nunca bloqueiam escritores nem outros leitores (mas escritores 
bloqueiam escritores) 
35 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
Exemplo... 
 Vamos supor contagem de numero de acessos a uma pagina, onde 
precisamos dessa informac~ao precisa e facil de consultar. 
 Logo nos v^em a cabeca: 
UPDATE page_info 
SET access_count = access_count + 1 
WHERE url = :url; 
 Para consultar, basta: 
SELECT access_count 
FROM page_info 
WHERE url = :url; 
36 / 48 
PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014

More Related Content

More from Matheus de Oliveira

PGConf.Brasil 2018 - PostgreSQL na plataforma de dados do iFood
PGConf.Brasil 2018 - PostgreSQL na plataforma de dados do iFoodPGConf.Brasil 2018 - PostgreSQL na plataforma de dados do iFood
PGConf.Brasil 2018 - PostgreSQL na plataforma de dados do iFoodMatheus de Oliveira
 
PostgreSQL no mundo de micro-serviços, a experiência do iFood
PostgreSQL no mundo de micro-serviços, a experiência do iFoodPostgreSQL no mundo de micro-serviços, a experiência do iFood
PostgreSQL no mundo de micro-serviços, a experiência do iFoodMatheus de Oliveira
 
O que você acha que sabe sobre banco de dados
O que você acha que sabe sobre banco de dadosO que você acha que sabe sobre banco de dados
O que você acha que sabe sobre banco de dadosMatheus de Oliveira
 
TOP5 - Falsas Suposições de Programadores
TOP5 - Falsas Suposições de ProgramadoresTOP5 - Falsas Suposições de Programadores
TOP5 - Falsas Suposições de ProgramadoresMatheus de Oliveira
 
Ténicas de Database Refactoring para ambientes 24x7
Ténicas de Database Refactoring para ambientes 24x7Ténicas de Database Refactoring para ambientes 24x7
Ténicas de Database Refactoring para ambientes 24x7Matheus de Oliveira
 
Análise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQLAnálise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQLMatheus de Oliveira
 
Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014Matheus de Oliveira
 

More from Matheus de Oliveira (7)

PGConf.Brasil 2018 - PostgreSQL na plataforma de dados do iFood
PGConf.Brasil 2018 - PostgreSQL na plataforma de dados do iFoodPGConf.Brasil 2018 - PostgreSQL na plataforma de dados do iFood
PGConf.Brasil 2018 - PostgreSQL na plataforma de dados do iFood
 
PostgreSQL no mundo de micro-serviços, a experiência do iFood
PostgreSQL no mundo de micro-serviços, a experiência do iFoodPostgreSQL no mundo de micro-serviços, a experiência do iFood
PostgreSQL no mundo de micro-serviços, a experiência do iFood
 
O que você acha que sabe sobre banco de dados
O que você acha que sabe sobre banco de dadosO que você acha que sabe sobre banco de dados
O que você acha que sabe sobre banco de dados
 
TOP5 - Falsas Suposições de Programadores
TOP5 - Falsas Suposições de ProgramadoresTOP5 - Falsas Suposições de Programadores
TOP5 - Falsas Suposições de Programadores
 
Ténicas de Database Refactoring para ambientes 24x7
Ténicas de Database Refactoring para ambientes 24x7Ténicas de Database Refactoring para ambientes 24x7
Ténicas de Database Refactoring para ambientes 24x7
 
Análise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQLAnálise de performance usando as estatísticas do PostgreSQL
Análise de performance usando as estatísticas do PostgreSQL
 
Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014Postgresql como NewSQL - DevCamp 2014
Postgresql como NewSQL - DevCamp 2014
 

PostgreSQL, porque você não precisa de NoSQL

  • 1. PostgreSQL e porque voc^e n~ao precisa de NoSQL Matheus de Oliveira <matheus.oliveira@dextra.com.br>
  • 2. Matheus de Oliveira <matheus.oliveira@dextra.com.br> DBA PostgreSQL { consultorias e suportes 24x7/8x5 Instrutor dos treinamentos PostgreSQL Concepc~ao, desenvolvimento e suporte a produc~ao
  • 3. Matheus de Oliveira matheus.oliveira@dextra.com.br Mais de 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ Crafting Software, Transforming Business Instrutor dos treinamentos PostgreSQL Concepc~ao, desenvolvimento e suporte a produc~ao
  • 4. Matheus de Oliveira matheus.oliveira@dextra.com.br Mais de 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ Crafting Software, Transforming Business 10 anos e mais de 10 mil pro
  • 5. ssionais capacitados em todo o Brasil. http://www.dextraining.com.br/ Aprenda com quem faz na pratica Concepc~ao, desenvolvimento e suporte a produc~ao
  • 6. Matheus de Oliveira matheus.oliveira@dextra.com.br Mais de 15 anos trabalhando de suporte e consultoria PostgreSQL http://www.dextra.com.br/ Crafting Software, Transforming Business 10 anos e mais de 10 mil pro
  • 7. ssionais capacitados em todo o Brasil. http://www.dextraining.com.br/ Aprenda com quem faz na pratica SaaS para analise e monitoramento PostgreSQL http://www.pganalytics.com.br/ Facilitando a vida do DBA
  • 8. Para pensar... A melhor soluc~ao para o seu problema agora VS A melhor soluc~ao de todas, a todo custo 3 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 9. Para pensar... A melhor soluc~ao para o seu problema agora VS A melhor soluc~ao de todas, a todo custo 3 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 10. Para pensar... Cuidado com o que voc^e pensa ser moderno. Armazenamentos chave/valor e documentos datam de antes das teorias de bancos relacionais. 4 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 11. Bancos de dados relacionais e NoSQLs Bancos relacionais: Baseados no modelo relacional Transac~oes ACID Atomicidade Consist^encia Isolamento Durabilidade Interface de consulta padr~ao { SQL Armazenamento em relac~oes { estrutura acoplada ... Bancos NoSQL: Transac~oes BASE: Basic Availability Soft-state Eventual consistency Interface de consulta propria Schemaless: Chave-Valor Documento Grafos ... Performance como prioridade In-place update Operac~oes assncronas ... 5 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 12. PostgreSQL one database to rule them all FOSS { Free Open Source Software Quase 30 anos de experi^encia Robustez, con
  • 13. abilidade, maturidade Diversas funcionalidades, e novas a cada vers~ao Forte extensibilidade 6 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 14. Voc^e n~ao precisa de NoSQL para: chave/valor
  • 15. hstore { Armazenamento chave/valor Presente como uma contrib do PostgreSQL desde a vers~ao 8.3 (2008) Armazenamento de chaves/valores como atributo (coluna) de uma tabela Diversos operadores para manipulac~ao, navegac~ao e
  • 16. ltragem (busca) Indexac~ao B-tree, GIN e GIST Exemplo: SELECT * FROM movies WHERE ( moviedata -’imdb_rate ’):: int 4 AND moviedata -’ alternate_title ’ = ’Black Mask ’; 8 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 17. hstore { Armazenamento chave/valor Limitac~oes: Aceita apenas texto, tanto para chave quanto para valor N~ao aceita valores aninhados (hstore de hstore) Alternativas NoSQL: Redis Riak MemcacheDB Berkeley DB Dynamo ... 9 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 18. Voc^e n~ao precisa de NoSQL para: documentos JSON
  • 19. JSON 2012 { vers~ao 9.2 { tipo json, basicamente text com validac~oes 2013 { vers~ao 9.3 { ainda json, mas com func~oes fantasticas (a grande adoc~ao comeca) 2014 { vers~ao 9.4 (lancamento ainda este m^es) { tipo jsonb, binario (estrutura interna baseada no hstore), indexac~ao GIN { ultra-blaster-rapido 11 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 20. JSON CREATE TABLE booksdata ( title text PRIMARY KEY , booksdata jsonb ); 12 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 21. JSON SELECT title , bookdata - ’ current_edition ’ AS edition , bookdata # ’{ publication_info , 0, isbn } ’ AS isbn FROM booksdata WHERE bookdata @ ’{ publication_info : [{ publisher : Avon } ] }’:: jsonb ORDER BY bookdata # ’{ publication_info , 0, price } ’ DESC ; 13 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 22. JSON Ah!!! E eu comentei que e indexado? 14 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 23. JSON Ah!!! E eu comentei que e indexado? DE VERDADE CREATE INDEX booksdata_json_idx ON booksdata USING GIN ( booksdata ); 14 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 24. JSON Ah!!! E eu comentei que e indexado? DE VERDADE CREATE INDEX booksdata_json_idx ON booksdata USING GIN ( booksdata ); GIN to the rescue!!! 14 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 25. JSON Limitac~oes: O tipo json e armazenado em texto e possui fraca indexac~ao, mas sua evoluc~ao, o tipo jsonb e armazenado em binario Diferente do json, o jsonb possui as limitac~oes: n~ao armazena a ordem original das chaves (elas sempre ser~ao mostradas em ordem lexicogra
  • 26. ca) n~ao aceita chaves repetidas (basicamente json armazena exatamente como voc^e passa, mas jsonb faz um processamento extra) Eu diria que hoje, o PostgreSQL possui o mais avancado mecanismo de indexac~ao para JSON (jsonb) dos bancos de dados open sources (de todos? provavelmente) 15 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 27. JSON Alguns NoSQLs orientado a documentos: MongoDB CouchDB Cassandra SimpleDB ... 16 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 28. Voc^e n~ao precisa de NoSQL para: Full Text Search
  • 29. Full Text Search FTS nativo no PostgreSQL (tsvector, tsquery, ...) SELECT * FROM articles t(fts) WHERE fts @@ tsquery ’PostgreSQL NewSQL ’ ORDER BY ts_rank (fts , tsquery ’PostgreSQL NewSQL ’); Busca por similaridade (contrib pg trgm) SELECT set_limit (0.2) ; SELECT *, title - ’NewSQL ’ AS sml FROM articles WHERE title % ’NewSQL ’ ORDER BY sml DESC LIMIT 10; 18 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 30. Full Text Search FTS nativo no PostgreSQL (tsvector, tsquery, ...) SELECT * FROM articles t(fts) WHERE fts @@ tsquery ’PostgreSQL NewSQL ’ ORDER BY ts_rank (fts , tsquery ’PostgreSQL NewSQL ’); Busca por similaridade (contrib pg trgm) SELECT set_limit (0.2) ; SELECT *, title - ’NewSQL ’ AS sml FROM articles WHERE title % ’NewSQL ’ ORDER BY sml DESC LIMIT 10; Claro, tudo devidamente indexado... GIN and GIST rocks 18 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 31. Full Text Search Limitac~oes: N~ao processa documentos como PDF, DOC, etc. Ate a vers~ao 9.4 performance mais baixa para algumas operac~oes (como ordenac~ao por maior similaridade) { GIN evoluiu na vers~ao 9.4 Alguns NoSQLs com FTS: Solr Lucene Elastic Search Sphinx e tambem MySQL 19 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 32. Voc^e n~ao precisa de NoSQL para: grafos e hierarquias
  • 33. Consultas em grafos e hierarquias Pode ser facilmente realizada utilizando consultas recursivas O desempenho depende do
  • 34. ltro e profundidade da navegac~ao Exemplo, catalogo de roles (usuarios/grupos) do PostgreSQL: WITH RECURSIVE roles AS ( SELECT r. oid AS roleid , r. rolname , 1 AS level , array [r. rolname ] AS path FROM pg_authid r WHERE r. oid NOT IN ( SELECT m. member FROM pg_auth_members m) UNION ALL SELECT r.oid , r. rolname , p. level + 1, p. path || r. rolname FROM pg_auth_members m INNER JOIN pg_authid r ON m. member = r. oid INNER JOIN roles p ON m. roleid = p. roleid ) SELECT repeat (’|__ ’, level -1) || rolname FROM roles ORDER BY path ; 21 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 35. Consultas em grafos e hierarquias Resultado: administrativo | __comercial |__| __carla |__| __maria | __financeiro |__| __ana |__| __paulo ti | __beatriz | __julio | __matheus ... 22 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 36. Consultas em grafos e hierarquias Limitac~oes: Um pouco complexo, mas voc^e acostuma Performance dependente principalmente da altura N~ao muito bem preparado para busca em espacos de buscas grandes ou estruturas de grafos complexas Bancos NoSQL orientados a grafos: Neo4j OrientDB ... 23 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 37. Voc^e n~ao precisa de NoSQL para: operac~oes assncronas
  • 38. Operac~oes assncronas Quando n~ao precisamos garantir durabilidade em tempo real: Desabilite o par^ametro synchronous commit: SET synchronous_commit TO off ; Para dados transientes: UNLOGGED TABLES Quando precisamos de operac~oes n~ao bloqueantes: PQsendQuery, PQsendPrepare, PQconsumeInput, PQisBusy, ... Processamento de mensagens: Sincronia pode ser atingida com auxlio de advisory locks Troca de mensagens (ativac~ao, pull/push, sender/receiver, etc.) com LISTEN/NOTIFY 25 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 40. la Ideia: Processos a executar s~ao guardados numa tabela: CREATE TABLE queue (id serial , processed boolean default false , ... , job jsonb ); Para inserir um job para execuc~ao: BEGIN ; INSERT INTO queue (job) VALUES (’{ jobName : foo, ...} ’); NOTIFY jobexecutor ; COMMIT ; /* NOTIFY dispara somente depois */ job executors
  • 41. cam aguardando processos a executar: LISTEN jobexecutor ; e buscam trabalhos da
  • 42. la... 26 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 44. la { job executor 1 UPDATE queue 2 SET processed = true 3 WHERE NOT processed AND id IN( 4 SELECT id FROM ( 5 SELECT id FROM queue 6 WHERE NOT processed 7 ORDER BY id 8 LIMIT 100 9 ) t 10 WHERE 11 pg_try_advisory_xact_lock ( 12 tableoid :: int , id) 13 ORDER BY id 14 LIMIT 1 15 ) 16 RETURNING job; 27 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 46. la { job executor 1 UPDATE queue 2 SET processed = true 3 WHERE NOT processed AND id IN( 4 SELECT id FROM ( 5 SELECT id FROM queue 6 WHERE NOT processed 7 ORDER BY id 8 LIMIT 100 9 ) t 10 WHERE 11 pg_try_advisory_xact_lock ( 12 tableoid :: int , id) 13 ORDER BY id 14 LIMIT 1 15 ) 16 RETURNING job; 28 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 48. la { job executor 1 UPDATE queue 2 SET processed = true 3 WHERE NOT processed AND id IN( 4 SELECT id FROM ( 5 SELECT id FROM queue 6 WHERE NOT processed 7 ORDER BY id 8 LIMIT 100 9 ) t 10 WHERE 11 pg_try_advisory_xact_lock ( 12 tableoid :: int , id) 13 ORDER BY id 14 LIMIT 1 15 ) 16 RETURNING job; 29 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 50. la { job executor 1 UPDATE queue 2 SET processed = true 3 WHERE NOT processed AND id IN( 4 SELECT id FROM ( 5 SELECT id FROM queue 6 WHERE NOT processed 7 ORDER BY id 8 LIMIT 100 9 ) t 10 WHERE 11 pg_try_advisory_xact_lock ( 12 tableoid :: int , id) 13 ORDER BY id 14 LIMIT 1 15 ) 16 RETURNING job; 30 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 51. Fila Limitac~oes: Uso de func~oes n~ao espec
  • 52. cas de SQL Um pouco complicadinho, n~ao acham? Outras opc~oes (n~ao so NoSQL): pgq {
  • 53. la alta performance em PostgreSQL RabbitMQ ActiveMQ MongoDB (tailable cursors) ... 31 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 54. Voc^e n~ao precisa de NoSQL para: atualizac~oes rapidas
  • 55. Usando ACID em alta concorr^encia PostgreSQL e 100% ACID compilante Isso nos traz um poderoso controle de transac~oes Mas... Para ter transac~ao, precisamos de bloqueios, mais conhecido como locks 33 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 56. Usando ACID em alta concorr^encia No PostgreSQL locks s~ao podem ser: de varios modos { compartilhados, exclusivo, acesso exclusivo, etc. de
  • 57. nidos pelo usuario { advisory locks em varios nveis { tuplas, paginas, tabelas, etc. S~ao essenciais (acredite, n~ao vai querer abrir m~ao disto) Mas... Muitas vezes precisamos ter um certo trabalho para reduzir o numero ou tempo de bloqueios 34 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 58. Usando ACID em alta concorr^encia Regra no PostgreSQL: escritores nunca bloqueiam leitores e leitores nunca bloqueiam escritores nem outros leitores (mas escritores bloqueiam escritores) 35 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 59. Exemplo... Vamos supor contagem de numero de acessos a uma pagina, onde precisamos dessa informac~ao precisa e facil de consultar. Logo nos v^em a cabeca: UPDATE page_info SET access_count = access_count + 1 WHERE url = :url; Para consultar, basta: SELECT access_count FROM page_info WHERE url = :url; 36 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 60. Exemplo... UPDATE page_info SET access_count = access_count + 1 WHERE url = : url; Alguem v^e o problema no cara acima? 37 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 61. Exemplo... UPDATE page_info SET access_count = access_count + 1 WHERE url = : url; Alguem v^e o problema no cara acima? Cada transac~ao concorrente executando esta operac~ao
  • 62. cara bloqueada, ou seja, apenas uma pessoa pode executar este comando por vez (por url). 37 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 63. Soluc~ao... 1. Ao inves de atualizar, vamos inserir: INSERT INTO page_access (url , access_count ) VALUES (: url , 1); 2. Para consultar usamos um agregador: SELECT sum ( access_count ) FROM page_access WHERE url = :url; 3. E claro, agora trocamos um UPDATE bloqueante por um SELECT potencialmente lento. Calma... Calma... Tem soluc~ao! 38 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 64. Soluc~ao... Para resolver o problema da consulta
  • 65. car lenta, devemos de tempos em tempos agrupar os registros da tabela WITH old_itens AS ( DELETE FROM page_access RETURNING url , access_count ) INSERT INTO page_access (url , access_count ) SELECT url , sum ( access_count ) FROM old_itens GROUP BY url ; Esta operac~ao e completamente n~ao bloqueante! Enquanto esta sendo executada os INSERTs continuam e os SELECTs tambem. 39 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 66. Soluc~ao... Para resolver o problema da consulta
  • 67. car lenta, devemos de tempos em tempos agrupar os registros da tabela WITH old_itens AS ( DELETE FROM page_access RETURNING url , access_count ) INSERT INTO page_access (url , access_count ) SELECT url , sum ( access_count ) FROM old_itens GROUP BY url ; BTW, o comando WITH la em cima e conhecido como CTE (Common Table Expressions), e e de grande utilidade. #
  • 68. caadica 39 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 69. Soluc~ao... Para resolver o problema da consulta
  • 70. car lenta, devemos de tempos em tempos agrupar os registros da tabela WITH old_itens AS ( DELETE FROM page_access RETURNING url , access_count ) INSERT INTO page_access (url , access_count ) SELECT url , sum ( access_count ) FROM old_itens GROUP BY url ; Por
  • 71. m, adicione um ndice em url e seja feliz: #
  • 72. caadica2 CREATE INDEX ON page access count (url); 39 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 73. ...
  • 74. Performance O PostgreSQL e, sem duvidas, um dos bancos de dados com melhores desempenhos num unico no. Devemos sempre olhar para: ajuste (tuning) de par^ametros de con
  • 75. gurac~ao; indexac~ao; modelo de dados (normalizar ou desnormalizar); tarefas administrativas; estatsticas atualizadas; ... busque por PostgreSQL Performance Tuning... 41 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 76. Performance E quando precisamos de mais: columnar store (extens~oes para o PostgreSQL cstore fdw 1 e In-Memory Columnar Store (ICMS) 2); particionamento de tabelas; divis~ao de tablespaces; 42 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 77. Performance Escalabilidade horizontal: replicac~ao: replicac~ao nativa com slave disponvel para consulta (balanceamento de carga para consultas); replicac~ao multi-master com ferramentas externas: Bucardo e BDR (a grande promessa para a vers~ao 9.4). tecnicas de sharding e/ou processamento de consulta em paralelo: divis~ao de processos em conex~oes; sharding via aplicac~ao; sharding via postgres fdw 3. 1http://citusdata.github.io/cstore_fdw/ 2http://www.garret.ru/imcs/user_guide.html 3http: //www.infoq.com/br/presentations/postgresql-com-newsql 43 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 78. E quando o PostgreSQL n~ao resolve meu problema? Primeiro, tem certeza que n~ao? 44 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 79. E quando o PostgreSQL n~ao resolve meu problema? Primeiro, tem certeza que n~ao? Absoluta? 44 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 80. E quando o PostgreSQL n~ao resolve meu problema? Ok, acontece... sobrecarga de operac~oes e do MVCC pode gerar gargalos; sem processamento paralelo ou sharding nativo (apenas o faca voc^e mesmo); falta de funcionalidades frente a banco de dados especializados, exemplos: estruturas de grafos s~ao melhores tratadas em especializados como Neo4j do que com consultas recursivas; FTS do PostgreSQL comparado a outros como Lucene ou Sphinx ainda perde em funcionalidades. 45 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 81. E quando o PostgreSQL n~ao resolve meu problema? Mas tudo bem usar outro. Se quiser associar, varios Foreign Data Wrappers (FDW) est~ao disponveis (redis fdw, mongo fdw, ...) para mapear dados externos dentro de tabelas no PostgreSQL; 46 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 82. E quando o PostgreSQL n~ao resolve meu problema? DICA DE OURO: comece sempre no PostgreSQL (tiro certo), se o projeto crescer fora de escala que o PG suporte, busque outras alternativas. E muito comum utilizar bancos NoSQL junto com bancos relacionais (n~ao e escolha unica). Existem muitos bancos MPP (Massive Parallel Processing ) e (100%) NewSQL baseados no PostgreSQL. comerciais: Greenplun, Amazon Redshift, Aster Data, Netezza, Vertica, entre outros; e as promessas open source: Postgres-XC e Postgres-XL. 47 / 48 PostgreSQL e porque voc^e n~ao precisa de NoSQL { Matheus de Oliveira { QCon RJ 2014
  • 83. Obrigado! Duvidas? Matheus de Oliveira matheus.oliveira@dextra.com.br IRC { irc.freenode.net: /join #postgresql,#postgresql-br,#dextra Meu nick: MatheusOl Twitter: @matioli matheus LinkedIn: br.linkedin.com/in/matheusdeoliveira/ SlideShare: slideshare.net/matheus de oliveira