Sua suposição é falsa; a subconsulta será executada apenas uma vez. A razão pela qual é mais lento que uma junção é porque
IN
não pode tirar proveito dos índices; ele tem que varrer seus argumentos uma vez para cada vez que WHERE
cláusula é avaliada, ou seja, uma vez por linha na tabelaA. Você pode otimizar a consulta, sem usar variáveis ou procedimentos armazenados, simplesmente substituindo o IN
com uma junção, assim:SELECT tableA.field1, tableA.field2, [...]
FROM tableA
INNER JOIN tableB ON tableA.id = tableB.id
A menos que você não se importe em retornar todos os campos de ambas as tabelas, você precisa enumerar os campos que deseja no
SELECT
cláusula; tableA.*
, por exemplo, provocará um erro de sintaxe.