Вопрос

Слишком долго застрял с 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top