SlideShare ist ein Scribd-Unternehmen logo
1 von 41
Downloaden Sie, um offline zu lesen
Juliano Atanazio
Boas Práticas em um Projeto de Banco de Dados
2/41
Antes de Tudo...
Conheça bem:
● seu hardware;
● seu sistema operacional;
● as entidades tratadas na base de dados.
3/41
Servidores
● Mantenha em servidores separados a aplicação que acessa o
banco e o servidor de banco de dados;
● É mais seguro e evita competição de recursos entre os serviços;
● No servidor de banco de dados ter no mínimo discos separados
para sistema operacional, dados e logs de transação;
● Configure apropriadamente logs do servidor de aplicação e do
servidor de banco de dados;
● Não deixe o servidor de banco de dados exposto na Internet;
● Ter estratégias de backup e alta disponibilidade.
4/41
O Projeto de Banco de Dados
● Investir não é gastar...;
● Invista seu tempo para uma modelagem e projeto de banco de
dados bem feita;
● Pense como uma construção de um prédio, pois o projeto de
banco de dados é um dos alicerces para seu sistema;
● É melhor prevenir do que remediar, pois o tempo investido para
uma modelagem bem consolidada será recompensado em não
ter que fazer manutenções (desnecessárias, a priori) e ter que
projetar novamente mais tarde, pois aí seria gasto muito mais
tempo do que o investido no início;
● Para o projeto da base de dados deve-se trabalhar em conjunto
DBAs, desenvolvedores e gestores de projetos.
5/41
Nomenclaturas de Objetos
● Seja qual for o padrão adotado, siga-o até o fim!;
● Prefixos / sufixos: utilizar ou não? Bases de Dados, tabelas,
views, triggers, etc... adote iniciais, tais como db_, tb_, vw_,
tg_... Considere os prós e contras, mas não misture!;
● Utilizar nomes amigáveis para os objetos conforme a entidade
tratada;
● Nomes de tabelas no singular;
● Jamais utilizar acentuação ou qualquer caractere especial;
6/41
Nomenclaturas de Objetos
● Não utilizar nomes com espaços e / ou letras maiúsculas;
● Para nomes de campos, se possível utilizar o mesmo nome
para a chave primária em todas as tabelas, como “id” ou “cod”,
por exemplo;
● Campos que têm o mesmo propósito em tabelas diferentes,
preferencialmente ter o mesmo nome;
● Nomes de campos também devem ser padronizados;
● Evite coisas como na tabela “A” há um campo “data_inicio” e na
tabela “B” o campo se chama “data_ini”...
7/41
Usuários / Grupos / Papéis
● Dê o mínimo de privilégios necessários para cada usuário
conforme o objeto que acessa ou usa;
● Utilize grupos de usuários para facilitar sua gestão, agrupando-
os por algum setor e / ou características em comum;
● Alguns parâmetros de configuração (os de sessão) podem servir
de configuração para um papel (role) específico e dependendo
do caso, conforme a necessidade é bom fazê-lo. Por exemplo,
um usuário que precisa ser sempre auditado:
ALTER ROLE foo SET log_statement = 'all';
8/41
Views
● Views podem ser grandes aliadas;
● Podem ser utilizadas para isolar alterações da base de dados
da aplicação, reduzindo a necessidade de manutenção se
houver alteração na base dados;
● Podem também ser utilizadas para prover acesso granular a
usuários.
9/41
ORMs
● Não confie cegamente neles.
● Utilize-os com moderação, de forma que se tenha o total
controle e total conhecimento sobre sua base.
● Evite transações implícitas, ORMs têm o costume deixar cada
comando (statement) ser tratado como uma transação
resultando em perda de performance. Desabilite transações
explícitas e quando precisar de uma transação faça-a
explicitamente.
10/41
Documentação
● Documente o esquema da base em esquemas de Entidade-
Relacionamento;
● Escreva comentários em seus scripts declarando cada ação de
cada comando;
● Utilize comentários de objetos (descrição de objetos).
11/41
Tablespaces
● Tabelas e índices cuja utilização e / ou tamanho sejam muito
maiores do que os outros é melhor deixar em disco(s)
separado(s);
● A partição de tablespace deve ser formatada com um sistema
de arquivos primeiramente seguro contra falhas (crashes) e com
boa performance de escrita e leitura.
12/41
Índices
● Crie índices para campos que são utilizados em condições de
consultas, ou pelo menos as consultas mais frequentes;
● Crie índices para campos de chaves estrangeiras e em campos
envolvidos como critérios de junção (JOIN);
● Se houver uma consulta frequente utilize índices parciais com
sua condição conforme a consulta;
● Para consultas que buscam faixas de valores é bom ter um
índice clusterizado para isso;
13/41
Índices
● Fillfactor (fator de preenchimento) para um índice é a
porcentagem que determina como o método de indexação
encherá as páginas de índices. O quão cheias essas páginas
ficarão em porcentagem;
● Para tabelas estáticas pode-se deixar em 100 (representando
100%);
● Para tabelas que sofrem muitas alterações um valor de 80 ou
menos pode ser mais adequado, mas quanto menor for o fator
de preenchimento, mais espaço em disco ocupará.
14/41
Evite BLOBs
● Utilize campos bytea, pois BLOBs são armazenados em um
catálogo do sistema (pg_largeobject).
● Com campos bytea têm-se a flexibilidade de determinar em qual
tabela de sua base de dados o objeto será armazenado.
● Não criar campos bytea em tabelas muito utilizadas, crie uma
tabela exclusiva para grandes objetos para ser referenciada.
15/41
Integridade de Dados
● Utilize constraints (foreign key, check, not null), não deixe o
controle total para a aplicação.
● Evite dados inconsistentes em seu banco de dados, como um
preço negativo de um produto, por exemplo.
16/41
Consultas
● Evite o famoso SELECT *...
● Para um melhor desempenho declare cada campo que precisar
para buscar os dados;
● Evite caracteres curinga com a cláusula LIKE. Isso faz com que
o motor do banco de dados não use indexação para uma busca,
o que leva a uma performance degradada;
● Pagine sua busca, faça uso de LIMIT e OFFSET, pois não faz
sentido uma busca retornar um número exorbitante de linhas.
Consome muitos recursos e degrada a performance. Um
número razoável é de até 100 (cem) linhas retornadas por vez.
17/41
Chaves Primárias
● Sempre tenha uma chave primária na tabela;
● Quando possível fazer uso de chaves naturais;
● Prefira tipos numéricos a tipos de texto, pois consomem menos
recursos e são mais rápidos para busca.
18/41
Esquemas
● Para a mesma aplicação, que trata das mesmas coisas evite
criar mais de uma base de dados;
● Faça uso de schemas para organizar seus objetos.
19/41
Tipos de Dados
Não dê tiros em formiga!
● Escolha o tipo certo
para sua coluna;
● Consulte a
documentação do
PostgreSQL [1] verificando se
o tipo de dados escolhido
é realmente o mais
adequado para não
derperdiçar recursos.
[1] http://www.postgresql.org/docs/current/static/datatype.html
20/41
Tipos de Dados:
pg_type_of e pg_column_size
A função pg_typeof pode te ajudar a descobrir um tipo de um dado:
> SELECT pg_typeof(5874.31);
pg_typeof
-----------
numeric
A função pg_column_size exibe em bytes o tamanho de um dado
Quantos bytes em numeric?:
> SELECT pg_column_size(5874.31::numeric);
pg_column_size
----------------
10
21/41
Tipos de Dados:
pg_type_of e pg_column_size
Quantos bytes em money?:
> SELECT pg_column_size(5874.31::money);
pg_column_size
----------------
8
22/41
Tipos de Dados: Endereço IP
Como text:
> SELECT pg_column_size('192.168.7.1'::text);
pg_column_size
----------------
15
Como inet:
> SELECT pg_column_size('192.168.7.1'::inet);
pg_column_size
----------------
10
23/41
Tipos de Dados:
Endereço de Rede com Máscara
Como text:
> SELECT pg_column_size('192.168.7.0/24'::text);
pg_column_size
----------------
18
Como cidr:
> SELECT pg_column_size('192.168.7.0/24'::cidr);
pg_column_size
----------------
10
24/41
Tipos de Dados: MAC Address
Como text:
> SELECT pg_column_size('00:00:00:00:00:00'::text);
pg_column_size
----------------
21
Como macaddr:
> SELECT pg_column_size('00:00:00:00:00:00'::macaddr);
pg_column_size
----------------
6
25/41
Tipos de Dados:
Inteiros (int2, int4 e int8)
Criação de tabela com três campos inteiros (smallint, integer e bigint):
SELECT
generate_series(1, 10000)::int2 campo_int2,
generate_series(1, 10000)::int4 campo_int4,
generate_series(1, 10000)::int8 campo_int8
INTO tb_inteiros;
26/41
Tipos de Dados:
Inteiros (int2, int4 e int8)
Quanto cada coluna ocupa em disco:
SELECT
pg_size_pretty(sum(pg_column_size(campo_int2))) "smallint",
pg_size_pretty(sum(pg_column_size(campo_int4))) "integer",
pg_size_pretty(sum(pg_column_size(campo_int8))) "bigint"
FROM tb_inteiros;
smallint | integer | bigint
----------+---------+--------
20 kB | 39 kB | 78 kB
27/41
Tipos de Dados:
Inteiros vs Texto
Criação de um banco de dados de teste:
> CREATE DATABASE db_teste;
Conexão ao banco:
> c db_teste
28/41
Tipos de Dados:
Inteiros vs Texto
Criação de uma tabela de teste:
> CREATE TABLE tb_teste_tipos_de_dados(
campo_int2 smallint,
campo_int4 int,
campo_int8 bigint,
campo_text text,
campo_varchar_10 varchar(10),
campo_char_10 char(10)
);
29/41
Tipos de Dados:
Inteiros vs Texto
Criação de índices:
> CREATE INDEX idx_campo_int2
ON tb_teste_tipos_de_dados (campo_int2);
> CREATE INDEX idx_campo_int4
ON tb_teste_tipos_de_dados (campo_int4);
> CREATE INDEX idx_campo_int8
ON tb_teste_tipos_de_dados (campo_int8);
> CREATE INDEX idx_campo_text
ON tb_teste_tipos_de_dados (campo_text);
> CREATE INDEX idx_campo_varchar_10
ON tb_teste_tipos_de_dados (campo_varchar_10);
> CREATE INDEX idx_campo_char_10
ON tb_teste_tipos_de_dados (campo_char_10);
30/41
Tipos de Dados:
Inteiros vs Texto
Para os testes vamos criar um script em Python (pg_populator.py) com
o seguinte conteúdo:
#!/usr/bin/env python
#_*_ coding: utf8 _*_
import random
import sys
import csv
# Quantidade de linhas
n_lines = int(sys.argv[1])
try:
# Nome do arquivo de saída
out_file = sys.argv[2]
except IndexError:
# Se nenhum arquivo for informado, enviar
# para a saída padrão
out_file = '/dev/stdout'
31/41
Tipos de Dados:
Inteiros vs Texto
for i in xrange(n_lines):
# Variáveis com conteúdo aleatório conforme os
# campos da tabela
int2 = random.randint(-32768, 32767)
int4 = random.randint(-2147483648, 2147483647)
int8 = random.randint(-9223372036854775808, 9223372036854775807)
text = str(int8)[0: 9].zfill(10)
varchar_10 = text
char_10 = text
line = (int2, int4, int8, text, varchar_10, char_10)
with open(out_file, 'ab') as csvfile:
spamwriter = csv.writer(csvfile, delimiter = ';')
spamwriter.writerow(line)
32/41
Tipos de Dados:
Inteiros vs Texto
Damos permissão de execução para ele no shell do Linux:
$ chmod +x pg_populator.py
Gerando um arquivo CSV com dez milhẽs de registros:
$ ./pg_populator.py 10000000 /tmp/arquivo.csv
Importar para o banco:
$ psql -c 
"COPY tb_teste_tipos_de_dados FROM '/tmp/arquivo.csv' 
DELIMITER ';';" db_teste
33/41
Tipos de Dados:
Inteiros vs Texto
Verificando o tamanho da tabela:
> SELECT
pg_size_pretty(pg_relation_size('tb_teste_tipos_de_dados'))
AS "Tamanho da tabela";
Tamanho da tabela
-------------------
766 MB
Qual é o tamanho do índice do campo smallint?:
> SELECT
pg_size_pretty(pg_relation_size('idx_campo_int2'))
AS "Tamanho do índice do campo smallint";
Tamanho do índice do campo smallint
-------------------------------------
223 MB
34/41
Tipos de Dados:
Inteiros vs Texto
Qual é o tamanho do índice do campo integer?:
> SELECT pg_size_pretty(pg_relation_size('idx_campo_int4'))
AS "Tamanho do índice do campo integer";
Tamanho do índice do campo integer
------------------------------------
224 MB
Qual é o tamanho do índice do campo bigint?:
> SELECT pg_size_pretty(pg_relation_size('idx_campo_int8'))
AS "Tamanho do índice do campo bigint";
Tamanho do índice do campo bigint
-----------------------------------
279 MB
35/41
Tipos de Dados:
Inteiros vs Texto
Qual é o tamanho do índice do campo text?:
> SELECT pg_size_pretty(pg_relation_size('idx_campo_text'))
AS "Tamanho do índice do campo text";
Tamanho do índice do campo text
---------------------------------
333 MB
Qual é o tamanho do índice do campo varchar(10)?:
> SELECT
pg_size_pretty(pg_relation_size('idx_campo_varchar_10'))
AS "Tamanho do índice do campo varchar(10)";
Tamanho do índice do campo varchar(10)
----------------------------------------
333 MB
36/41
Tipos de Dados:
Inteiros vs Texto
Qual é o tamanho do índice do campo char(10)?:
> SELECT pg_size_pretty(pg_relation_size('idx_campo_char_10'))
AS "Tamanho do índice do campo char(10)";
Tamanho do índice do campo char(10)
-------------------------------------
333 MB
37/41
Tipos de Dados:
Inteiros vs Texto
Tamanho de cada coluna:
SELECT
pg_size_pretty(sum(pg_column_size(campo_int2))) "smallint",
pg_size_pretty(sum(pg_column_size(campo_int4))) "integer",
pg_size_pretty(sum(pg_column_size(campo_int8))) "bigint",
pg_size_pretty(sum(pg_column_size(campo_text))) "text",
pg_size_pretty(sum(pg_column_size(campo_varchar_10)))
"varchar(10)",
pg_size_pretty(sum(pg_column_size(campo_char_10))) "char(10)"
FROM tb_teste_tipos_de_dados;
smallint | integer | bigint | text | varchar(10) | char(10)
----------+---------+--------+--------+-------------+----------
19 MB | 38 MB | 76 MB | 105 MB | 105 MB | 105 MB
38/41
Tipos de Dados:
Inteiros vs Texto
Resumo
Tamanho
dos Índices
(MB)
Tamanho
de cada coluna
(MB)
smallint
223 19
integer
224 38
bigint
279 76
text
333 105
varchar
(10)
char(10
39/41
Doe!
O Elefante precisa de você!
Contribua! :)
http://www.postgresql.org/about/donate/
40/41
Save our planet!
41/41
Até a próxima!!! :)
Juliano Atanazio
juliano777@gmail.com
https://juliano777.wordpress.com
http://www.slideshare.net/spjuliano
https://speakerdeck.com/julianometalsp
https://br.linkedin.com/pub/juliano-atanazio/2b/951/ab9

