Benchark Oracle vs MySQL

Estou estudando a tecnologia oracle, as soluções são realmente interessantes principalmente com “oracle rac”.

Algumas coisas impressionam, como por exemplo,  você está fazendo uma query usando um dos nós do cluster, se o servidor reboota, ou da algum problema, ele roteia automaticamente para o próximo nó e continua a query do ponto que parou, fizemos testes e de fato isso e real, a query para por alguns poucos segundos e depoi segue a execução normalmente.

Fiz um for simples em php para inserção de 10000 registros (sim tem maneiras melhor de inserir, mas era um teste simples) numa tabela chamada “teste” possuindo dois fields:
-> id int key  –> sem auto-increment
-> reg varchar(50)

Trecho do código que usei para o for (em oracle)

for($i=1;$i<=10000;$i++)
{
        $sql = "INSERT INTO country(id, pais) VALUES('".$i."', 'registro-".$i."')";
        $oracle->query($sql);
}

Trecho do código em php

for($i=1;$i<=10000;$i++)
{
        $sql = "INSERT INTO country(id, pais) VALUES('".$i."', 'registro-".$i."')";
        mysql_query($sql, $link);
}

utilizei a função time() do php para medir o timestamp inicial e final, a diferença deles é o tempo da operação em segundos.

Resultados:

–> inicio e fim são timestamp, tempo total em segundos
Oracle:
INICIO: 1316194690
FIM: 1316194729
Tempo Total: 39
Espaço ocupado: 500kb

MySQL INNODB:
INICIO: 1316194769
FIM: 1316194772
Tempo Total: 3
Espaço ocupado: 416Kb

MySQL MyISAM:
INICIO: 1316194854
FIM: 1316194857
Tempo Total: 3
Espaço ocupado: 336.99Kb

Conclusão:
Foi um teste muito simples para afirmar qual é o melhor, mas podemos ver que para operações simples, o mysql é quase 10 vezes mais rápido e ocupa menos espaço em disco.
Porém é fato sabido que o mysql perde performance na medida em que a quantidade de dados vai crescendo, já no oracle, quando isto acontece ele se mantem estável (com perda mínima, ou sem de performance).

Finalizando processos no banco postgresql

Mini-bomba do dia:

Rotina de exclusão de banco/usuario postgres não era executada quando haviam conexões em idle ou queries sendo executadas no momento.

Depois de um tempo de pesquisa eis a solução:

SELECT pg_cancel_backend(procpid) FROM pg_stat_activity WHERE usename = 'BANCO_DE_DADOS';
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE usename = 'BANCO_DE_DADOS';

Bonus stage:
Para visualizar as conexões ativas e garantir que matou todos os pids:

select * from pg_stat_activity WHERE datname='BANCO_DE_DADOS';

Atualização: a function pg_terminate_backend() só funciona em postgre 8.4 ou superior, logo estou procurando outra opção via query  em versões antigas, pois matar os pids via kill não eh uma alternativa no que estou fazendo.

Reativando o ícone de rede no ubuntu

Depois de um tempo de uso (nem uma senama :P), o ícone de rede na barra de tarefas do meu ubuntu simplesmente sumiu.

Procurando no oraculo google achei uma dica que me ajudou muito na solução.

Edite o arquivo /etc/NetworkManager/NetworkManager.conf, deixando-o da seguinte forma:

