October 30, 2008

História de pescador - parte 2

Filed under: postgresql — coutinho @ 12:00 am

Outra coisa interessante que ocorreu na migração da base de dados do Detran foi quando tivemos que migrar uma rotina que importava uns dados vindos de um Main Frame. Um arquivo em formato texto plano com uns 800 mil registros.

O detalhe interessante é que não havia um delimitador de campo. Os registros eram o que muita gente chamada de “tripa” de tamanho fixo. Um regostro lá era mais ou menos assim:

00001232000000023ANTONIO LUIZ DE EXEMPLO SILVARUA ALMERINDA DE EXEMPLO SILVA230320089874561239876567SSPRJ100001

Tempo Total do Processo usando Oracle: 2 Horas

Como o pessoal do oracle tratava isso? Eles usavam um recurso que permite que isso seja vinculado ao oracle como uma tabela, no DDL usada para fazer essa operação o usuário ou DBA pode mapear os campos dizendo o inicio e tamanho de cada campo. Após isso eles copiavam esses dados para outras tabelas usando selects.

Como o pessoal do PostgreSQL (equipe da Mondrian Tecnologia) tratou isso?

Fizemos uma função usando plpython que transformou o tal arquivo em um csv e a nossa linha de exemplo ficou mais menos assim:

“00001232″,”000000023″,”ANTONIO LUIZ DE EXEMPLO SILVA”,”RUA ALMERINDA DE EXEMPLO SILVA”,”2303200″,”8987456123″,”9876567″,”SSPRJ”,”10000″,”1″

Após isso nossa função executa um copy desse arquivo para uma tabela real do PostgreSQL onde o acesso é bem mais rápido que a uma tabela vinculada do oracle como na situação anterior, a partir daí copiamos os dados necessários para as demais tabelas também usando copy.

Tempo Total do Processo usando o estilo PostgreSQL de ser: 6 min

October 29, 2008

Enquanto o “ceará on rails” e Pgcon 2009 não chegam…

Filed under: postgresql — coutinho @ 11:43 pm

Enquanto o Ceará On Rails não chega e enquanto não se decide se a Pgcon 2009 vem para Fortaleza, eu vou aproveitar para compartilhar com os velhos amigos e novos amigos conseguidos durante a Pgcon 2008, as fotos do Happy Hour do último dia do evento:

Eu e David Fetter

Eu e David Fetter

A turma

A turma

Dextra

Dextra

No Ceará On Rails eu tiro uma foto com o Akita :)

October 24, 2008

Ceará On Rails

Filed under: rails — coutinho @ 2:29 am

“O CearáOnRails é um evento solidário que será realizado no dia 14 de Novembro, voltado para todos profissionais área de TI com interesse em aprender um pouco mais sobre XP(Extreme Programming), Ruby e o framework RubyOnRails.” (retirado do site oficial)

A Mondrian Tecnologia (www.mondriantecnologia.com) é uma das empresas patrocinadoras do evento e eu irei ministrar a palestra “ORM On Rails” que é algo tipo “O ActiveRecord na visão de um administrador de banco de dados”. Além disso teremos o akita falando de desenvolvimento ágil e o Tiago Bastos com uma palestra bem eclética.

Os interessados podem acessar o site do www.cearaonrails.org e se cadastrar gratuitamente. E então? O que vocês estão esperando?

October 22, 2008

Compatibilizando

Filed under: postgresql — coutinho @ 2:41 am

Atendendo a pedidos um exemplo de uma das funções que tivemos que implementar no PostgreSQL afim de diminuir a edição das funções oracle a serem migradas. A função months_between retorna a quantidade de meses entre 2 datas:

CREATE OR REPLACE FUNCTION public.months_between(datafinal date, datainicial date)
  RETURNS integer AS
$BODY$
declare
  retorno integer;
begin
  begin
	 select extract('month' from age(datafinal, datainicial))  into retorno;
  exception
	 when others then
	 RETURN null;
  end;
  return retorno;
end;
$BODY$
  LANGUAGE 'plpgsql' IMMUTABLE STRICT

