segunda-feira, 28 de abril de 2008

Você Realmente Conhece a Versão 8.3 e suas Novidades?

Semana passada apresentei uma palestra com este tema e fiz um mapa mental com a ferramenta livre Freemind para organizar o conteúdo e dar uma estética melhor.

Coloquei as principais alterações da versão 8.3 e gerei uma imagem. Quem precisar, pode utilizá-la. Sugestões de melhoria também são bem vindas. Com certeza esqueci algum detalhe. As informações são da própria documentação do PostgreSQL.


sexta-feira, 18 de abril de 2008

101 Posts!

Este é o Post número 101 deste blog. Mais que um número, é uma conquista que credito a cada um dos freqüentadores. O que era o "Meu Blog" está cada dia mais se tornando um recurso da
comunidade, que colabora com idéias, textos, críticas, sugestões e com a divulgação deste link.

Dia 04/04/07, depois de uma resolução tomada no meu aniversário, resolvi começar este blog para me forçar a estar sempre estudando Banco de Dados, uma vez que ministrava uma disciplina na área e não era um verdadeiro DBA nos meus empregos (e também para conhecer o funcionamento interno de um blog!). Aos poucos o conteúdo foi se distanciando da disciplina, que não estou mais ensinando, e se tornou uma pequena base de dados sobre o PostgreSQL. Os acessos foram aumentando e sem querer fui conhecendo mais da comunidade do Banco de Dados do elefantinho.

O reconhecimento da comunidade tem sido recompensador, e fez com que este site sempre apareça entre os primeiros blogs de PostgreSQL a serem recuperados no Google, considerando não só o Brasil, mas todo o planeta. O número de links e referências a este site também cresceram bastante e atingiram algumas centenas, o que é raro em blogs tão específicos. É motivo para maior cuidado e para a busca de novas idéias para um constante aprimoramento. Convites para consultorias e treinamentos, que quase nunca posso atender, atestam que este veículo alcança um grande contingente de pessoas. Que bom!

(Pessoalmente, sou um grande usuário, pois consulto as notas que eu mesmo postei no blog quando estou em dúvida.)

Claro que existem dificuldades: cada vez menos tempo, mais responsabilidades no mundo fora da internet e uma maior dificuldade em ter novas idéias. Neste período, vários outros blogs surgiram e desapareceram. Muitos deles pararam no tempo, sem atualização, ou patinam sem conseguir conciliar qualidade e um bom ritmo. Mas o grande estímulo para oferecer algo, para difundir conhecimento tem ajudado nos momentos mais difíceis.

Se você está lendo este post, saiba que este é um espaço para:
- Divulgar seu site/ evento/ notícia de PostgreSQL
- Propor soluções de problemas
- Apresentar problemas e questionamentos
- Pesquisar
- Votar em enquetes (estou pensando em criar mais...)

Tentarei manter este espaço sempre atualizado e em sintonia com a evolução da tecnologia. Quero melhorar seus materiais e conto com a sua colaboração!

Espero poder continuar colaborando para que outras pessoas também se beneficiem por muito tempo ainda.

Agradeço a todos que lêem este post e a todos os freqüentadores do "Meu Blog de PostgreSQL".

sexta-feira, 11 de abril de 2008

Uso de UUIDs no PostgreSQL

Implementado no PostgreSQL 8.3, o tipo de dado UUID (Universally Unique Identifier) é pouco conhecido e pouco utilizado. Em post anterior, descrevi esta funcionalidade. Agora demonstrarei como a mesma foi implementada e como pode ser empregada para inserção e alteração de dados, consulta, dentro de funções e com tipos compostos.

Inicialmente, vamos criar uma tabela com campo do tipo UUID e fazer operações de inserção e consulta aos dados. A sintaxe se mantém a mesma para a inserção e alteração de dados. Campos UUID são similares a campos caractere, com a diferença de terem os caracteres "-" opcionais.

Um fato interessante é que o PostgreSQL não apresenta algoritmo padrão para a geração de UUIDs, uma vez que não foi obtido consenso sobre a melhor opção. Cabe ao desenvolvedor criar seu algoritmo e colocá-lo na aplicação ou no banco como função, ou obter um gerador de outras fontes.

--Criação de tabela com campo UUID e inserção de registros
CREATE TABLE uuid_test (identidade UUID);

