sexta-feira, 15 de janeiro de 2016

Gotas de otimização Oracle

Há dois problemas de SQL comuns que vejo, com frequência, sendo resolvidos com complexidades e ineficiências desnecessárias.

O primeiro é o de precisar o número de registros de uma consulta junto com os dados. A solução ineficiente é a de executar a consulta duas vezes; usando count() primeiro e buscando os dados depois. As funções analíticas são pouco conhecidas ainda, infelizmente.


select count(1)
from pessoas;

select nome
from pessoas;


Usando a versão analítica de count(), as duas consultas podem ser unidas.

select nome, count(1) over ()
from pessoas


E ganha-se uma coluna com o total de linhas.

O segundo problema é o de retirar acentos. Já vi soluções com múltiplos ifs, com case, e até com muitos replace() aninhados.

A minha solução preferida é muito simples e fácil de ler:

select nome, translate(nome,
                'ÀÁÃÂÄÈÉÊËÙÚÛÜÌÍÎÏÒÓÔÕÖÇÑàáãâäèéêëùúûüìíîïòóôõöçñ',
                'AAAAAEEEEUUUUIIIIOOOOOCNaaaaaeeeeuuuuiiiiooooocn') 
from pessoas;


Talvez haja uma solução mais curta (sei que há em Java), mas não creio que haja uma tão legível.

quarta-feira, 13 de janeiro de 2016

Os problemas médicos da informática

O modelo de medicina no Brasil tem um problema fundamental. Os médicos são remunerados por procedimentos, exames, consultas, etc. Isto é, sua remuneração não aumenta com a saúde dos pacientes. Ela aumenta, isto sim, quanto pior for a saúde das pessoas.

Na informática, isso seria como pagar os programadores por linha de código. Fosse essa a nossa realidade, teríamos legiões de programadores Java e algumas poucas almas iluminadas usando Perl.

domingo, 3 de janeiro de 2016

Receitas

A comparação de programas e algoritmos com receitas é antiga e comum, mas sempre me incomodou.

Acho que achei uma maneira de melhorá-la.

Um programa é como uma receita, mas uma receita que requer cinco mil ingredientes, dois milhões de passos, e dezesseis panelas (para um fogão de quatro bocas).

quinta-feira, 31 de dezembro de 2015

2016

Em soma de potências de 2: 210+29+28+27+26+2

Em binário: 11111100000

Em base 8: 3740

Em base 16: 7E0

Em base 32: 1V0

Em primos: 2 5 * 3 2 * 7

E o meu favorito: 2017-1.

quarta-feira, 23 de dezembro de 2015

Humanos e máquinas

Precisei consertar um Oracle Dataguard (um banco reserva que recebe todas as alterações do banco principal e que funciona como  cópia de segurança) e descobri algo sobre a produtividade dos seres humanos.

O banco reserva estava 17h atrás do banco principal quando resolvi o problema que impedia que o banco principal enviasse as alterações. Em 15 minutos os dois estavam sincronizados.

Isso quer dizer que os humanos levaram 17h para invocar transações suficientes para provocar 15 minutos de trabalho no banco secundário. Ademais, o banco primário funciona em duas máquinas, enquanto o secundário roda sobre apenas um servidor.

Evidentemente, o processamento usado em consultas não entra nessa conta. Por outro lado, muitas das alterações são provocadas por jobs (não precisam de interação humana). Mesmo assim, é interessante o fato de que um computador fez o trabalho de milhares de pessoas 68 vezes mais rapidamente.

quarta-feira, 19 de agosto de 2015

Linguagem de baixo nível

Foi numa conversa com uma usuária que percebi o quão inadequada era uma das palavras mais comuns do vocabulário da informática: salvar. Certamente, trata-se de um anglicismo e que funciona suficientemente bem no português. Mesmo considerando que os dados realmente precisam de salvação, já que podem desaparecer se faltar luz (salvo se o sistema usar memória de ferrite), é excessivamente dramática essa palavra. O verbo gravar (ou talvez guardar) seria mais adequado e menos teatral.

Mais recentemente, escutei uma conversa na qual um colega explica a uma usuária que uma rotina havia sido codificada em linguagem de baixo nível.

Fiquei a imaginar o que a pessoa leiga pensou. Que alguém levantou a voz e insultou a máquina? Que ela própria corria o risco de escutar poucas e boas? De qualquer forma, o assunto foi resolvido com brevidade e salvou-se o dia.

sexta-feira, 10 de julho de 2015

Somando linhas com awk

Eu queria saber quantos bytes (octetos para os de tendências latinas) foram buscados pelo Apache por um grupo de máquinas. Descobri um pequeno truque com awk:

awk '{s+=$1} END {print s}'

Esse código soma valores e imprime o resultado no fim. Posso adicionar um parâmetro com o nome de um arquivo, ou posso usá-lo com um pipe:

grep -P "10\.208\S+" access_log | grep -Po "\d+$" | awk '{s+=$1} END {print s}'

O primeiro grep filtra um faixa de IPs (todos os que começam com 10.208); o segundo pega o último valor da linha (que é o número de bytes transmitidos); por fim, o awk soma os valores.