Di recente ho riscontrato questo problema e non sono riuscito a trovarne alcuna discussione online.
La query qui sotto
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;
Ottiene sempre un piano di cicli nidificati
Il tentativo di forzare il problema con INNER HASH JOIN
o INNER MERGE JOIN
suggerimenti produce il seguente errore.
Il processore di query non è stato in grado di produrre un piano di query a causa dei suggerimenti definiti in questa query. Reinvia la query senza specificare alcun suggerimento e senza utilizzare SET FORCEPLAN.
Ho trovato una soluzione alternativa che consente di utilizzare hash o merge join - avvolgendo la variabile in un aggregato. Il piano generato ha costi significativamente inferiori (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;
Qual è la ragione di questo comportamento? e c'è una soluzione migliore di quella che ho trovato? (che forse non richiede i rami del piano di esecuzione extra)