2010-06-28 30 views
2

请考虑以下查询。添加内部查询不会更改执行计划

select * from contact where firstname like '%some%' 

select * from 
    (select * from contact) as t1 
where firstname like '%some%' 

这两个查询的执行计划是相同的,并在同一时间执行。但是,我期待第二个查询将有不同的计划并执行得更慢,因为它必须从联系人中选择所有数据并应用过滤器。看起来我错了。

我想知道这是怎么发生的?

数据库服务器:SQL服务器2005

回答

6

“查询优化器”是发生了什么事情。当你运行查询时,SQL Server使用基于成本的优化器来确定什么可能是完成该请求的最佳方式(即它是执行计划)。把它想象成从地点A到地点B的路线图。从A到B可能有许多不同的方式,有些会比其他的更快。 SQL Server将锻炼不同的路线,以实现返回满足查询的数据并使用具有可接受成本的数据的最终目标。请注意,它不一定需要分析各种可能的方式,因为这样做会不必要的花费太多。

就你而言,优化器已经发现这两个查询可以折叠成相同的东西,因此你可以得到相同的计划。