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 JOIN
o INNER MERGE JOIN
pistas 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)