Espero que sirva de alguma coisa :)

October 21, 2008

Pl-python na prática

Filed under: postgresql — coutinho @ 8:38 pm

Durante a migração da base de dados do Detran-CE para PostgreSQL, nos deparamos com algo interessante, o uso frequente de arrays passados como parâmetros de umas funções para outras, os quais eram manipulados para compor critérios de consultas e outras coisas. O interessante que eu vi nisso foi o modo como eles trabalhavam esses arrays como se eles fossem tabelas.

Daí surgiu a necessidades de nós também no PostgreSQL manipular-mos estes arrays, como se eles fossem tabelas, assim poderiamos fazer select neles e coisas parecidas, para isso criamos uma função em pl-python chamada cast_as_table, veja abaixo a implementação e uso da função cast_as_table:

CREATE OR REPLACE FUNCTION cast_as_table(a character varying[])
  RETURNS SETOF character varying AS
$BODY$
vall = []
x = a.replace('{','').replace('}','').split(',')
ant = ''
for v1 in x:
	if v1.startswith('"'):
		ant = v1
	elif v1.endswith('"'):
		n = ant + ',' + v1
		n = n.replace('"','')
	vall.append(n)
	ant = ''
	elif ant != '':
		ant = ant + v1
	else:
		vall.append(v1)
return vall
$BODY$
  LANGUAGE 'plpythonu' VOLATILE

A função acima é um exemplo parecido com uma das que utilizamos na migração do detran,  com ela podemos fazer um cast de um array para um conjunto de registros como sugere a declaração de retorno da função.  Famos ver agora como fica o select em uma das funções que recebia como parâmetro um array de string para ser usado na montagem do critério da consulta:

select
A.SF_BOR_SIT_CODIGO,
A.MU_MUL_DATA_SITUACAO,
A.MU_MUL_SEQ_HISTORICO
from cast_as_table(P_TAB_MULTA) A into
VSF_BOR_SIT_CODIGO,
VMU_MUL_DATA_SITUACAO,
VMU_MUL_SEQ_HISTORICO
where (mult.mm_oau_codigo, mult.mu_mul_numero,mult.mu_mul_sequencial)
IN (select A2.mm_oau_codigo,A2.mu_mul_numero,A2.mu_mul_sequencial from cast_as_table(P_TAB_MULTA) A2);

O exemplo acima foi um tanto ingênuo mas em muitos casos isso pode ser bem útil pois uma vez que podemos tratar o array como um conjunto de registro podemos nos utilizar de diversos recursos como filtros com where, junções com outros conjuntos de registros, etc.

Em breve disponibilizaremos o código fonte de nossa implementação em python da utl_file que é um recurso muito utilizado no Oracle para manipulação de arquivos. Com este pacote nós conseguimos migrar de forma transparente varios objetos os quais faziam uso desse recurso nativo do oracle.

Aguardem.

História de pescador parte 1 - PostgreSQL em desktop é mais rápido que Oracle num super servidor

Filed under: postgresql — coutinho @ 2:47 am

Essa pequena história é sobre a rotina do dia-a-dia da migração de Oracle para PostgreSQL no Detran-CE.

O que acontecia é que o pessoal da equipe da Mondrian Tecnologia sempre esquecia que o PostgreSQL estava rodando numa máquina igual os nossos desktops e sempre ficava com a mania de comparar a performance com a obtida no SGBD oracle de produção. Após fazer a comparação, quando os números não agradavam, o Marcos começava a re-escrever as instruções até obter uma performance superior a apresentada pelo SGBD Oracle em produção.

Ambiente de produção Oracle (rápido)
—————————-
Dell PowerEdge XXX
Processador: 2 Intel Quad Core Xeon
RAM: 8GB
Discos: 3 discos sata 300 GB, 10.000 rpm

Ambiente Desenvolvimento PostgreSQL (super rápido)
————————————
Lenovo
Processador: Intel Dual Core (1600 mhz)
RAM: 2GB
Disco: 160 GB sata 7.200

Dá para acreditar?