使用CTE的主要原因是要访问Window函数(例如row_number()
和其他)。
这意味着您可以执行以下操作,例如,快速,高效地获得每个组的第一行或最后一行- 在大多数实际情况下,比其他方法更有效。
with reallyfastcte as (
select *,
row_number() over (partition by groupingcolumn order by sortingcolumn) as rownum
from sometable
)
select *
from reallyfastcte
where rownum = 1;
您可以使用相关子查询或子查询来运行与上面类似的查询,但是CTE在几乎所有情况下都将更快。
此外,CTE确实可以帮助简化您的代码。这可以导致性能提高,因为您对查询的了解更多,并且可以引入更多业务逻辑来帮助优化器更具选择性。
此外,如果您了解业务逻辑并知道应该首先运行查询的哪些部分,则CTE可以提高性能-通常,将最有选择性的查询放在第一位,从而导致可以在其下一个联接中使用索引的结果集并添加option(force order)
查询暗示
最后,CTE默认情况下不使用tempdb,因此您可以通过使用它们来减少瓶颈上的争用。
如果您需要多次查询数据,或者如果您测量查询并通过插入临时表然后添加一个可提高性能的索引来发现查询,则应使用临时表。