Weitere ähnliche Inhalte

Was ist angesagt?

MySQL Indexing : Improving Query Performance Using Index (Covering Index)
MySQL Indexing : Improving Query Performance Using Index (Covering Index)MySQL Indexing : Improving Query Performance Using Index (Covering Index)
MySQL Indexing : Improving Query Performance Using Index (Covering Index)Hemant Kumar Singh
 
Escalabilidade horizontal com PostgreSQL e Pgpool II
Escalabilidade horizontal com PostgreSQL e Pgpool IIEscalabilidade horizontal com PostgreSQL e Pgpool II
Escalabilidade horizontal com PostgreSQL e Pgpool IIMatheus Espanhol
 
PostgreSQL: Conceitos e aplicações
PostgreSQL: Conceitos e aplicaçõesPostgreSQL: Conceitos e aplicações
PostgreSQL: Conceitos e aplicaçõesFernando Ike
 
OpenGurukul : Database : PostgreSQL
OpenGurukul : Database : PostgreSQLOpenGurukul : Database : PostgreSQL
OpenGurukul : Database : PostgreSQLOpen Gurukul
 
Performant Streaming in Production: Preventing Common Pitfalls when Productio...
Performant Streaming in Production: Preventing Common Pitfalls when Productio...Performant Streaming in Production: Preventing Common Pitfalls when Productio...
Performant Streaming in Production: Preventing Common Pitfalls when Productio...Databricks
 
