terça-feira, 31 de julho de 2007

Indexação no PostgreSQL - II

O PostgreSQL oferece atualmente quatro tipos de indexação:

- B-Tree - Cria índices baseados em árvores B. É o tipo padrão empregado na criação de índices. Facilita consultas utilizando a igualdade de valores ou intervalos de valores (>= > = < <=).

- Hash - Índices Hashing organizam um banco de dados com base em funções. O índice hash funciona em comparações de igualdade (=). Em virtude desta limitação e do fato das operações com Índices Hash atualmente não serem logadas, demandando a reorganização manual de índices após falhas no banco, este índice tem o seu uso desencorajado. No entanto, o uso de índices hash geralmente apresenta resultados melhores que os feitos com B-tree.

- GiST - Índices GiST (Generalized Search Tree) oferecem uma infra-estrutura sobre a qual podem ser implementadas consultas. Geram uma árvore de pesquisa balanceada versátil similar a uma árvore B que pode ser utilizada com estruturas de dados definidas pelo usuário e em implementações diversas como índices para cubos Olap, árvores R (R-Trees) e em busca em texto. Internamente é composta por nós que apresentam pares (Valor, ponteiro para dado indexado ou para outro nó).

- GIN - Índices GIN(Generalized Inverted Index) são estruturas invertidas que permitem acesso a dados com mais de uma chave, como arrays. É composto por uma lista de registros tipo (chave, lista de linhas que contém o valor da chave). Internamente cada índice GIN contém uma árvore B com base no valor da chave indexada, cujas folhas apontam para os valores das linhas relacionadas à chave. Busca em fulltext pode ser acelerada utilizando-se este recurso.

A documentação do PostgreSQL afirma que é possível ao usuário definir o próprio método de indexação, no entanto salienta que o processo é difícil.

Versões anteriores do PostgreSQL apresentavam o método R-Tree, que indexava dados com base em árvores R, mas o mesmo foi removido por não apresentar quaisquer vantagens em relação a índices GiST, que é a principal opção para a sua substituição.

Vamos aos comandos!

Indexação no PostgreSQL - I

Índices são objetos criados em um banco de dados que facilitam o acesso a dados em um banco, com ganho de desempenho nas consultas realizadas. Os índices são definidos sobre uma ou mais colunas das tabelas armazenadas, criando estruturas de acesso mais rápidas com base nos campos selecionados.

São bastante utilizados e apresentam bons resultados no PostgreSQL, embora a má utilização possa retardar ao invés de acelerar as rotinas de banco de dados.

A criação, exclusão e alteração de índices no PostgreSQL são feitas através dos comandos:
- CREATE INDEX
- DROP INDEX
- ALTER INDEX

Podem ser criados índices parciais, isto é, índices que não abrangem todos os dados, mas apenas subconjuntos definidos com uma cláusula WHERE, recurso avançado ainda pouco conhecido e empregado, mas com grande potencial de utilização.

segunda-feira, 30 de julho de 2007

PostgreSQL x MySql X Oracle: Empate Técnico?

Pelo menos é o que sugere o último benchmark feito pela SUN. O benchmark envolveu testes de desempenho comparando as ferramentas.

No quesito performance os bancos estão se aproximando, com o MySql ganhando em robustez e o PostgreSql aumentando seu desempenho com implementações mais otimizadas e novos métodos de indexação, processamento de consultas e algoritmos internos. E o Oracle, um SENHOR BANCO DE DADOS, não tem do que se queixar. É uma ótima solução para as empresas, com uma grande equipe e muitos usuários pelo mundo.

Quem ganha com isso somos nós, os usuários. É engraçado ver um elefante alcançar a velocidade de um golfinho. Minha opinião é que o PostgreSQL é o que mais tem crescido. O que você acha?

Quer conferir?

- Blog do Telles - Savepoint

- Comentários de Josh Berkus, líder de desenvolvimento do PostgreSql

- Blog do Kevin Closson com o Ponto de Vista da Oracle

quinta-feira, 26 de julho de 2007

O Comando COPY

