
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.
