Я считаю, что обычно повторное CTE не дает никаких улучшений производительности.
Так, например, если вы используете CTE для заполнения таблицы, а затем тот же CTE, к которому нужно присоединиться в более позднем запросе, никакой пользы. К сожалению, CTE не являются снимками, и их буквально нужно повторять, чтобы использовать в двух отдельных операторах, поэтому они, как правило, оцениваются дважды.
Вместо CTE я часто использую встроенные TVF (которые могут содержать CTE), что обеспечивает правильное повторное использование, и ничем не лучше или хуже, чем CTE в моих SP.
Кроме того, я также нахожу, что план выполнения может быть плохим, если первый шаг изменяет статистику так, что план выполнения для второго шага всегда является неточным, поскольку он оценивается перед выполнением каких-либо шагов.
В этом случае я смотрю на ручное хранение промежуточных результатов, гарантируя, что они правильно проиндексированы, и разбивая процесс на несколько SP, и добавляя WITH RECOMPILE, чтобы у последующих SP были планы, подходящие для данных, которыми они являются собираюсь оперировать.