INSERT INTO uuid_test VALUES ('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11');
INSERT INTO uuid_test VALUES ('12345678-9c0b-4ef8-bb6d-6bb9bd380a11');
INSERT INTO uuid_test VALUES ('82345678-9c0b-4ef8-bb6d-6bb9bd380a11');
INSERT INTO uuid_test VALUES ('723456789c0b4ef8bb6d6bb9bd380a11'); --Pode ser feita inserção sem os "-"

SELECT * FROM uuid_test;

--Consultas de UUID, incluindo consulta com conversão para UUID
SELECT '12345678-9c0b-4ef8-bb6d-6bb9bd380a11' = UUID('123456789c0b4ef8bb6d6bb9bd380a11');
SELECT UUID('12345678-9c0b-4ef8-bb6d-6bb9bd380a11'), UUID('123456789c0b4ef8bb6d6bb9bd380a11');
SELECT UUID('12345678-9c0b-4ef8-bb6d-6bb9bd380a11') = UUID('123456789c0b4ef8bb6d6bb9bd380a11');

Funções podem retornar dados do tipo UUID, inclusive em conjuntos de linhas (SETOF). Abaixo apresento duas funções, uma retornando um UUID simples e outra retornando um conjunto de linhas com UUIDs.

--Função SIMPLES que retorna tipo UUID
CREATE FUNCTION ret_uuid_simples () RETURNS uuid AS $$
BEGIN
RETURN '12345678-9c0b-4ef8-bb6d-6bb9bd380a11';
END;
$$ LANGUAGE plpgsql;

SELECT * FROM ret_uuid_simples();

--Função que retorna tipo UUID
CREATE FUNCTION ret_uuid () RETURNS SETOF uuid AS $$
BEGIN
RETURN QUERY SELECT identidade FROM uuid_test LIMIT 1;
RETURN;
END;
$$ LANGUAGE plpgsql;

SELECT * FROM ret_uuid();

O tipo de dado UUID pode ser utilizado na construção de tipos que podem ser reaproveitados.

--Uso de UUID em tipos
CREATE TYPE pessoa_uuid AS (nome varchar(50), ident UUID);

CREATE table ALUNO_UUID (
nomealu pessoa_uuid NOT NULL,
nasc date,
serie int);

INSERT INTO ALUNO_UUID VALUES (('Carla Paulina','82345678-9c0b-4ef8-bb6d-6bb9bd380a11'), '12/12/2001',1);

SELECT * FROM ALUNO_UUID;
SELECT nomealu, (nomealu).nome, (nomealu).ident FROM ALUNO_UUID;

quinta-feira, 10 de abril de 2008

RETURN QUERY - Novo recurso do PostgreSQL 8.3

A cláusula RETURN QUERY permite que o programador faça uma função que retorne um conjunto de linhas. Foi acrescentada no PostgreSQL 8.3, permitindo maior versatilidade nas implementações.

Para ilustrar esta funcionalidade, vamos criar e popular uma tabela:

CREATE TABLE FUNCTESTE (
cod serial primary key, nome varchar(50), aniversario date default now());
INSERT INTO FUNCTESTE VALUES (1, 'Cláudio', DEFAULT);
...
INSERT INTO FUNCTESTE VALUES (10, 'Ana Cláudia', '01/01/2008');


Vamos retornar um conjunto de linhas utilizando a cláusula RETURN QUERY dentro de uma função. Observe que o código da função abaixo retorna um conjunto de linhas (SETOF) que tem de ser iguais aos campos da tabela FUNCTESTE:

--Retornando consulta de várias linhas com FOR
CREATE OR REPLACE FUNCTION ret_rows () RETURNS SETOF FUNCTESTE AS $$
BEGIN
RETURN QUERY SELECT * FROM FUNCTESTE; -- Acrescenta um conjunto de linhas ao retorno da função
RETURN ; -- Retorna as linhas
END;
$$ LANGUAGE plpgsql;

Para testar a função:

select * from ret_rows();


Em uma função, o RETURN QUERY pode ser utilizado mais de uma vez, mas o retorno feito com RETURN; ´faz a descarga dos valores de uma vez só.