Advanced Postgres Monitoring
Advanced Postgres MonitoringAdvanced Postgres Monitoring
Advanced Postgres MonitoringDenish Patel
 
MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6MYXPLAIN
 
Bucketing 2.0: Improve Spark SQL Performance by Removing Shuffle
Bucketing 2.0: Improve Spark SQL Performance by Removing ShuffleBucketing 2.0: Improve Spark SQL Performance by Removing Shuffle
Bucketing 2.0: Improve Spark SQL Performance by Removing ShuffleDatabricks
 
Mysql query optimization
Mysql query optimizationMysql query optimization
Mysql query optimizationBaohua Cai
 
PostgreSQL Performance Tuning
PostgreSQL Performance TuningPostgreSQL Performance Tuning
PostgreSQL Performance Tuningelliando dias
 
Melhorando o desempenho de suas consultas no MySql
Melhorando o desempenho de suas consultas no MySqlMelhorando o desempenho de suas consultas no MySql
Melhorando o desempenho de suas consultas no MySqlHelder Lopes
 
Advanced PLSQL Optimizing for Better Performance
Advanced PLSQL Optimizing for Better PerformanceAdvanced PLSQL Optimizing for Better Performance
Advanced PLSQL Optimizing for Better PerformanceZohar Elkayam
 
PostgreSQL Administration for System Administrators
PostgreSQL Administration for System AdministratorsPostgreSQL Administration for System Administrators
PostgreSQL Administration for System AdministratorsCommand Prompt., Inc
 
Advanced MySQL Query Tuning
Advanced MySQL Query TuningAdvanced MySQL Query Tuning
Advanced MySQL Query TuningAlexander Rubin
 
Getting started with postgresql
Getting started with postgresqlGetting started with postgresql
Getting started with postgresqlbotsplash.com
 

Was ist angesagt? (20)

MySQL Indexing : Improving Query Performance Using Index (Covering Index)
MySQL Indexing : Improving Query Performance Using Index (Covering Index)MySQL Indexing : Improving Query Performance Using Index (Covering Index)
MySQL Indexing : Improving Query Performance Using Index (Covering Index)
 
Replicação PostgreSQL com RepManager
Replicação PostgreSQL com RepManagerReplicação PostgreSQL com RepManager
Replicação PostgreSQL com RepManager
 