Este comando realiza a cópia de dados entre tabelas e arquivos. É muito utilizada para fazer cargas de dados e implementar rotinas de backup e migrações de bancos de dados. Não faz parte da especificação tradicional do SQL.

A sintaxe com a cláusula TO extrai de uma tabela seus dados e os armazena em um arquivo texto. A sintaxe com FROM lê um arquivo texto, binário ou CSV (texto separado por vírgulas) para uma tabela.

O COPY pode ser empregado um comando Select ou cláusula Values para ganho de maior controle sobre os dados gravados/ lidos.

Adicionalmente pode substituir delimitadores nos arquivos gerados e definir caracteres que substituam valores nulos.

Sintaxe:

COPY tablename [ ( column [, ...] ) ]
FROM { 'filename' | STDIN }
[ [ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] 'delimiter' ]
[ NULL [ AS ] 'null string' ]
[ CSV [ HEADER ]
[ QUOTE [ AS ] 'quote' ]
[ ESCAPE [ AS ] 'escape' ]
[ FORCE NOT NULL column [, ...] ]

COPY { tablename [ ( column [, ...] ) ] | ( query ) }
TO { 'filename' | STDOUT }
[ [ WITH ]
[ BINARY ]
[ HEADER ]
[ OIDS ]
[ DELIMITER [ AS ] 'delimiter' ]
[ NULL [ AS ] 'null string' ]
[ CSV [ HEADER ]
[ QUOTE [ AS ] 'quote' ]
[ ESCAPE [ AS ] 'escape' ]
[ FORCE QUOTE column [, ...] ]

Exemplos de COPY de tabela para arquivo:

1 - Sintaxe que lê dados da tabela tstdel e os grava no arquivo teste.txt. Por padrão, o arquivo é criado em modo texto e a separação dos dados no arquivo gerado é feita por tabulações. Valores nulos são gravados como o caracter '\N'.

COPY tstdel TO 'c://teste.txt';

Arquivo gerado:
1 Teste1 2007-07-26 14:35:14
2 Teste2 2007-07-26 14:35:14
3 Teste3 2007-07-26 14:35:14
4 Teste4 2007-07-26 14:35:14
5 Teste5 2007-07-26 14:35:14
6 \N \N

2 - Usando o caracter '|' para separar os campos do arquivo gerado. A cláusula WITH é opcional.

COPY tstdel TO 'c://teste.txt' WITH DELIMITER '|';

Arquivo gerado:

1|Teste1|2007-07-26 14:35:14
2|Teste2|2007-07-26 14:35:14
3|Teste3|2007-07-26 14:35:14
4|Teste4|2007-07-26 14:35:14
5|Teste5|2007-07-26 14:35:14
6|\N|\N


3 - COPY gerando arquivo binário. O arquivo é criado mais rapidamente que em modo texto, mas a portabilidade pode ser menor entre versões do PostgreSQL ou em relação a outros bancos.

COPY tstdel TO 'c://teste.txt' BINARY;

4- A geração de arquivo pode causar problemas com valores nulos. Esta sintaxe troca valores nulos por um caracter "*".

COPY tstdel TO 'c://teste.txt' NULL '*';

5 - O COPY permite a escolha de um conjunto de colunas. Exemplo de cópia das colunas cod e nome.

COPY tstdel (cod, nome) TO 'c://teste.txt';

6 - Uso de select para definir os conjuntos de dados a serem copiados.

COPY (select * from tstdel where cod <= 500) TO 'c://teste.txt';

7 - Geração de arquivos em formato CSV.

COPY tstdel TO 'c://teste.txt' CSV;

8 - Geração de arquivos em formato CSV com HEADER, um cabeçalho com o nome das colunas.

COPY tstdel TO 'c://teste.txt' CSV HEADER;

Arquivo gerado:

cod,nome,date
1,Teste1,2007-07-26 14:35:14
2,Teste2,2007-07-26 14:35:14
3,Teste3,2007-07-26 14:35:14
4,Teste4,2007-07-26 14:35:14
5,Teste5,2007-07-26 14:35:14
6,,

Exemplos de COPY de arquivo (criado com COPY FROM) para tabela:

1 - Sintaxe que lê o arquivo teste.xtx e grava seus dados na tabela tstdel. Por padrão é feita a cópia de arquivo texto com um registro por linha, e campos separados por tabulações.

COPY tstdel FROM 'c://teste.txt';

2 - Sintaxe que lê e recupera um arquivo binário. Caso o arquivo lido não seja no formato esperado, é emitida mensagem de erro.

COPY tstdel FROM 'c://teste.txt' BINARY;

3 - Sintaxe que lê e recupera um arquivo de dados, trocando os valores '*' por nulos.

COPY tstdel FROM 'c://teste.txt' NULL '*';

4 - Exemplo que recupera apenas as colunas cod e nome.

COPY tst2 (cod, nome) FROM 'c://teste.txt';

5 - Definindo conjuntos de dados a serem copiados através de select. Uma cláusula VALUES também poderia ser empregada.

COPY (select * from tstdel where cod <= 500) FROM 'c://teste.txt';

6 - COPY Lendo arquivos CSV.

COPY tstdel FROM 'c://teste.txt' CSV;

7 - Lendo arquivos CSV com HEADER.

COPY tstdel FROM 'c://teste.txt' CSV HEADER;

Ferramenta de Modelagem - MicroOlap Database Designer for PostgreSQL - II

"Leandro Guimarães Faria Corcete DUTRA disse...
Ele suporta domínios, versionamento e vários SGBDs?"

Com relação ao questionamento do Leandro:

- A ferramenta Microolap apresenta um gerenciador/ construtor de domínios e tipos do usuário que facilita bastante a utilização destes recursos nos projetos. O que não encontrei que poderia ser adicionado foi uma biblioteca com alguns exemplos e tipos úteis. Fica como sugestão para eles.



- Não encontrei suporte a múltiplos bancos de dados. Pelo que constatei, cada diagrama pode conter apenas um database. É de certa forma uma limitação.

- O versionamento teria de ser feito através de ferrementa à parte, como Clearcase, CVL ou Source Safe, pois o MicroOlap mantém apenas uma versão dos modelos. O máximo que ele faz é criar uma "stamp", que apresentaria o versionamento do diagrama, mas neste caso a versão seria apenas um número ao qual pode ser acrescentado um auto incremento.

Por enquanto é só.

segunda-feira, 23 de julho de 2007

Ferramenta de Modelagem - MicroOlap Database Designer for PostgreSQL

Para quem gosta de trabahar organizadamente com modelagem de dados, o MicroOlap é um software com bons recursos. O "MicroOlap Database Designer for PostgreSQL" é um shareware baseado em java que pode ser utilizado por 30 dias (full version!).



A primeira impressão que tive foi muito positiva quanto ao seu uso:
- Facilidade de utilização e rica interface visual (auto layout, zoom, diagramas visuais)
- O Instalador é fácil de usar e não chega a ter 6 megabytes
- A Engenharia reversa intuitiva e funcional



- Geração de bancos de dados conforme o modelo criado de forma bastante prática.
- Interfaces para administração de índices, tabelas, colunas, domínios, tablespaces, visões, etc.
- Checagem automática de modelos, identificando warnings e errors relacionados aos objetos.
- Suporte às características específicas do PostgreSql com herança de tabelas.

O instalador pode ser baixado em:

MicroOlap

A versão single user não está tão cara: $124.95 dólares.

Alguém está utilizando esta ferramenta em seus projetos? Quais são as suas impressões?

sábado, 21 de julho de 2007

PgCon Day 2007 em São Paulo!!!

Quem como eu perdeu a PgCon da Itália, tem uma nova chance de participar.

Uma versão Nacional do evento máximo do nosso banco de dados será realizada em São Paulo. Preparem os cobres e as licenças para ir à cidade que nunca dorme dias 07 e 08 de dezembro.
Mais informações no site do Telles (grato pela informação):

http://www.midstorm.org/~telles/2007/07/09/pgcon-e-outras-novidades/