--Retornando a mesma consulta várias vezes com WHILE
CREATE OR REPLACE FUNCTION ret_rows_while () RETURNS SETOF FUNCTESTE AS $$
DECLARE
i INTEGER :=1;
BEGIN
WHILE i <= 5 LOOP
RETURN query SELECT * FROM FUNCTESTE LIMIT 1; --Consulta a ser repetida
i:= i + 1;
END LOOP;
RETURN ;
END;
$$ LANGUAGE plpgsql;

Pode ser retornado um conjunto de elementos de qualquer valor.

--Retornando consulta de vários resultados do tipo inteiro
CREATE OR REPLACE FUNCTION ret_rows_int () RETURNS SETOF integer AS $$
BEGIN
RETURN QUERY SELECT cod FROM FUNCTESTE; --Consulta
RETURN ; -- Retorno de dados
END;
$$ LANGUAGE plpgsql;

select * from ret_rows_int();

A cláusula complementa a função do RETURN NEXT, que era a única possibilidade implementada nas versões anteriores. A sintaxe em geral é mais simples.

quinta-feira, 27 de março de 2008

PgCon 2008: Ajude a Construir a Grade!

Depois do sucesso da PgCon 2007, a maior convenção de PostgreSQL brasileira, foi iniciada a preparação para a versão 2008 do evento que se realizará em Campinas-SP nos dias 26 e 27 de setembro.

Sugira temas, opine e se envolva nesta ação comunitária. O questionário está disponível no link abaixo:

http://www.midstorm.org/~telles/postgresql/survey.php?sid=29

segunda-feira, 24 de março de 2008

Crie Bases de Dados com o Pagila!

Quem já teve de fazer algum livro, artigo ou material de treinamento em banco sabe o quando é demorado e árduo o processo de criação de uma base de dados fictícia. Cada tabela, relacionamento e dado inserido tem de ser bem pensados ou perdem poder explicativo. A criação de bases com alguns milhares de registros é tediosa e o resultado pode ser cheio de erros e incoerentes com valores inseridos em sistemas reais.

O Pagila é um script que permite a criação de um banco de dados completo para tabelas, chaves primárias e secundárias e demais objetos relacionados, além dos dados. Tem sido utilizado como base de dados para artigos sobre o PostgreSQL, cursos e documentações. Portanto, não se surpreenda se achar as tabelas um pouco familiares. Tabelas de filmes, categorias, clientes e outras são encontradas com os seus respectivos dados, prontas para serem utilizadas na construção de exemplos e testes.

Não é preciso muito conhecimento para compreender o esquema e seus relacionamentos. Os dados são ao mesmo tempo auto-explicativos, similares a situações do mundo real. A única ressalva é que o esquema e os dados estão em inglês, o que pode ser negativo para algumas pessoas.

Originalmente era um script do MySQL desenvolvido por Mike Hillyer do MySQL AB documentation team, que foi portado, sofrendo melhorias para se adequar às funcionalidades do PostgreSQL.