Escalabilidade horizontal com PostgreSQL e Pgpool II
Escalabilidade horizontal com PostgreSQL e Pgpool IIEscalabilidade horizontal com PostgreSQL e Pgpool II
Escalabilidade horizontal com PostgreSQL e Pgpool II
 
PostgreSQL: Conceitos e aplicações
PostgreSQL: Conceitos e aplicaçõesPostgreSQL: Conceitos e aplicações
PostgreSQL: Conceitos e aplicações
 
OpenGurukul : Database : PostgreSQL
OpenGurukul : Database : PostgreSQLOpenGurukul : Database : PostgreSQL
OpenGurukul : Database : PostgreSQL
 
Indexes in postgres
Indexes in postgresIndexes in postgres
Indexes in postgres
 
Performant Streaming in Production: Preventing Common Pitfalls when Productio...
Performant Streaming in Production: Preventing Common Pitfalls when Productio...Performant Streaming in Production: Preventing Common Pitfalls when Productio...
Performant Streaming in Production: Preventing Common Pitfalls when Productio...
 
5 Steps to PostgreSQL Performance
5 Steps to PostgreSQL Performance5 Steps to PostgreSQL Performance
5 Steps to PostgreSQL Performance
 
Advanced Postgres Monitoring
Advanced Postgres MonitoringAdvanced Postgres Monitoring
Advanced Postgres Monitoring
 
MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6
 
PostgreSQL
PostgreSQLPostgreSQL
PostgreSQL
 
Bucketing 2.0: Improve Spark SQL Performance by Removing Shuffle
Bucketing 2.0: Improve Spark SQL Performance by Removing ShuffleBucketing 2.0: Improve Spark SQL Performance by Removing Shuffle
Bucketing 2.0: Improve Spark SQL Performance by Removing Shuffle
 
Explain that explain
Explain that explainExplain that explain
Explain that explain
 
Mysql query optimization
Mysql query optimizationMysql query optimization
Mysql query optimization
 
PostgreSQL Performance Tuning
PostgreSQL Performance TuningPostgreSQL Performance Tuning
PostgreSQL Performance Tuning
 
Melhorando o desempenho de suas consultas no MySql
Melhorando o desempenho de suas consultas no MySqlMelhorando o desempenho de suas consultas no MySql
Melhorando o desempenho de suas consultas no MySql
 
Advanced PLSQL Optimizing for Better Performance
Advanced PLSQL Optimizing for Better PerformanceAdvanced PLSQL Optimizing for Better Performance
Advanced PLSQL Optimizing for Better Performance
 
PostgreSQL Administration for System Administrators
PostgreSQL Administration for System AdministratorsPostgreSQL Administration for System Administrators
PostgreSQL Administration for System Administrators
 
Advanced MySQL Query Tuning
Advanced MySQL Query TuningAdvanced MySQL Query Tuning
Advanced MySQL Query Tuning
 
Getting started with postgresql
Getting started with postgresqlGetting started with postgresql
Getting started with postgresql
 

Andere mochten auch

Nomenclatura para Banco de Dados
Nomenclatura para Banco de DadosNomenclatura para Banco de Dados
Nomenclatura para Banco de DadosAlan James James
 
10 Boas Práticas de Programação
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de ProgramaçãoCarlos Schults
 
Por que Python? Vamos Conhecer? Vamos Aprender?
Por que Python? Vamos Conhecer? Vamos Aprender?Por que Python? Vamos Conhecer? Vamos Aprender?
Por que Python? Vamos Conhecer? Vamos Aprender?Juliano Atanazio
 
Gerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarmanGerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarmanJuliano Atanazio
 
PostgreSQL: O melhor banco de dados Universo
PostgreSQL: O melhor banco de dados UniversoPostgreSQL: O melhor banco de dados Universo
PostgreSQL: O melhor banco de dados Universoelliando dias
 
Edital de seleção de projetos bb
Edital de seleção de projetos bbEdital de seleção de projetos bb
Edital de seleção de projetos bbedufolhapopular
 
Cartilha PNHR Banco do Brasil
Cartilha PNHR Banco do BrasilCartilha PNHR Banco do Brasil
Cartilha PNHR Banco do BrasilSavio Rodrigues
 
Padronização de Nomenclatura para Banco de Dados
Padronização de Nomenclatura para Banco de DadosPadronização de Nomenclatura para Banco de Dados
Padronização de Nomenclatura para Banco de DadosSamuelson Brito
 
Apresentação do Banco do Brasil no Agrocafé 2012
Apresentação do Banco do Brasil no Agrocafé 2012Apresentação do Banco do Brasil no Agrocafé 2012
Apresentação do Banco do Brasil no Agrocafé 2012Revista Cafeicultura
 
Essência Banco do Brasil
Essência Banco do BrasilEssência Banco do Brasil
Essência Banco do BrasilPreOnline
 
Palestra GestãO De Projetos Tecnologia Do Bb
Palestra GestãO De Projetos   Tecnologia Do BbPalestra GestãO De Projetos   Tecnologia Do Bb
Palestra GestãO De Projetos Tecnologia Do BbMarcelo Bastos
 
Uso de Analisadores em Linhas em Plantas de Petróleo e Gás
Uso de Analisadores em Linhas em Plantas de Petróleo e GásUso de Analisadores em Linhas em Plantas de Petróleo e Gás
Uso de Analisadores em Linhas em Plantas de Petróleo e GásJunior Ozono
 
Modelagem de dados
Modelagem de dadosModelagem de dados
Modelagem de dadosmlima72
 
Banco do Brasil: Linhas de crédito para agronegócio
Banco do Brasil: Linhas de crédito para agronegócioBanco do Brasil: Linhas de crédito para agronegócio
Banco do Brasil: Linhas de crédito para agronegócioMudas Nobres
 
Melhores práticas em gerenciamento de projetos
Melhores práticas em gerenciamento de projetosMelhores práticas em gerenciamento de projetos
Melhores práticas em gerenciamento de projetosElderclei Reami
 
Bb roteiro projeto completo Credito Rural
Bb roteiro projeto completo Credito Rural Bb roteiro projeto completo Credito Rural
Bb roteiro projeto completo Credito Rural Revista Cafeicultura
 

Andere mochten auch (20)

Nomenclatura para Banco de Dados
Nomenclatura para Banco de DadosNomenclatura para Banco de Dados
Nomenclatura para Banco de Dados
 
10 Boas Práticas de Programação
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de Programação
 
Oficina Arduino
Oficina ArduinoOficina Arduino
Oficina Arduino
 
