Sei que esse é um post antigo, mas acho que é um tópico muito importante, principalmente hoje em dia onde temos mais de 10 milhões de registros e falamos de terabytes de dados.
Também vou ponderar com as seguintes observações. Tenho cerca de 45 milhões de registros em minha tabela ([dados]) e cerca de 300 registros em minha tabela [gatos]. Tenho uma ampla indexação para todas as consultas sobre as quais estou prestes a falar.
Considere o Exemplo 1:
UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid
versus Exemplo 2:
UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d
O Exemplo 1 levou cerca de 23 minutos para ser executado. O exemplo 2 demorou cerca de 5 minutos.
Portanto, concluo que a subconsulta neste caso é muito mais rápida. Claro, lembre-se de que estou usando unidades SSD M.2 capazes de i / o @ 1 GB / s (isso é bytes, não bits), então meus índices são muito rápidos também. Portanto, isso pode afetar as velocidades também nas suas circunstâncias
Se for uma limpeza de dados única, provavelmente melhor deixá-la em execução e terminar. Eu uso TOP (10000) e vejo quanto tempo leva e multiplico pelo número de registros antes de atingir a grande consulta.
Se você estiver otimizando bancos de dados de produção, sugiro fortemente o pré-processamento de dados, ou seja, use gatilhos ou corretor de tarefas para atualizar registros assíncronos, de modo que o acesso em tempo real recupere dados estáticos.