SQL para DBAs

Quem me conhece, sabe que eu sempre implico com os vícios dos DBAs que iniciam a sua carreira no desenvolvimento. Mas os DBAs que começam como sysadmin também tem seus vícios. Um dos pontos fracos costuma ser a baixa familiaridade com o SQL.

Bom, vou mostrar aqui um alguns exemplos de SQLs que tive que desenvolver recentemente. Alguns foram feitos para ajudar a equipe de desenvolvimento, outros para resolverem problemas de performance e tem um que foi feito por solicitação dos  sysadmins. Na verdade, eu deveria mesmo é organizar estes scripts de uma forma lógica, mas são coisas realmente simples para merecerem tanto coidado…

Então chega de blá, blá, blá e vamos a eles:

  • Conversão de NOT IN em NOT EXISTS numa carga de dados. É muito comum você precisar carregar periodicamente uma tabela com os dados de uma outra. Isso ocorre muito na integração entre sistemas. Eu sei, eu sei, usar visões materializadas pode ser um processo bem mais inteligente. Infelizmente nem sempre estas decisões estão na nossa mão. Vejamos o caso:
INSERT INTO tabela2
    SELECT * FROM tabela1 t1
        WHERE campo_pk NOT IN(SELECT campo_pk FROM tabela_origem);

Você tem de carregar a tabela2, com os dados da tabela1 sem repetir os dados que já estejam lá. Utilizar o NOT IN é bem intuitivo, mas quando a tabela2 é grande, se torna um pesadelo, pois a subconsulta uma vez para cada registro na tabela1 e não consegue utilizar índices para isso. Um verdadeiro pesadelo. Então vamos a solução clássica:

INSERT INTO tabela2
    SELECT * FROM tabela1 t1
        WHERE not exists (SELECT NULL FROM tabela2 t2 WHERE t2.campo_pk = t1.campo_pk );
  • Pegar apenas o primeiro e o último nome de um campo com nome completo:
SELECT
        SUBSTR(nome,0,INSTR(TRIM(nome),' ')) primeiro_nome
        SUBSTR(nome,INSTR(TRIM(nome),' ',-1) + 1) ultimo_nome,
    FROM tabela_cadastro;
  • Limpar caracteres inválidos de telefones. Sim, tem muita gente que gosta de armazenar telefones, CEP, RG, CPF com caracteres não numéricos. Não é o correto, mas muita gente faz. Então, para fazer uma limpeza, vamos utilizar um pouco de expressões regulares, que são pouco exploradas por muitos DBAs e até mesmo desenvolvedores:
SELECT SUBSTR(LTRIM(regexp_replace(telefone,'[^0-9]'),0),0,10) fone_tratado
    FROM tabela_cadastro;
  • Selecionar apenas e-mails válidos. Eu sei, a validação deveria ser feita na carga dos dados, mas nem sempre acontece. Aqui, mais um caso clássico de uso de expressões regulares:
SELECT TRIM(email) email
    FROM tabela_cadastro
    WHERE REGEXP_LIKE (TRIM(email),'^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}$','i');
  • Agora uma forma de saber se o número de sessões num nó do Oracle RAC estão relativamente bem balanceadas. Aqui estou utilizando funções de janelas (que já abordamos aqui antes, mas com o Postgres), algo muito bacana, utilizado exaustivamente em consultas complexas com BI:
SELECT
        i.instance_name,
        l.sessions_current,
        ROUND(l.sessions_current * COUNT(l.inst_id) OVER () / SUM(l.sessions_current) OVER (),2) var
    FROM gv$license l, gv$instance i
    WHERE l.inst_id = i.inst_id;

Aqui, um valor entre digamos 0,9 e 1,1 para o campo VAR significa que o nó está relativamente bem balanceado. Esta consulta foi utilizada para uma ferramenta de monitoramento do Oracle RAC.

OBS: Os scripts aqui foram escritos e testados em Oracle 10g e 11g, sorry.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s