避免使用带有CTE的SQL Server临时表
我希望避免使用临时表来获得可能的性能?
数据:2个表具有相同的输出 问题:我想将2个CTE合并为1个CTE输出。似乎示例仅显示联接并减少记录数量等。
没有命名我要执行的所有字段
WITH Table_A_CTE AS
(
Select * from TableA
),
Table_B_CTE
(
Select * from TableB
)
--Result
Select * from Table_A_CTE , Table_B_CTE
-- above is not going to work - identical columns (as the number of columns and aliases for columns are the same)
我看到了一个关于此问题的堆栈溢出答案,但它的记录是我创建临时表并将TableA和TableB插入临时表并从临时表中选择时的两倍。
SELECT * FROM Table_A_CTE
UNION ALL
SELECT * FROM Table_B_CTE
UNION ALL
SELECT * FROM Table_A_CTE
我意识到CTE有一些目的,但我希望避免使用临时表和表变量,而这两个表都同时影响tempdb等。
答案 0 :(得分:0)
现在进入CTE,第一次花费10秒,然后花费1-2秒。 是的,我每次都会在临时表上接受CTE。表变量非常慢,有很多记录,并且它们有99%的时间进入tempdb。
在这一点上,我不确定我是否会再次使用表变量,因为它们达到tempdb的速度很慢,而且受到限制。 临时表-如果需要加载大量数据,则可以使用临时表,否则我将使用CTE
基于上述问题:我正在这样做,效果很好。
SELECT * FROM Table_A_CTE
UNION ALL
SELECT * FROM Table_B_CTE