Sé que esta es una publicación antigua, pero creo que es un tema muy importante, especialmente hoy en día, donde tenemos más de 10 millones de registros y hablamos de terabytes de datos.
También contribuiré con las siguientes observaciones. Tengo alrededor de 45 millones de registros en mi tabla ([datos]) y alrededor de 300 registros en mi tabla [gatos]. Tengo una indexación extensa para todas las consultas de las que estoy a punto de hablar.
Considere el ejemplo 1:
UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid
versus Ejemplo 2:
UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d
El ejemplo 1 tardó unos 23 minutos en ejecutarse. El ejemplo 2 tomó alrededor de 5 minutos.
Entonces, concluiría que la subconsulta en este caso es mucho más rápida. Por supuesto, tenga en cuenta que estoy usando unidades SSD M.2 con capacidad de E / S a 1 GB / seg (eso es bytes, no bits), por lo que mis índices también son muy rápidos. Entonces, esto también puede afectar las velocidades en sus circunstancias
Si se trata de una limpieza de datos única, probablemente sea mejor dejarla ejecutándose y finalizar. Utilizo TOP (10000) y veo cuánto tiempo lleva y multiplico por el número de registros antes de llegar a la gran consulta.
Si está optimizando las bases de datos de producción, le sugiero encarecidamente que procese previamente los datos, es decir, utilice activadores o intermediarios de trabajo para sincronizar los registros de actualización, de modo que el acceso en tiempo real recupere datos estáticos.