O esquema e seus dados estão disponíveis sob a BSD license (http://www.opensource.org/licenses/bsd-license.php).

Versão atual: 0.10.1
Download: http://pgfoundry.org/frs/?group_id=1000150

quinta-feira, 20 de março de 2008

Livro Eletrônico do Bruce Momjian Grátis


Pra consultar tópicos básicos e SQL, este livro do Bruce Momjiam é realmente muito bom. Com exemplos didáticos e bem abrangente, ele oferece uma boa visão do funcionamento do PostgreSQL. Funciona como uma obra para consulta, como uma enciclopédia.

O link abaixo mostra publicação feita em 2002, de texto anterior:
- http://www.postgresql.org/files/documentation/books/aw_pgsql/index.html
- Versão em PDF

Ressalvas:
- O guia é introdutório. Não visa por exemplo detalhar a parte de configuração/ administração, embora os tópicos possam ser comentados na obra.
- Está em inglês.
- Não está atualizado no link com as últimas funcionalidades da versão 8.*.

Enquete adicionada: PostgreSQL é um bom nome para o nosso banco de dados?

Já ouvi o PostgreSQL ser chamado de Postgres, Postgree, Postgre SQL e outros nomes. Sem falar das pronúncias extremamente variadas do nome do programa.

Sempre achei que o nome não corresponde hoje a um significado mais palpável para os usuários. E hoje resolvi colocar uma enquete para perguntar se o nome tradicional deve ser mantido ou mudado, colocando mais algumas opções.

A enquete está no final da página, bastando rolar a tela.

Caso queiram sugerir novos nomes ou se posicionar a respeito, é só adicionar comentários a este post!

BOA PÁSCOA!!!

quarta-feira, 19 de março de 2008

Atualização do PostgreSQL 8.3.1 e 8.2.7

Estão disponíveis atualizações de segurança do PostgreSQL em suas versões 8.3.1 e 8.2.7. A maioria dos casos é correção de bugs como a possível ocorrência de deadlocks e comportamentos inesperados para certas funcionalidades. Vamos atualizar e evitar problemas!

Notas de lançamento (em algumas fontes os sites os links estão incorretos):
http://www.postgresql.org/docs/8.3/static/release-8-3-1.html
http://www.postgresql.org/docs/8.2/static/release-8-2-7.html

quarta-feira, 12 de março de 2008

Livro Online MUITO BOM!



Para quem precisa de um bom marterial de pesquisa online, recomento o site http://www.commandprompt.com/ppbook/ que contém o conteúdo completo do livro "Practical PostgreSQL", dos autoers John Worsley e Joshua Drake.

Neste livro, características básicas, intermediárias e avançadas deste banco são detalhadas com bons exemplos. Inclui ainda um guia de referência para os comandos suportados.

Ressalvas:
- Detalha a parte prática e os procedimentos cotidianos, sem aprofundar a arquitetura do PostgreSQL.
- Livro em inglês.

De volta!

Desculpem a ausência.
- CASEI.
- ME MUDEI PRA SALVADOR

Mas a partir de agora pretendo postar com mais regularidade.

quarta-feira, 6 de fevereiro de 2008

PostgreSQL - Funcionalidades de Performance

Comentários sobre as funcionalidades voltadas para a melhoria de desempenho da versão 8.3 do PostgreSQL. Coloco o texto original em inglês e abaixo uma nota explicativa sobre a nova implementação:

- HOT
"Heap Only Tuple (HOT) dramatically reduces the database maintenance issues associated with frequently updated data, reducing the need to vacuum and giving substantial throughput improvements for some applications."

Nota: O HOT - Heap Only Tuple é uma alteração que reduz a necessidade do banco de dados fazer atualizações nos índices. No PostgreSQL, cada alteração nos dados gera uma nova versão do registro. Caso seja alterado um campo de um arquivo e este campo não seja parte do índice, o mesmo não precisa mais ser atualizado. A entrada original de índice aponta, ainda que indiretamente, para o dado alterado. Esta implementação de HOT traz um ganho substancial, especialmente em dados alterados com muita freqüência. O termo "Heap only" significa exatamente que os dados estão apenas no arquivo de dados, não nos índices.

- Asynchronous Commit
"Allows the ability for COMMIT to return control without waiting for a physical disk write. This gives better response time at the expense of potentially losing a set amount of transactions in the event of system failure."
Nota: a implementação de commits assíncronos faz com que os mesmos sejam mais rápidos em geral. No caso de commits síncronos, operações mais lentas fazem com que as mais rápidas tenham que esperar, impactando a performance como um todo. A alteração implementada faz com que o PostgreSQL não tenha de esperar a conclusão de operações feitas para disco para prosseguir o commit, acelerando este tipo de operação tão freqüente.

- Spread Checkpoints
"Checkpoint autotuning: delays and spreads out checkpoints, reducing the impact of checkpoints on response times."
Nota: periodicamente o banco de dados necessita sincronizar o que está no banco com o que está armazenado em log. Este momento é chamado de checkpoint e toma tempo de processamento e acesso a disco. A alteração realizada no PostgreSQL faz com que este evento possa ser atrasado quando não há real necessidade de fazê-lo imediatamente. O ganho de desempenho se dá pela economia de tempo de processamento de checkpoints.

Just-in-time background writing strategy
"Auto-tuning for the Background Writer estimates how many buffers it should try to clean based on statistics about recent activity."
Nota: A sentença "Just-in-time background writing strategy" significa uma melhor alocação de memória durante os processos de gravação feitos em background. É um processo crítico para o desempenho e passa a sofrer um Auto-tuning (auto ajuste) baseado na atividade mais recente do servidor. O resultado final é maior ganho em desempenho e facilidade de utilização.