segunda-feira, 8 de junho de 2009

Um comentário...


Foto de Clark Little, surfista fotógrado. Simplesmente...lindo!

Título é de Button, só resta saber em qual prova

Bem, estou de volta pra comentar o GP da Turquia...
Encerrado o domínio do Massa, com nova vitória do Button. É o melhor início de temporada desde que o Schumaquer venceu 12 das 13 primeiras provas em 2004. O erro do Vettel logo no início da corrida não mudou em nada o resultado. Foi visível o ritmo mais forte que o Button imprimiu, e me arrisco a dizer que ele teria vencido do mesmo modo se o Vettel não tivesse errado. Provavelmente o superaria após a primeira rodada de pit stop's.
Como disse na última coluna o rival do Button é o Vettel e não Rubens, e sendo assim, este já tem 32 pontos de vantagem e não tenho mais dúvidas de que será campeão. Acredito que ele pode até mesmo quebrar o record do Mansel, que foi campeão com 5 provas de antecipação em 1992 -.
Vettel cometeu um erro infantil, complicou sua prova e mostrou que ainda não está pronto pra ser campeão. Depois com a mudança de estratégia, que no meu modo de pensar foi válida sim, pois colocou de volta o Vettel na corrida e se esse tivesse conseguido ultrapassar Button e abrir vantagem teria chance de vencer a prova. Mas acabou ficando atrás do inglês, e sequer tentou atacar. Com isso perdeu tempo e a segunda posição pro Webber no fim da corrida. A atitude da Red Bull mandando Vettel tirar o pé e não forçar uma briga desnecessária com o Webber tirou um pouco da emoção no final da prova, embora do ponto de vista de equipe foi a atitude mais sensata.
Webber, superou Vettel e completou a prova em segundo - ninguém fala dele, mas já é o quarto no campeonato e está a apenas 1,5 ponto atrás do companheiro, que se tratando do alemão não é demérito nenhum -.
Rubinho teve azar de novo - incrível como tudo dá errado no carro dele e nunca no do companheiro - e abandonou a prova com problemas no câmbio.
No mais, a corrida foi chata e sem grandes alterações. Massa foi sexto, mostrando que a evolução apresentada em Mônaco foi mais pelas características da pista do que pelas inovações apresentadas. Piquet de novo não foi bem e deve ser demitido no fim do ano.

[ ]'s

Márcio Almeida.

quarta-feira, 3 de junho de 2009

Features 10 g - Data Pump - I

Olá pessoal,

Estou iniciando hoje uma série de matérias sobre recursos do Oracle 10g. Você leitor deve estar se perguntando porque optei por falar do 10g em detrimento ao 11g. A resposta é simples, o 10g é um produto maduro, e quando se pensa numa migração de 8i ou 9i, a aposta é sempre no 10g. Em outro momento pretendo abrir uma série pra falar dos recursos do 11g, e assim podemos traçar um paralelo entre as duas versões.

Para iniciar a série escolhi o data pump, utilitário de importação e exportação introduzido pelo 10g e que representa uma revolução com relação aos seus antecessores: import/export.

Antes do Data pump, as migrações de grandes bases com export/import eram geralmente descartadas, devido às limitações de performance dessas ferramentas. Nesse cenários o Data pump passa a ser uma opção viável, pois em alguns casos sua performance durante uma importação chega a ser 5 vezes mais rápido que o import convencional.

Interatividade

- Monitorar de forma mais eficaz a execução da exportação / importação, acompanhando o
volume executado e o total e assim estimar tempo de duração;
- Interação com rotinas pl/sql;
- Permite fazer pesquisa em objetos antes mesmo de importar o dump.

Eficácia

- Permite suspender um trabalho e retomar do ponto que parou (pause/resume);
- Anexar um trabalho a uma exportação em execução;
- Reiniciar um trabalho que falhou a partir do ponto que parou;
- Filtrar o que vai ser exportado: chegando ao nivel de exportar sql de objetos do banco.

Performance

- Exportação até 12 vezes mais rápida e importação até 5 vezes mais rápida;
- Parelismo, você pode abrir operações paralelas que vão gerar vários arquivos de dump
simultâneos.

Nos próximos dias publicarei artigos com exemplos de como trabalhar com data pump explorando ao máximo os recursos citados acima.

Ate lá!

[ ]'s
Márcio Almeida.

terça-feira, 26 de maio de 2009

Piração total !

Quer fazer um tour virtual por Paris de Ferrari? clique aqui...Será que a pressa toda era saudade da moça? Ou será que o abraço no final é de despedida, porque ele foi preso depois?

