21 de nov. de 2012

Meu filho mais velho e o Ubuntu

Minha esposa comprou um Asus Eee PC e foi deixando seu antigo Dell de lado. Há algum tempo meu filho fez aniversário, e demos de presente para ele esse Dell. Como era uma máquina Windows, com uns cinco anos de uso, precisava urgentemente de uma reformatação total. Quando eu fui fazê-la meu filho perguntou:

- "Mas vai ter Clube Penguin?"
- Sim, eu respondi.
- "Mas vai perder tudo!"
- Tudo o quê?
- "Doctor Who da Cultura e os jogos da aula de informática da escola!"
- Pode ficar tranquilo, vai ter tudo isso.
- "É? Vai ter tudo?"
- Sim, claro

E tasquei o Ubuntu 12.10.

Lição: estamos em 2012. Tudo que uma criança quer no computador é acesso à Internet e um navegador.

1 de nov. de 2012

Bug do Oracle: paralelismo falha com objeto compartilhado

Ou pelo menos foi isso que me disseram.

Um novo DW que vai receber carga com um processo do Pentaho (Data Integration, ou PDI) gravará seus dados num banco Oracle. Em busca de performance, eu brinquei com alguns parâmetros do processo PDI e, ao final, deixei o objeto que grava no banco (Table Output) com dez instâncias. Cada uma abre uma conexão com o banco, que gerencia a gravação em paralelo na tabela.

Daqui para frente eu estou revendendo o peixe como eu comprei. Eu mal entendo Oracle, quanto mais dizer que eu sei como ele funciona. Eu vou apenas relatar o que eu ouvi, e tirar minhas conclusões lá embaixo.

Bom, estávamos com um problema sério de performance. Tabelas do MS SQL Server estavam dando vazão de mais de 100.000 linhas/segundo, mas as tabelas do Oracle não davam nem quinhentas - estava mais na casa das 300 l/s de leitura.

Conversamos e discutimos esse problema e os gestores do banco vão lá fazer suas mágicas para melhorar isso.

Agora vem a parte importante.

A certa altura, eu expliquei que estávamos gravando através de várias conexões, paralelizando a saída para o banco. Dai o gestor disse "cuidado!" Porquê? "Porque se você abrir várias conexões de gravação para um objeto definido como paralelizado, ele pode perder linhas na gravação."

Isso mesmo: se o objeto (como uma tabela) estiver sob cuidados do paralelizador do Oracle, e abrirmos mais de uma conexão para gravar, registros podem ser perdidos!

Ou isso é um bug, ou uma característica da operação. Em si não é nenhum problema, como pode parecer. Basta montar o projeto da forma que esse problema não seja disparado. Talvez esse seja o preço da paralelização - vai saber!

O ponto que eu quero cutucar é essse: se fosse o PostgreSQL a ter essa limitação, a obrigar a esse cuidado, todo mundo cairia matando, reclamando que é SL e tal. Bom, eu aproveitei a deixa: "mas isso é um bug?" "nossa, isso é perigoso! A Oracle vai resolver?" e outros comentários na mesma linha dos que são feitos quando o software defeituoso é livre.

Afinal, pombas, é o ORACLE!!! Eu não tenho certeza se é um bug - acho que não é - mas da forma que o gestor falou, com aquele tom meio "desculpe-me", tentando contornar... Sabe, não acredito que seja um bug, mas eu não me espantaria! Eu já ouvi relatos de grandes bancos de dados Oracle perdendo registros para o vácuo - somem de tal maneira que não restam traços em lugar nenhum, em log, em memória, nada!

Moral da história: não bata no Software Livre ao primeiro sinal de problema. Problemas ocorrem em todos os softwares, e na média SL tem menos defeitos!