Economizando 198 megas com um único SELECT

(Última atualização em: 30 de maio de 2017)

Quero o nome, o preço e a categoria de um produto:

select * from Produtos p
   join Categorias c on
            c.id=p.categoria_id;
> 1, Livro Swift, 50.0, 3, Mobile
> 2, Certificação Java, 50.0, 1, Java
> 3, ...

Executo a query e por muitas semanas ela funciona lindamente em produção. Até que um dia o site começa a ficar lerdo… lerdo… lerdo…
Mas local, funciona que é uma beleza.

Mas calma lá, eu disse que queria nome, preço e categoria, e eu – de maldade – abreviei a resposta lá em cima:

> Livro Swift, 50.0, Mobile, Crie uma app do zero, 
utilizando boas práticas de programação, 
mas também entendendo os motivos e as características importantes 
da linguagem que revolucionou o mercado mobile iOS...
> ...

O que eu fiz? Só quero nome, preço e categoria, mas estou trazendo tudo! Antes o produto não tinha campo descrição, e agora ele tem!

Imagine que tenho um banco pequeno, com 20 mil produtos. Cada produto tem um nome de 100 caracteres assim como a categoria. Isso quer dizer que eu queria transferir do HD do meu banco para a minha máquina cerca de 20000 * 200 = 4 megas.

Mas na verdade eu fiz um select *!

Selecionei todos os campos! Se cada descrição completa de um produto tem 10 mil caracteres por causa do sumário do livro, temos então 20 mil produtos, cerca de 10 mil caracteres em cada um: 200 megas!

Boa sorte tirar tudo isso do seu HD. Boa sorte levar tudo isso pela rede de uma máquina para outra. Boa sorte construir as Strings em memória que representam estes valores.

select * é perigoso por diversos motivos. O consumo de memória e banda é só um deles… pense a longo prazo: se o banco mudar você vai trazer mais coisa do que queria, e esse mais coisa talvez seja demais.

select nome, preco, categoria
   from Produtos p
   join Categorias c on
            c.id=p.categoria_id;

Novamente, com poucos caracteres, em determinados cenários, você muda completamente a eficiência de um banco de dados!

Gostou dessas práticas e dicas de SQL? Que tal receber todo dia por email uma dica e boa prática de 1 minutinho de SQL que escrevi? Taí o form 🙂

Tech Education Leader no Alura

  • Já passei por isso!
    O sistema foi evoluindo, a tabela ganhou algumas colunas e muitos registros é claro…
    Com o tempo notei que apareciam conexões simultâneas no banco, e que as consultas demoravam um pouco mais, foi só alterar o select e vualá! perfect…

  • Vitor

    Boa!

  • Saulo

    Trabalhei numa empresa onde no OnCreate() de alguns forms(Delphi)dava-se Select * em pelo menos 5 tabelas, cada uma contendo seus poucos 200 mil registros… Imagine a quantidade de POG que não tinha nesse sistema…

  • Leonardo Ramos

    Os DBAs vão a loucura com essas queries.

    Por isso a rixa entre Devs e DBAs.

Próximo ArtigoConfigurando e rodando ASP.NET MVC no Mac OS