2010-01-23 103 views
2

我有这些查询:我可以信任执行计划吗?

With CTE(comno) as 
(select distinct comno=ErpEnterpriseId from company) 
select id=Row_number() over(order by comno),comno from cte 

select comno=ErpEnterpriseId,RowNo=Row_number() over (order by erpEnterpriseId) from company group by ErpEnterpriseId 


SELECT erpEnterpriseId, ROW_NUMBER() OVER(ORDER BY erpEnterpriseId) AS RowNo 
FROM 
( 
    SELECT DISTINCT erpEnterpriseId 
    FROM Company 
) x 

三个人都返回相同的成本和实际执行plans..why和怎么做的?

回答

1

这一切都归结于查询优化器 - 这将通过试图优化您输入到最有效的执行计划中的查询(即几个不同的查询可以优化到估计最有效的SAME语句)。

在尝试优化查询并查找哪一个执行最佳时,您应该做的主要事情就是尝试一下并比较性能。运行SQL分析器跟踪以查看每个版本的持续时间/读取内容。我通常运行查询的每个版本3次以获得平均值进行比较。每次清除执行计划和数据缓存以防止结果偏斜。

值得在优化器上阅读this MSDN article

1

很简单,优化器可能会将您的所有语句转换为相同的语句。

+0

Hi Otavio, 我要求的答案不是概率.. – TonyP 2010-02-13 14:37:09

+0

这是我的答案,我坚持它。 – 2010-02-13 14:39:37

0

就像英语一样,其中有很多方法可以说相同的事情,所有这三个查询都要求输入相同的数据。 SQL引擎(查询优化器)知道并且足够聪明,知道你在问什么。

更合适的是,引擎具有您不知道(或可能不知道)的信息 - 数据如何组织和编制索引。它使用这些信息来自己决定获取数据的最佳方式,这就是它正在做的事情。

尽管有许多方法可以覆盖优化器,但除非您真的知道自己在做什么,否则您可能只会伤害性能。因此,您最好的选择是以任何对您(或其他人)最有意义的方式编写查询以实现可读性和可维护性。