[]'s

Hélio: retorno fenomenal

O maior acontecimento esportivo do final de semana foi a vitória do Hélio Castro Neves na lendária prova americana, as 500 milhas de Indianápolis. Pra quem não sabe, Hélio esteve até bem pouco tempo atrás sob julgamento de um processo movido pelo fisco americano e tudo indicava que seria condenado a uma pena que poderia chegar a 35 anos de prisão. O mais excepcional de tudo foi a forma como ele voltou às pistas e conseguiu resultados extraordinários depois de tanto tempo sem poder correr (quase 6 meses de inatividade).

A seqüência dos fatos:
- Início do calvário. No final do ano passado é preso e paga vultuosa quantia de fiança.
- 17/04, Helio e Katiucia (não confundir com aquela que beijou o Bono) foram
inocentados dos seis crimes de sonegação fiscal ao qual eram acusados, maiores
detalhes clique aqui.
- 18/04, volta ao cockpit da Penske nos treinos de Long Beach e consegue a oitava
posição para o Grid de largada.
- 19/04, chega em sétimo na corrida.
- 09/05, faz a pole para as 500 milhas de Indianapólis.
- 24/05, vence pela terceira vez a prova mais importante do calendário americano,
quiçá mundial.

Incrível não?! Uma recuperação que só encontra paralelo no retorno de Ronaldo em 2002, e olhe lá...

Enquanto isso, a equipe dos B’s (Brawn, Button, Barrichelo e Branson) continua imbatível. A bem da verdade só perderam na Malásia porque caiu um pé d’agua. Vitórias a parte, o que acho mais interessante é que a cada prova os analistas elegem um novo desafiante à hegemonia da Brawn. No início da temporada era Willians e Toyota, depois foi a Red Bull, e agora Ferrari. O fato é que um a um os rivais foram caindo e os nomes se alternando no pódio. O maior beneficiado disso é Button, que a esta altura já tem 28 pontos de vantagem para o rival mais próximo, Vettel (Barrichelo não é necessariamente um rival). Nesse ritmo poderemos ter um campeão já definido no GP da Europa ou no GP da Bélgica. Sem querer ser mãe Diná, mas já sendo.

A Red Bull estreou seu novo difusor e o resultado não foi bem o esperado. Vamos ver como se sairá em Instambul. A Mclaren mostrou as deficiências do carro. A Renault só não passa vergonha porque tem Alonso. A Toyota, cadê a Toyota? A Willians reina nos treinos livres, mas quando vale alguma coisa fica pra trás...

Sobre o “retorno” da Ferrari, que aliás foi amplamente explorado pela Globo – não sei se por empolgação do locutor ou pra estimular a audiência, acho que um pouco de cada, o que vocês acham?-, tenho minhas dúvidas. Mônaco é um circuito especial, diferente dos outros, e por isso mesmo não serve de parâmetro. Só vamos de fato poder avaliar o desempenho da Ferrari na Turquia – prova que ela venceu todas as corridas até hoje, 3 com Massa e 1 com Schumaquer - . Na prática eu diria que se a Brawn passear em Istambul os rivais podem jogar a toalha e esquecer o campeonato desse ano.

[]’s

segunda-feira, 25 de maio de 2009

Queries hierárquicas em Oracle

Olá,

Na sexta uma programadora me procurou com dúvidas sobre as cláusulas "start with" e "connect by" no comando SQL. Eis, que hoje ao ler a newsletter de banco de dados do iMasters vi na lista de artigos um que falava sobre Queries hierárquicas. Coinciência, não? Achei a matéria do colega Ruben Badaró interessante, e resolvi post-la aqui. O link é http://imasters.uol.com.br/artigo/12551/oracle/queries_hierarquicas_em_oracle/.

Só acrescentaria ao que o colega escreveu a possibilidade de concatenar o Level com a coluna da tabela, criando um efeito semelhante ao de um sumário. Exemplo:

SELECT lpad('.', 2*Level) NOME Empregados
FROM
EMPREGADO
START WITH NOME='João'
CONNECT BY NOCYCLE PRIOR ID = SUPERVISOR;

Empregados
-------------
João
.......Pedro
.......Ricardo
...............José

[ ]'s

Márcio Almeida.

sexta-feira, 15 de maio de 2009

Tabelas externas