Por que Python? Vamos Conhecer? Vamos Aprender?
Por que Python? Vamos Conhecer? Vamos Aprender?Por que Python? Vamos Conhecer? Vamos Aprender?
Por que Python? Vamos Conhecer? Vamos Aprender?
 
Fancy pants
Fancy pantsFancy pants
Fancy pants
 
Gerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarmanGerenciamento de Backups PostgreSQL com pgbarman
Gerenciamento de Backups PostgreSQL com pgbarman
 
PostgreSQL: O melhor banco de dados Universo
PostgreSQL: O melhor banco de dados UniversoPostgreSQL: O melhor banco de dados Universo
PostgreSQL: O melhor banco de dados Universo
 
Edital de seleção de projetos bb
Edital de seleção de projetos bbEdital de seleção de projetos bb
Edital de seleção de projetos bb
 
Cartilha PNHR Banco do Brasil
Cartilha PNHR Banco do BrasilCartilha PNHR Banco do Brasil
Cartilha PNHR Banco do Brasil
 
Padronização de Nomenclatura para Banco de Dados
Padronização de Nomenclatura para Banco de DadosPadronização de Nomenclatura para Banco de Dados
Padronização de Nomenclatura para Banco de Dados
 
Apresentação do Banco do Brasil no Agrocafé 2012
Apresentação do Banco do Brasil no Agrocafé 2012Apresentação do Banco do Brasil no Agrocafé 2012
Apresentação do Banco do Brasil no Agrocafé 2012
 
Essência Banco do Brasil
Essência Banco do BrasilEssência Banco do Brasil
Essência Banco do Brasil
 
Palestra GestãO De Projetos Tecnologia Do Bb
Palestra GestãO De Projetos   Tecnologia Do BbPalestra GestãO De Projetos   Tecnologia Do Bb
Palestra GestãO De Projetos Tecnologia Do Bb
 
Uso de Analisadores em Linhas em Plantas de Petróleo e Gás
Uso de Analisadores em Linhas em Plantas de Petróleo e GásUso de Analisadores em Linhas em Plantas de Petróleo e Gás
Uso de Analisadores em Linhas em Plantas de Petróleo e Gás
 
Modelagem de dados
Modelagem de dadosModelagem de dados
Modelagem de dados
 
PgconfSV compression
PgconfSV compressionPgconfSV compression
PgconfSV compression
 
Banco do Brasil: Linhas de crédito para agronegócio
Banco do Brasil: Linhas de crédito para agronegócioBanco do Brasil: Linhas de crédito para agronegócio
Banco do Brasil: Linhas de crédito para agronegócio
 
Bb crédito rural
Bb crédito ruralBb crédito rural
Bb crédito rural
 
Melhores práticas em gerenciamento de projetos
Melhores práticas em gerenciamento de projetosMelhores práticas em gerenciamento de projetos
Melhores práticas em gerenciamento de projetos
 
Bb roteiro projeto completo Credito Rural
Bb roteiro projeto completo Credito Rural Bb roteiro projeto completo Credito Rural
Bb roteiro projeto completo Credito Rural
 

Ähnlich wie Melhores práticas para projeto de banco de dados PostgreSQL

Alto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLAlto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLJonas Silveira
 
ODI SERIES - Melhores Práticas
ODI SERIES - Melhores PráticasODI SERIES - Melhores Práticas
ODI SERIES - Melhores PráticasCaio Lima
 
Fazendo Um Elefante Passar Debaixo da Porta - FISL
Fazendo Um Elefante Passar Debaixo da Porta - FISLFazendo Um Elefante Passar Debaixo da Porta - FISL
Fazendo Um Elefante Passar Debaixo da Porta - FISLFabio Telles Rodriguez
 
Sql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumoSql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumoHelder Lopes
 
Performance Sql Server
Performance Sql ServerPerformance Sql Server
Performance Sql Serverjarlei
 
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGIFazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGIFabio Telles Rodriguez
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQlCezar Souza
 
24H PASS PT-BR 10 Dicas para escrever códigos t-sql melhores
24H PASS PT-BR 10 Dicas para escrever códigos t-sql melhores24H PASS PT-BR 10 Dicas para escrever códigos t-sql melhores
24H PASS PT-BR 10 Dicas para escrever códigos t-sql melhoresRodrigo Crespi
 
6338 111121071604-phpapp01
6338 111121071604-phpapp016338 111121071604-phpapp01
6338 111121071604-phpapp01Gilson Figueredo
 
Fazendo uma manada de elefantes passar por baixo da porta
Fazendo uma manada de elefantes passar por baixo da portaFazendo uma manada de elefantes passar por baixo da porta
Fazendo uma manada de elefantes passar por baixo da portaFabio Telles Rodriguez
 
Fazendo Um Elefante Passar Debaixo da Porta - PGCon-BR
Fazendo Um Elefante Passar Debaixo da Porta - PGCon-BRFazendo Um Elefante Passar Debaixo da Porta - PGCon-BR
Fazendo Um Elefante Passar Debaixo da Porta - PGCon-BRFabio Telles Rodriguez
 
Utilização de Seletividade e Estimativa de Custo na Otimização de Consultas
Utilização de Seletividade e Estimativa de Custo na Otimização de ConsultasUtilização de Seletividade e Estimativa de Custo na Otimização de Consultas
Utilização de Seletividade e Estimativa de Custo na Otimização de ConsultasDenilson Sousa
 

Ähnlich wie Melhores práticas para projeto de banco de dados PostgreSQL (20)

Dojo banco de dados
Dojo   banco de dadosDojo   banco de dados
Dojo banco de dados
 
Alto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQLAlto desempenho com banco de dados MySQL
Alto desempenho com banco de dados MySQL
 
ODI SERIES - Melhores Práticas
ODI SERIES - Melhores PráticasODI SERIES - Melhores Práticas
ODI SERIES - Melhores Práticas
 
Fazendo Um Elefante Passar Debaixo da Porta - FISL
Fazendo Um Elefante Passar Debaixo da Porta - FISLFazendo Um Elefante Passar Debaixo da Porta - FISL
Fazendo Um Elefante Passar Debaixo da Porta - FISL
 
Sql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumoSql básico - Teoria e prática: Um grande resumo
Sql básico - Teoria e prática: Um grande resumo
 
Performance Sql Server
Performance Sql ServerPerformance Sql Server
Performance Sql Server
 
Db2
Db2Db2
Db2
 
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGIFazendo Um Elefante Passar Debaixo da Porta - CONSEGI
Fazendo Um Elefante Passar Debaixo da Porta - CONSEGI
 
