【问题标题】:Why do nested select statements take longer to process than temporary tables?为什么嵌套选择语句比临时表需要更长的时间来处理?
【发布时间】:2014-12-27 00:20:24
【问题描述】:

如果这是一个重复和/或明显的问题,请原谅我,但我在 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 

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

【问题讨论】:

标签: sql sql-server


【解决方案1】:

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

将每个子查询视为一个杂耍球。你给数据库引擎的子查询越多,它一次处理的事情就越多。如果您使用临时表在批量代码中简化此操作,优化器会找到一条清晰的路线,在大多数情况下,也不管索引如何,至少对于较新版本的 SQL Server。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多