Me encontré con este problema recientemente y no pude encontrar ninguna discusión en línea.
La consulta a continuación
DECLARE @S VARCHAR(1) = '';
WITH T
AS (SELECT name + @S AS name2,
*
FROM master..spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;
Siempre obtiene un plan de bucles anidados

Intentar forzar el problema con INNER HASH JOINo INNER MERGE JOINpistas produce el siguiente error.
El procesador de consultas no pudo generar un plan de consulta debido a las sugerencias definidas en esta consulta. Vuelva a enviar la consulta sin especificar ninguna sugerencia y sin usar SET FORCEPLAN.
Encontré una solución alternativa que permite el uso de combinaciones hash o de fusión, envolviendo la variable en un agregado. El plan generado tiene un costo significativamente menor (19.2025 vs 0.261987)
DECLARE @S2 VARCHAR(1) = '';
WITH T
AS (SELECT name + (SELECT MAX(@S2)) AS name2,
*
FROM spt_values)
SELECT *
FROM T T1
INNER JOIN T T2
ON T1.name2 = T2.name2;

¿Cuál es la razón de este comportamiento? y hay una mejor solución que la que encontré? (que tal vez no requiere las ramas adicionales del plan de ejecución)
fuente


