CTE или не CTE
-
26-09-2019 - |
Вопрос
Слишком долго застрял с SQL2000, у меня не было много воздействия на общие таблицы выражений.
Ответы, которые я дал здесь (# 4025380) а также здесь (# 4018793) пошли против потока в том, что они не использовали CTE.
Я ценю, что для рекурсии они находятся в непосредственной близости, и есть несколько запросов, которые могут быть значительно упрощены их использованием, но в какой момент их использование просто легкомысленно? У них есть отличная производительность по подкуму или присоединению? Они действительно упрощают код и делают его более ремонтом?
Короче говоря, когда хорошая практика использовать CTE на «меньший» синтаксис.
Решение
Как правило, вы должны использовать CTE через обычный подзапрос, если:
- Ваш запрос требует рекурсии (как вы отмечали)
- Подзапрос большой или сложный
- Содержащий запрос большой или сложный
- Подзапрос повторяется (или, по меньшей мере, несколько подзапросов можно упростить, выполняя различные простые операции на общем подзапросе)
Короче говоря, да, они делают запросы более читаемыми при хорошо используемых.
Другие советы
Лично, как только у меня комфортно используют их, я думаю, что они производят более чистый, более читаемый код. В качестве примера сравните свой ответ на мой на #4018793. Отказ Мы по сути сделали то же самое; Я использовал CTE, и вы этого не сделали.
Ваш ответ без CTE:
SELECT
course,
section,
grade,
gradeCount
FROM
table
INNER JOIN
(SELECT
grade,
Max(gradeCount) as MaxGradeCount
FROM
table
) MaxGrades
ON table.grade = MaxGrades.grade
AND table.gradeCount = MaxGrades.MaxGradeCount
ORDER BY
table.grade
Мой ответ с CTE:
;with cteMaxGradeCount as (
select
grade,
max(gradeCount) as MaxGradeCount
from @Test
group by grade
)
select
t.course,
t.SECTION,
t.grade,
t.gradeCount
from cteMaxGradeCount c
inner join @Test t
on c.grade = t.grade
and c.MaxGradeCount = t.gradeCount
order by t.grade
Они синтаксические сахар, за исключением иерархических / рекурсивных запросов.
Тем не менее, не все, что можно сделать рекурсивно, должно быть - дата поколения через рекурсивный CTE был едва лучше, чем курсор - таблица для таблицы настолько лучше.
CTE дает быстрее привести к рекурсивному сценарию. Результат CTE многократно используется для получения окончательных результатов. Таким образом, поскольку вы взяли свой пункт или подзапрос в CTE, определенно появится улучшение производительности.
Ссылка : http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx.
Просто отметка, во многих сценариях, TEMP Tables дает лучшую производительность, затем CTE также, поэтому вы должны попробовать также TEMP Tables.
Ссылка : http://social.msdn.microsoft.com/forums/en/transactsql/thrad/d040d19d-016e-4a21-bf44-a0359fb3c7fb.