У меня есть сложный запрос, который мне нужно использовать в следующем запросе (фактически обновить выражение). Я попытался использовать CTE и временную таблицу. Производительность с использованием CTE ужасна по сравнению с подходом таблицы temp. Это что-то вроде 15 секунд против миллисекунд. Чтобы упростить тест вместо присоединения к таблице CTE/Temp в последующем запросе, я просто выбрал * из него. В этом случае они выполняют то же самое.
Я рассмотрел план выполнения для обоих подходов как с объединениями в последующем запросе, так и просто выберите *. При простом выборе планы запросов примерно одинаковы, но с присоединениями в последующем выборе планов запроса нет. В частности, часть плана запроса для создания и заполнения таблицы temp остается прежней, в то время как часть плана запроса для создания и заполнения CTE резко меняется, когда она впоследствии используется в запросе с соединением.
Мой вопрос: почему план запроса для создания и совокупности CTE изменяется по тому, как он впоследствии используется во временной таблице temp. Кроме того, в каких сценариях CTE дает лучшую производительность, чем временная таблица?
* Примечание. Я также использовал переменную таблицы и сопоставим с подходом таблицы temp.
Спасибо