pgDay Campinas – 2015
pgDay Campinas – 2015pgDay Campinas – 2015
pgDay Campinas – 2015
 
Minicurso PostgreSQl
Minicurso PostgreSQlMinicurso PostgreSQl
Minicurso PostgreSQl
 
24H PASS PT-BR 10 Dicas para escrever códigos t-sql melhores
24H PASS PT-BR 10 Dicas para escrever códigos t-sql melhores24H PASS PT-BR 10 Dicas para escrever códigos t-sql melhores
24H PASS PT-BR 10 Dicas para escrever códigos t-sql melhores
 
Sql
SqlSql
Sql
 
6338 111121071604-phpapp01
6338 111121071604-phpapp016338 111121071604-phpapp01
6338 111121071604-phpapp01
 
Introdução ao SQL
Introdução ao SQLIntrodução ao SQL
Introdução ao SQL
 
PostgreSQL Conceitos e aplicações
PostgreSQL  Conceitos e aplicaçõesPostgreSQL  Conceitos e aplicações
PostgreSQL Conceitos e aplicações
 
Access
AccessAccess
Access
 
Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016
 
Fazendo uma manada de elefantes passar por baixo da porta
Fazendo uma manada de elefantes passar por baixo da portaFazendo uma manada de elefantes passar por baixo da porta
Fazendo uma manada de elefantes passar por baixo da porta
 
Fazendo Um Elefante Passar Debaixo da Porta - PGCon-BR
Fazendo Um Elefante Passar Debaixo da Porta - PGCon-BRFazendo Um Elefante Passar Debaixo da Porta - PGCon-BR
Fazendo Um Elefante Passar Debaixo da Porta - PGCon-BR
 
Utilização de Seletividade e Estimativa de Custo na Otimização de Consultas
Utilização de Seletividade e Estimativa de Custo na Otimização de ConsultasUtilização de Seletividade e Estimativa de Custo na Otimização de Consultas
Utilização de Seletividade e Estimativa de Custo na Otimização de Consultas
 

Mehr von Juliano Atanazio

PL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLPL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLJuliano Atanazio
 
PostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords SafelyPostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords SafelyJuliano Atanazio
 
Neutralizing SQL Injection in PostgreSQL
Neutralizing SQL Injection in PostgreSQLNeutralizing SQL Injection in PostgreSQL
Neutralizing SQL Injection in PostgreSQLJuliano Atanazio
 
Postgresql + Python = Power!
Postgresql + Python = Power!Postgresql + Python = Power!
Postgresql + Python = Power!Juliano Atanazio
 
Full Text Search - Busca Textual no PostgreSQL
Full Text Search -  Busca Textual no PostgreSQLFull Text Search -  Busca Textual no PostgreSQL
Full Text Search - Busca Textual no PostgreSQLJuliano Atanazio
 

Mehr von Juliano Atanazio (7)

PL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLPL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQL
 
Por que FreeBSD?
Por que FreeBSD?Por que FreeBSD?
Por que FreeBSD?
 
PostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords SafelyPostgreSQL: How to Store Passwords Safely
PostgreSQL: How to Store Passwords Safely
 
Neutralizing SQL Injection in PostgreSQL
Neutralizing SQL Injection in PostgreSQLNeutralizing SQL Injection in PostgreSQL
Neutralizing SQL Injection in PostgreSQL
 
Postgresql + Python = Power!
Postgresql + Python = Power!Postgresql + Python = Power!
Postgresql + Python = Power!
 
Por que PostgreSQL?
Por que PostgreSQL?Por que PostgreSQL?
Por que PostgreSQL?
 
Full Text Search - Busca Textual no PostgreSQL
Full Text Search -  Busca Textual no PostgreSQLFull Text Search -  Busca Textual no PostgreSQL
Full Text Search - Busca Textual no PostgreSQL
 

