我被要求测试对查询的更改,将表值函数 (TVF) 移动到 CTE(非递归)中。我的理解是每个 CTE 引用都是单独执行的,因此更改有可能导致 tempdb 争用......
看到使用 CTE 时查询性能得到提高,我感到非常惊讶。IE:
;WITH cte AS (
SELECT t.col FROM dbo.getValues() t)
SELECT ...
JOIN cte c ...
UNION ALL
SELECT ...
JOIN cte c ...
任何人都可以阐明为什么会这样吗?
我认为行为是 CTE 被“预期”多次评估,但它并不总是这样工作(例如,不能保证)。可能有很多变量以一种或另一种方式决定行为。你能分享一个实际的执行计划吗?