O assunto de hoje será sobre um interessante recurso disponível no Oracle 10g: as tabelas externas. Como o nome diz, se trata de uma tabela ou arquivo que não reside no banco de dados. Com esse recurso é possível integrar diferentes bases e aplicações de forma simples e rápida. Usando recursos de paralelismo para geração dos dados, ou fazendo select's com ordenação envolvendo tabelas externas e tabelas nativas, insert's em tabelas da base através de select's em tabelas externas e por ae afora.

Vamos à pratica.

Criaremos um arquivo bancos.csv na pasta d:\oracle\externo, contendo o seguinte:

237,Banco Bradesco
1,Banco do Brasil S.A
356, Santander Brasil
2, Caixa Economica Federal
424, Banco Noroeste

Importante ressaltar que os arquivos devem estar no servidor onde roda o banco de dados, que nesse caso é windows.

O próximo passo é criar uma referência no BD para o diretório onde está o arquivo externo, atraves do comando create directory.

Create or replace directory dir_ext as 'd:\oracle\externo';
Create or replace directory dir_bad as 'd:\oracle\externo\bad';
Create or replace directory dir_log as 'd:\oracle\externo\log';


Supondo que temos um usuário financeiro, iremos conceder grant's de leitura e gravação nesse diretório para ele.

grant read, write on directory dir_ext to financeiro;
grant read, write on directory dir_bad to financeiro;
grant read, write on directory dir_log to financeiro;


Conn financeiro/financeiro;

Agora vamos criar duas tabelas: Bancos_ext e Bancos.

create table bancos
(
Banco_id number(4),
Banco_nome varchar2(30)
);

create table bancos_ext
(
Banco_id number(4),
Banco_nome varchar2(30)
)
organization external
(
type oracle_loader default directory dir_ext access parameters
(
records delimited by newline
badfile dir_bad:'bancos%a_%p.bad'
logfile dir_log:'bancos%a_%p.log'
fields terminated by ','
missing field values are null
(
banco_id,
banco_nome
)
)
Location ('bancos.csv')
)
Parallel
reject limit unlimited;


Vamos analisar o comando:
- Organization external: indica que se trata de uma tabela externa ao BD Oracle.
- Type oracle_loader: a interface usada pra fazer a carga será o oracle loader.
- Default directory dir_ext access parameters: indica o diretorio onde está o arquivo, nesse
caso definido pelo objeto directory dir_ext.
- Acces Parameters: Parametros de localização do arquivo no sistema operacional , badfiles,
logfiles, etc;
- Records delimitd by newline: o banco entenderá que ao encontrar um fim de linha irá
adicionar um novo registro na tabela.
- Badfile dir_Bad: caso não queira gerar badfile substitua por NOBADFILE;
- Logfile dir_log: caso não queira gerar log substitua por NOLOGFILE.

Apos criar a tabelas, habilitamos o paralelismo para dml (operações de insert, delete e update), e em seguida executamos um insert na tabela bancos fazendo leitura na tabela externa.

alter session enable parallel dml;

insert into bancos
(
Banco_id,
Banco_nome
)
Select * From bancos_ext;

Vamos para o próximo caso. Join envolvendo uma tabela externa e uma tabela do DB.

Select * from agencias a, bancos_ext b
where
a.banco_id = b.banco_id
and b.banco_id = 1;

Limitações de uso de tabela externa

Em uma tabela externa não é possível realizar uma operação de DML (insert, delete e update), tampouco criar um índice, embora seja possível fazer uma ordenação.

Não é permitido também criar tabelas externas com campos do tipo clob, blob e long.

Criação de tabela externa usando datapump e paralelismo

Nesse exemplo criaremos uma tabela externa a partir de uma tabela do BD.

Create agencias_ext (banco_id,agencia_id,endereco,numero,bairro,cidade,uf)
Organization external
(type oracle_datapump
default directory dir_ext
location ('agencias.csv'))
parallel 4
as
select banco_id,agencia_id,endereco,numero,bairro,cidade,uf
from agencias;

Podemos ainda gerar os dados em múltiplos diretórios simultaneamente:

create or replace directory dir_ext_1 as 'd:\oracle\externo\dir1';

create or replace directory dir_ext_2 as 'd:\oracle\externo\dir2';


Create agencias_ext (banco_id,agencia_id,endereco,numero,bairro,cidade,uf)
Organization external
(type oracle_datapump
default directory dir_ext
location ('dir_ext_1:agencias.csv','dir_ext_2:agencias.csv'))
parallel 2
as
select banco_id,agencia_id,endereco,numero,bairro,cidade,uf
from agencias;

É isso aí...

[]'s