Melhores práticas para projeto de banco de dados PostgreSQL

  • 1. Juliano Atanazio Boas Práticas em um Projeto de Banco de Dados
  • 2. 2/41 Antes de Tudo... Conheça bem: ● seu hardware; ● seu sistema operacional; ● as entidades tratadas na base de dados.
  • 3. 3/41 Servidores ● Mantenha em servidores separados a aplicação que acessa o banco e o servidor de banco de dados; ● É mais seguro e evita competição de recursos entre os serviços; ● No servidor de banco de dados ter no mínimo discos separados para sistema operacional, dados e logs de transação; ● Configure apropriadamente logs do servidor de aplicação e do servidor de banco de dados; ● Não deixe o servidor de banco de dados exposto na Internet; ● Ter estratégias de backup e alta disponibilidade.
  • 4. 4/41 O Projeto de Banco de Dados ● Investir não é gastar...; ● Invista seu tempo para uma modelagem e projeto de banco de dados bem feita; ● Pense como uma construção de um prédio, pois o projeto de banco de dados é um dos alicerces para seu sistema; ● É melhor prevenir do que remediar, pois o tempo investido para uma modelagem bem consolidada será recompensado em não ter que fazer manutenções (desnecessárias, a priori) e ter que projetar novamente mais tarde, pois aí seria gasto muito mais tempo do que o investido no início; ● Para o projeto da base de dados deve-se trabalhar em conjunto DBAs, desenvolvedores e gestores de projetos.
  • 5. 5/41 Nomenclaturas de Objetos ● Seja qual for o padrão adotado, siga-o até o fim!; ● Prefixos / sufixos: utilizar ou não? Bases de Dados, tabelas, views, triggers, etc... adote iniciais, tais como db_, tb_, vw_, tg_... Considere os prós e contras, mas não misture!; ● Utilizar nomes amigáveis para os objetos conforme a entidade tratada; ● Nomes de tabelas no singular; ● Jamais utilizar acentuação ou qualquer caractere especial;
  • 6. 6/41 Nomenclaturas de Objetos ● Não utilizar nomes com espaços e / ou letras maiúsculas; ● Para nomes de campos, se possível utilizar o mesmo nome para a chave primária em todas as tabelas, como “id” ou “cod”, por exemplo; ● Campos que têm o mesmo propósito em tabelas diferentes, preferencialmente ter o mesmo nome; ● Nomes de campos também devem ser padronizados; ● Evite coisas como na tabela “A” há um campo “data_inicio” e na tabela “B” o campo se chama “data_ini”...
  • 7. 7/41 Usuários / Grupos / Papéis ● Dê o mínimo de privilégios necessários para cada usuário conforme o objeto que acessa ou usa; ● Utilize grupos de usuários para facilitar sua gestão, agrupando- os por algum setor e / ou características em comum; ● Alguns parâmetros de configuração (os de sessão) podem servir de configuração para um papel (role) específico e dependendo do caso, conforme a necessidade é bom fazê-lo. Por exemplo, um usuário que precisa ser sempre auditado: ALTER ROLE foo SET log_statement = 'all';
  • 8. 8/41 Views ● Views podem ser grandes aliadas; ● Podem ser utilizadas para isolar alterações da base de dados da aplicação, reduzindo a necessidade de manutenção se houver alteração na base dados; ● Podem também ser utilizadas para prover acesso granular a usuários.
  • 9. 9/41 ORMs ● Não confie cegamente neles. ● Utilize-os com moderação, de forma que se tenha o total controle e total conhecimento sobre sua base. ● Evite transações implícitas, ORMs têm o costume deixar cada comando (statement) ser tratado como uma transação resultando em perda de performance. Desabilite transações explícitas e quando precisar de uma transação faça-a explicitamente.
  • 10. 10/41 Documentação ● Documente o esquema da base em esquemas de Entidade- Relacionamento; ● Escreva comentários em seus scripts declarando cada ação de cada comando; ● Utilize comentários de objetos (descrição de objetos).
  • 11. 11/41 Tablespaces ● Tabelas e índices cuja utilização e / ou tamanho sejam muito maiores do que os outros é melhor deixar em disco(s) separado(s); ● A partição de tablespace deve ser formatada com um sistema de arquivos primeiramente seguro contra falhas (crashes) e com boa performance de escrita e leitura.
  • 12. 12/41 Índices ● Crie índices para campos que são utilizados em condições de consultas, ou pelo menos as consultas mais frequentes; ● Crie índices para campos de chaves estrangeiras e em campos envolvidos como critérios de junção (JOIN); ● Se houver uma consulta frequente utilize índices parciais com sua condição conforme a consulta; ● Para consultas que buscam faixas de valores é bom ter um índice clusterizado para isso;
  • 13. 13/41 Índices ● Fillfactor (fator de preenchimento) para um índice é a porcentagem que determina como o método de indexação encherá as páginas de índices. O quão cheias essas páginas ficarão em porcentagem; ● Para tabelas estáticas pode-se deixar em 100 (representando 100%); ● Para tabelas que sofrem muitas alterações um valor de 80 ou menos pode ser mais adequado, mas quanto menor for o fator de preenchimento, mais espaço em disco ocupará.
  • 14. 14/41 Evite BLOBs ● Utilize campos bytea, pois BLOBs são armazenados em um catálogo do sistema (pg_largeobject). ● Com campos bytea têm-se a flexibilidade de determinar em qual tabela de sua base de dados o objeto será armazenado. ● Não criar campos bytea em tabelas muito utilizadas, crie uma tabela exclusiva para grandes objetos para ser referenciada.
  • 15. 15/41 Integridade de Dados ● Utilize constraints (foreign key, check, not null), não deixe o controle total para a aplicação. ● Evite dados inconsistentes em seu banco de dados, como um preço negativo de um produto, por exemplo.
  • 16. 16/41 Consultas ● Evite o famoso SELECT *... ● Para um melhor desempenho declare cada campo que precisar para buscar os dados; ● Evite caracteres curinga com a cláusula LIKE. Isso faz com que o motor do banco de dados não use indexação para uma busca, o que leva a uma performance degradada; ● Pagine sua busca, faça uso de LIMIT e OFFSET, pois não faz sentido uma busca retornar um número exorbitante de linhas. Consome muitos recursos e degrada a performance. Um número razoável é de até 100 (cem) linhas retornadas por vez.
  • 17. 17/41 Chaves Primárias ● Sempre tenha uma chave primária na tabela; ● Quando possível fazer uso de chaves naturais; ● Prefira tipos numéricos a tipos de texto, pois consomem menos recursos e são mais rápidos para busca.
  • 18. 18/41 Esquemas ● Para a mesma aplicação, que trata das mesmas coisas evite criar mais de uma base de dados; ● Faça uso de schemas para organizar seus objetos.
  • 19. 19/41 Tipos de Dados Não dê tiros em formiga! ● Escolha o tipo certo para sua coluna; ● Consulte a documentação do PostgreSQL [1] verificando se o tipo de dados escolhido é realmente o mais adequado para não derperdiçar recursos. [1] http://www.postgresql.org/docs/current/static/datatype.html
  • 20. 20/41 Tipos de Dados: pg_type_of e pg_column_size A função pg_typeof pode te ajudar a descobrir um tipo de um dado: > SELECT pg_typeof(5874.31); pg_typeof ----------- numeric A função pg_column_size exibe em bytes o tamanho de um dado Quantos bytes em numeric?: > SELECT pg_column_size(5874.31::numeric); pg_column_size ---------------- 10
  • 21. 21/41 Tipos de Dados: pg_type_of e pg_column_size Quantos bytes em money?: > SELECT pg_column_size(5874.31::money); pg_column_size ---------------- 8
  • 22. 22/41 Tipos de Dados: Endereço IP Como text: > SELECT pg_column_size('192.168.7.1'::text); pg_column_size ---------------- 15 Como inet: > SELECT pg_column_size('192.168.7.1'::inet); pg_column_size ---------------- 10
  • 23. 23/41 Tipos de Dados: Endereço de Rede com Máscara Como text: > SELECT pg_column_size('192.168.7.0/24'::text); pg_column_size ---------------- 18 Como cidr: > SELECT pg_column_size('192.168.7.0/24'::cidr); pg_column_size ---------------- 10
  • 24. 24/41 Tipos de Dados: MAC Address Como text: > SELECT pg_column_size('00:00:00:00:00:00'::text); pg_column_size ---------------- 21 Como macaddr: > SELECT pg_column_size('00:00:00:00:00:00'::macaddr); pg_column_size ---------------- 6
  • 25. 25/41 Tipos de Dados: Inteiros (int2, int4 e int8) Criação de tabela com três campos inteiros (smallint, integer e bigint): SELECT generate_series(1, 10000)::int2 campo_int2, generate_series(1, 10000)::int4 campo_int4, generate_series(1, 10000)::int8 campo_int8 INTO tb_inteiros;
  • 26. 26/41 Tipos de Dados: Inteiros (int2, int4 e int8) Quanto cada coluna ocupa em disco: SELECT pg_size_pretty(sum(pg_column_size(campo_int2))) "smallint", pg_size_pretty(sum(pg_column_size(campo_int4))) "integer", pg_size_pretty(sum(pg_column_size(campo_int8))) "bigint" FROM tb_inteiros; smallint | integer | bigint ----------+---------+-------- 20 kB | 39 kB | 78 kB
  • 27. 27/41 Tipos de Dados: Inteiros vs Texto Criação de um banco de dados de teste: > CREATE DATABASE db_teste; Conexão ao banco: > c db_teste
  • 28. 28/41 Tipos de Dados: Inteiros vs Texto Criação de uma tabela de teste: > CREATE TABLE tb_teste_tipos_de_dados( campo_int2 smallint, campo_int4 int, campo_int8 bigint, campo_text text, campo_varchar_10 varchar(10), campo_char_10 char(10) );
  • 29. 29/41 Tipos de Dados: Inteiros vs Texto Criação de índices: > CREATE INDEX idx_campo_int2 ON tb_teste_tipos_de_dados (campo_int2); > CREATE INDEX idx_campo_int4 ON tb_teste_tipos_de_dados (campo_int4); > CREATE INDEX idx_campo_int8 ON tb_teste_tipos_de_dados (campo_int8); > CREATE INDEX idx_campo_text ON tb_teste_tipos_de_dados (campo_text); > CREATE INDEX idx_campo_varchar_10 ON tb_teste_tipos_de_dados (campo_varchar_10); > CREATE INDEX idx_campo_char_10 ON tb_teste_tipos_de_dados (campo_char_10);
  • 30. 30/41 Tipos de Dados: Inteiros vs Texto Para os testes vamos criar um script em Python (pg_populator.py) com o seguinte conteúdo: #!/usr/bin/env python #_*_ coding: utf8 _*_ import random import sys import csv # Quantidade de linhas n_lines = int(sys.argv[1]) try: # Nome do arquivo de saída out_file = sys.argv[2] except IndexError: # Se nenhum arquivo for informado, enviar # para a saída padrão out_file = '/dev/stdout'
  • 31. 31/41 Tipos de Dados: Inteiros vs Texto for i in xrange(n_lines): # Variáveis com conteúdo aleatório conforme os # campos da tabela int2 = random.randint(-32768, 32767) int4 = random.randint(-2147483648, 2147483647) int8 = random.randint(-9223372036854775808, 9223372036854775807) text = str(int8)[0: 9].zfill(10) varchar_10 = text char_10 = text line = (int2, int4, int8, text, varchar_10, char_10) with open(out_file, 'ab') as csvfile: spamwriter = csv.writer(csvfile, delimiter = ';') spamwriter.writerow(line)
  • 32. 32/41 Tipos de Dados: Inteiros vs Texto Damos permissão de execução para ele no shell do Linux: $ chmod +x pg_populator.py Gerando um arquivo CSV com dez milhẽs de registros: $ ./pg_populator.py 10000000 /tmp/arquivo.csv Importar para o banco: $ psql -c "COPY tb_teste_tipos_de_dados FROM '/tmp/arquivo.csv' DELIMITER ';';" db_teste
  • 33. 33/41 Tipos de Dados: Inteiros vs Texto Verificando o tamanho da tabela: > SELECT pg_size_pretty(pg_relation_size('tb_teste_tipos_de_dados')) AS "Tamanho da tabela"; Tamanho da tabela ------------------- 766 MB Qual é o tamanho do índice do campo smallint?: > SELECT pg_size_pretty(pg_relation_size('idx_campo_int2')) AS "Tamanho do índice do campo smallint"; Tamanho do índice do campo smallint ------------------------------------- 223 MB
  • 34. 34/41 Tipos de Dados: Inteiros vs Texto Qual é o tamanho do índice do campo integer?: > SELECT pg_size_pretty(pg_relation_size('idx_campo_int4')) AS "Tamanho do índice do campo integer"; Tamanho do índice do campo integer ------------------------------------ 224 MB Qual é o tamanho do índice do campo bigint?: > SELECT pg_size_pretty(pg_relation_size('idx_campo_int8')) AS "Tamanho do índice do campo bigint"; Tamanho do índice do campo bigint ----------------------------------- 279 MB
  • 35. 35/41 Tipos de Dados: Inteiros vs Texto Qual é o tamanho do índice do campo text?: > SELECT pg_size_pretty(pg_relation_size('idx_campo_text')) AS "Tamanho do índice do campo text"; Tamanho do índice do campo text --------------------------------- 333 MB Qual é o tamanho do índice do campo varchar(10)?: > SELECT pg_size_pretty(pg_relation_size('idx_campo_varchar_10')) AS "Tamanho do índice do campo varchar(10)"; Tamanho do índice do campo varchar(10) ---------------------------------------- 333 MB
  • 36. 36/41 Tipos de Dados: Inteiros vs Texto Qual é o tamanho do índice do campo char(10)?: > SELECT pg_size_pretty(pg_relation_size('idx_campo_char_10')) AS "Tamanho do índice do campo char(10)"; Tamanho do índice do campo char(10) ------------------------------------- 333 MB
  • 37. 37/41 Tipos de Dados: Inteiros vs Texto Tamanho de cada coluna: SELECT pg_size_pretty(sum(pg_column_size(campo_int2))) "smallint", pg_size_pretty(sum(pg_column_size(campo_int4))) "integer", pg_size_pretty(sum(pg_column_size(campo_int8))) "bigint", pg_size_pretty(sum(pg_column_size(campo_text))) "text", pg_size_pretty(sum(pg_column_size(campo_varchar_10))) "varchar(10)", pg_size_pretty(sum(pg_column_size(campo_char_10))) "char(10)" FROM tb_teste_tipos_de_dados; smallint | integer | bigint | text | varchar(10) | char(10) ----------+---------+--------+--------+-------------+---------- 19 MB | 38 MB | 76 MB | 105 MB | 105 MB | 105 MB
  • 38. 38/41 Tipos de Dados: Inteiros vs Texto Resumo Tamanho dos Índices (MB) Tamanho de cada coluna (MB) smallint 223 19 integer 224 38 bigint 279 76 text 333 105 varchar (10) char(10
  • 39. 39/41 Doe! O Elefante precisa de você! Contribua! :) http://www.postgresql.org/about/donate/
  • 41. 41/41 Até a próxima!!! :) Juliano Atanazio juliano777@gmail.com https://juliano777.wordpress.com http://www.slideshare.net/spjuliano https://speakerdeck.com/julianometalsp https://br.linkedin.com/pub/juliano-atanazio/2b/951/ab9