避免使用带有CTE的SQL Server使用临时表

时间:2019-04-08 20:31:55

标签: sql sql-server tsql common-table-expression temp-tables

避免使用带有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等。

1 个答案:

答案 0 :(得分:0)

从可怕的临时表开始,持续25秒,并且始终写入tempdb。 重新运行,一次又一次地重复。

现在进入CTE,第一次花费10秒,然后花费1-2秒。 是的,我每次都会在临时表上接受CTE。表变量非常慢,有很多记录,并且它们有99%的时间进入tempdb。

在这一点上,我不确定我是否会再次使用表变量,因为它们达到tempdb的速度很慢,而且受到限制。 临时表-如果需要加载大量数据,则可以使用临时表,否则我将使用CTE

基于上述问题:我正在这样做,效果很好。

SELECT * FROM Table_A_CTE
UNION ALL
SELECT * FROM Table_B_CTE