Melhor resposta
Embora as junções e subconsultas tenham seu lugar nas instruções SQL, eu pessoalmente sempre tento escrever minhas consultas usando exclusivamente junções . Enquanto isso, só introduzo uma subconsulta quando não consigo buscar os dados que desejo sem ela.
O motivo é que as junções tendem a ser executadas mais rapidamente. Na verdade, eu iria mais longe e diria que o tempo de recuperação da consulta usando junções quase sempre será mais rápido do que o de uma subconsulta.
A razão é que as junções aliviam a carga de cálculo no banco de dados substituindo várias consultas por uma consulta de junção. Isso, por sua vez, usa melhor as habilidades do banco de dados para pesquisar, filtrar e classificar os registros.
Claro, conforme você adiciona mais junções a uma consulta, o servidor de banco de dados precisa fazer mais trabalho, o que traduz para tempos de recuperação de dados mais lentos.
Embora as junções sejam necessárias para recuperar dados de um banco de dados normalizado, é importante que as junções sejam gravadas corretamente, pois as junções incorretas podem resultar em séria degradação do desempenho e resultados de consulta imprecisos.
Em alguns casos, as subconsultas podem substituir junções e uniões complexas com apenas um efeito negativo mínimo no desempenho.
Exemplos de subconsultas
Às vezes, você não consegue realmente usar uma subconsulta. Aqui estão alguns exemplos usando o banco de dados de amostra Sakila para MySQL e meu Navicat para desenvolvimento de banco de dados e cliente administrativo.
Exemplo # 1: Usando uma função agregada como parte de uma cláusula JOIN
Na maioria das vezes, as tabelas são unidas em um campo comum. Na verdade, não é incomum que o campo comum também compartilhe o mesmo nome para mostrar que são os mesmos dados. No entanto, na consulta a seguir, a tabela de clientes é unida à última (MAX) data\_de\_criação para que os resultados da consulta sejam para o cliente que se inscreveu mais recentemente.
Uma subconsulta é empregada porque você não pode usar funções agregadas como parte de uma cláusula WHERE. Esta engenhosa solução alternativa circunda essa limitação!
Exemplo nº 2:
Nesta consulta, uma subconsulta é empregada para buscar um conjunto de resultados intermediário para que possamos aplicar a função AVG () à COUNT de filmes alugados. Isso é o que chamo de agregação dupla porque estamos aplicando uma agregação (AVG) ao resultado de outra (COUNT).
Esta consulta em particular é bastante rápida – leva apenas 0,044 segundos – porque a consulta interna retorna um único valor. Normalmente, as consultas mais lentas são aquelas que requerem varreduras completas da tabela.
Espero que isso responda à sua pergunta.
Atenciosamente!
Adam
Resposta
Normalmente você deve escrever consultas para ser o mais claro possível e deixar a otimização para o processador de consultas do RDBMS e do DBA, se houver, que é responsável por ajustar o design físico. deve resultar em um desempenho bom o suficiente na maioria dos casos, mas há exceções. Às vezes, um otimizador de consulta de RDBMS tem pontos cegos ou casos ruins.
Agora, se junções ou subconsultas serão um problema para um otimizador, é muito mais provável que esteja em subconsultas. Isso porque o join é um recurso básico da linguagem que todos usam, enquanto muitos usuários não usam subconsultas. Descobri nisso convertendo um aplicativo do Sybase para o SQL Server, tive que reescrever muitas subconsultas como junções por causa de bugs nos tratamento de subconsultas – embora em um caso muito específico (onde a cláusula where da subconsulta incluía um parâmetro vinculado). Não é surpreendente que o SQL Server tenha bugs nas subconsultas porque muitos de seus clientes usam o SQL Server com editores de consulta gráfica da Microsoft, que naturalmente produzem junções, mas não subconsultas.
Eu normalmente desaconselho a otimização prematura, mas farei uma exceção aqui. Se seu aplicativo tiver que ser portátil em várias plataformas de banco de dados, eu prefiro unir a subconsultas na maioria dos casos porque é mais provável que você encontre bugs ou escolhas ruins de otimizador com subconsultas. o aplicativo não precisa ser portável, escreva a consulta do que parece ser a forma mais natural e se não houver problema – o que será na maioria das vezes – ótimo. Se houver um problema, reescreva a consulta de maneira diferente para ver se isso ajuda. E se você tiver um DBA, consulte-o sobre quaisquer problemas de desempenho que você tenha.