Economizando 198 megas com um único SELECT

Economizando 198 megas com um único SELECT
Guilherme Silveira
Guilherme Silveira

Compartilhe

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.

Banner da promoção da black friday, com os dizeres: A Black Friday Alura está chegando. Faça parte da Lista VIP, receba o maior desconto do ano em primeira mão e garanta bônus exclusivos. Quero ser VIP

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

Guilherme Silveira
Guilherme Silveira

Co-fundador da Alura, da Caelum e do GUJ. Com 18 anos de ensino nas áreas de programação e dados, criou mais de 100 cursos. Possui formação em engenharia de software, viés matemático e criativo, além de ser medalhista de ouro em competições nacionais de computação, tendo representado o Brasil nos mundiais. Participante de comunidades open source e de educação em tecnologia, tendo escrito 7 livros. Faz mágica e fala coreano no tempo livre.

Veja outros artigos sobre Data Science