[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=true

OBS: Uso ubuntu 11.04

Inserindo dados de um select multiplo no banco de dados

Para que o php reconheça todas as opções setadas em um select múltiplo, devemos por [] após o nome do select

<form method=POST...>
<select name=estados[]' multiple>
<option value='SP'>SP</option>
<option value='RJ'>RJ</option>
<option value='RS'>RS</option>
</select>
</form>

Para campos do tipo SET no MySQL, basta usar um implode pra popular os dados:

<?php
$estados = implode(',', $_POST['estados']);

Exibindo e escondendo dinamicamente TR em uma tabela

Custei mas achei, eu tinha uma tabela com algumas TR escondidas via style, porém ao tirar eslas do “display:none” via javascript ficava desalinhado (todo o conteúdo da TR em uma única TD)

Fuçando muito, descobri o problema, o motor de renderização Trident (IE) utiliza  a propriedade block para exibir de forma generica, já os motores webkit (chrome, safari, etc) e gecko (firefox) utilizam “table-row”,

A função salvadora da pátria abaixo:

<script>
function toggle(id){
	if (document.getElementById && document.createTextNode)
	{
		var tr=document.getElementById(id);
		if (tr) {
			if (tr.style.display == 'none') {
				try {
					tr.style.display='table-row';
				} catch(e) {
					tr.style.display = 'block';
				}
			}
			else {
				tr.style.display = 'none';
			}
		}
	}
}
</script>

Atualização 21/03/2012:
Pra usar em uma TD, basta substituir table-row por table-cell

Wireless travando ubuntu

Olá pessoal,

Neste último final de semana resolvi finalmente criar vergonha na cara e remover o windows7 que veio pré-instalado no meu notbook.

Ele é um HP DV5-2112BR, sei que existem notebook muito melhores, mais foi o que o meu dinheiro conseguiu comprar rsrsrs

Bom, primeiramente instalei uma distribuição que gosto muito, o opensuse, porém tive alguns problemas com aceleração 3D e skype,  e devido ao meu limitado tempo não foi possível pesquisar mais a fundo para solução. Logo baixei a ISO do ubuntu 11.04 e instalei.

Tudo funcionou uma marvailha, menos a rede wiereless, o led no F11 (tecla para ativar/desativar a wifi) ficava piscando como louca, alternando constantemente entre ligado/desligado, ele achava as redes sem fio mas nao conectava em nenhuma (nem nas abertas!) e o pior, qdo eu apertava o F11 o ubuntu simplesmente congelava, nem o mouse se mechia, somente resetando!

Pesquisando na net, descobri que o chipset dessa placa de rede (RaLink RT-3090) era compatível com a RT2800, logo provavelmnte o ubuntu estava carregando o driver (modulo) errado ocasionando o erro.

Bem, aqui fica dica e solução, porém vão ter que ter uma rede cabeada pra poder baixar os pacotes dos repositorios (tudo via apt, nem pensem em ficar compilando coisas 😉

Primeiramente, adicione o repositorio do markus no arquivo /etc/apt/sources.list

deb http://ppa.launchpad.net/markus-tisoft/rt3090/ubuntu maverick main
deb-src http://ppa.launchpad.net/markus-tisoft/rt3090/ubuntu natty main

Uma observação importante, nesse ponto, substituir a palavra “natty” no comando acima pela versão do seu ubuntu, abaixo as versões suportadas pelo repositório:

jaunty (9.04)
karmic (9.10)
lucid (10.04)
maverick (10.10)
natty (11.04)

Será necessário tambem importar a chave pgp

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 86F4C28E

Agora atualizaremos os pactoes e instalaremos o driver

apt-get update
apt-get install rt3090-dkms

Infelizmente o trabalho não termina aqui, temos mais alguns arquivos para editar.
Lembrando então que a causa da falha é o fato de carregar o modulo/driver errado, instalar o novo não resolve esse problema, ele ira carregar o modulo certo, depois o errado e irá travar novamente!

Para resolver esta questão temos que colocar o modulo errado na blacklist, e adicionar o correto no arquivo de autoload dos modulos:

Deste modo, edita o arquivo /etc/modprobe.d/blacklist inserindo no final a seguinte linha:

blacklist rt2800pci

E finalmente, para carregar o modulo certo, adicionar no final do arquivo /etc/modules o texto:

rt3090sta

Agora sim, basta reiniciar o seu ubuntu e tudo estará funcionando! ;D

OBS: Os codinomes das versões do ubuntu, retirei de: http://ufpa.br/dicas/linux/li-u-ver.htm

Atualizando rubygems no centos5

E la vou eu instalar uma aplicação redmine quando, de repente me surge essa “bomba”

$ gem install rake
ERROR:  Error installing rake:
rake requires RubyGems version >= 1.3.2

Oh, e agora ,quem poderá nos defender?

Bem, aquele erro basicamente diz que temos que atualizar a versão do rails, então… maos de sobra… digo, maos a bora

Instalando o RubyGens mais novo:

cd /tmp/
wget http://rubyforge.org/frs/download.php/55066/rubygems-1.3.2.tgz
tar xvzf rubygems-1.3.2.tgz 
cd rubygems-1.3.2
sudo ruby setup.rb

Agora sim, instalando o rake:

$ gem install rake

E, here we go!

$ rake --version
rake, version 0.9.2

Alternativa ao mod_expires

Essa é pra quem ta tentando usar mod_expires no provedor porém o mesmo não está instalado.

Basta colocar as linhas abaixo no arquivo .htaccess da raiz do site (não esquecendo de alterar as extensões e a data conforme desejado)

<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Expires "Wed, 15 Apr 2020 20:00:00 GMT"
Header set Cache-Control "public"
</FilesMatch>