请原谅我这是一个重复和/或显而易见的问题,但我无法在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
虽然等效,但第二个(非嵌套)查询比第一个(嵌套)查询运行快几个数量级。在我的开发服务器和客户端的服务器上都是如此。为什么呢?
答案 0 :(得分:0)
数据库引擎在执行时将子查询保存在必需的内存中,因为它们是虚拟的而非物理的,优化器无法选择最佳路径,或者至少在计划中排序之前。这也意味着优化器将对每个操作进行多次全表扫描,而不是在临时表上进行可能的索引搜索。
将每个子查询视为一个杂耍球。您为db引擎提供的子查询越多,它一次处理的内容就越多。如果使用临时表在批量代码中简化此操作,优化器会找到一条清晰的路由,在大多数情况下,无论索引如何,至少对于更新版本的SQL Server都是如此。