为什么嵌套的select语句比临时表需要更长的处理时间?

时间:2014-10-30 19:35:30

标签: sql sql-server

请原谅我这是一个重复和/或显而易见的问题,但我无法在stackoverflow或其他网上找到满意的答案。

使用Microsoft SQL Server,我有一个嵌套的选择查询,如下所示:

select * 
into FinalTable 
from 
    (select * from RawTable1 join RawTable2)
    join
    (select * from RawTable3 join RawTable4)

可以使用临时表来编写查询,而不是使用嵌套选择,如下所示:

select * 
into Temp1 
from RawTable1 join RawTable2

select * 
into Temp2 
from RawTable3 join RawTable4

select * 
into FinalTable 
from Temp1 join Temp2 

虽然等效,但第二个(非嵌套)查询比第一个(嵌套)查询运行快几个数量级。在我的开发服务器和客户端的服务器上都是如此。为什么呢?

1 个答案:

答案 0 :(得分:0)

数据库引擎在执行时将子查询保存在必需的内存中,因为它们是虚拟的而非物理的,优化器无法选择最佳路径,或者至少在计划中排序之前。这也意味着优化器将对每个操作进行多次全表扫描,而不是在临时表上进行可能的索引搜索。

将每个子查询视为一个杂耍球。您为db引擎提供的子查询越多,它一次处理的内容就越多。如果使用临时表在批量代码中简化此操作,优化器会找到一条清晰的路由,在大多数情况下,无论索引如何,至少对于更新版本的SQL Server都是如此。