Subquery vs Inner Join

Quero compartilhar uma maneira fácil e rápida de escolher entre subquery e inner join sem a necessidade de conhecimento sobre regras de performance.

Não sei vocês, mas para mim, a performance é um dos fatores mais importantes para decidir entre uma ou outra instrução sql. Porém, existem outras características que podem ser avaliadas, falaremos mais sobre elas a baixo.

Antes de mais nada, segue definição e exemplos das duas instruções sql:

Subquery

Subconsulta (mais conhecida como subquery) é uma instrução SELECT que está condicionada dentro de outra instrução SQL.

Exemplo:

Temos a tabela funcionário com 3 campos: Id, Nome e Salário. A partir delas, criei uma subquery que retorna todos os funcionários com o salário maior que a média salarial.

Como podemos ver acima, subquery é basicamente uma instrução sql dentro da outra. Apesar de ser um exemplo simples, representa com clareza o que é uma subquery.

Inner Join

Quando comecei a estudar banco de dados, por diversas vezes fiz o inner join, com a intenção de “juntar” os dados. Essa definição ficou na minha cabeça e sempre me pareceu vaga.

Um belo dia, conheci um professor que resolveu iluminar meu caminho nas artes do join. Segue abaixo, a imagem milagrosa:

O Join, em síntese, é a junção de duas ou mais coleções de dados. Nessa operação de mescla, é possível atribuir filtros, ordenações e etc.

A figura a cima, exemplifica a query e seu respectivo comportamento em relação ao conjunto de dados. Os círculos representam uma determinada entidade e as intersecções entre eles exemplificam suas relações.

Exemplo:

Nesse ponto, criamos a tabela Departamento. Nela, temos 3 colunas: Id, Nome e Descrição. Em seguida criamos a coluna IdDepartamento na tabela Funcionário (com FK) para realizarmos o join:

Dessa maneira, é possível relacionar as duas entidades e retornar o conjunto de sua união, através do match de valores do id da entidade departamento com o idDepartamento da entidade funcionário.


Após esse pequeno resumo sobre os dois, vamos à solução prática para escolher entre ambos e garantir que sua escolha seja a certa.

No meu ambiente de trabalho, prezamos muito a entrega de nossos projetos. Não são 100% dos casos que dão certo, mas a intenção é sempre boa. Pensando nisso, quando me deparei com a situação em que eu tinha que saber qual dos dois era mais performático, qual era o “melhor”, simplesmente analisei o tempo que tinha pra entregar e cheguei a seguinte conclusão:

Existem duas possibilidades que considero viáveis. A primeira delas é utilizar um software que compare suas querys. O próprio Microsoft Server Sql Management Studio tem em suas features essa possibilidade. Veja o exemplo abaixo:

Primeiro, criamos a query em suas duas versões, uma com o inner join e a outra com subquery. Nossa query retornará o nome dos funcionários do departamento de TI.

Após executarmos as querys com o atalho ctrl + L (Exibir plano de execução estimado), é possível visualizar o plano de execução de cada uma das querys.

Inner Join

Subquery

Dessa maneira, conseguimos comparar as duas querys e tomar uma decisão tecnológica considerada adequada.

Até esse ponto, a análise é simples pois levamos em consideração apenas a performance. Mas consideraremos agora o tão importante prazo, que na minha opinião será o fator decisivo na sua escolha.

Pensemos em um cenário onde o prazo influencia: Você trabalha em um projeto há alguns meses e está com o prazo apertado. Em um determinado momento se depara com esse problema, a necessidade de escolher entre subquery e inner join.

É viável investir tempo na escrita de querys de maneiras diferentes para avaliar performance ? Será que não é um tempo que pode fazer falta no futuro ?

Sabemos a importância do tempo nos nossos projetos. Bugs acontecem, mudanças no escopo do projeto também (não deveria) e o tempo para o bar do final de semana é importante !

Então, defendo que o dia a dia reflete diretamente nas nossas decisões e que o tempo, no final, será o fator mais relevante. Sem tempo para analisar, eu faço da maneira que é mais confortável pra mim. Nesse contexto, complexidade da sintaxe e o tempo que leva pra escrever uma query são as características que considero decisivas.

Acho que o mais importante, em contextos que você precisa comparar e tomar decisões em relação à tecnologias, é utilizar do bom senso pra conseguir analisar bem a situação e chegar a uma solução bacana.

É isso galera, espero que tenham gostado, comentem ai em baixo, valeu !

Abraço.

    Gustavo Gois Cardoso

    Written by

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade