我可以信任执行计划吗?

时间:2010-01-23 13:49:02

标签: sql-server-2005

我有这些查询:

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 

他们三个都返回相同的成本和实际执行计划......为什么以及怎么做?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这完全归功于查询优化器 - 通过尝试优化您输入最有效的执行计划的查询(即,可以优化几个不同的查询,直到估计最有效的SAME语句)。 / p>

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

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

答案 2 :(得分:0)

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

更合适的是,引擎具有您不(或可能不知道)的信息 - 数据的组织和索引方式。它使用这些信息来决定获取数据的最佳方式,以及它正在做什么。

虽然有办法覆盖优化器,除非你真的知道自己在做什么,否则你可能只会损害性能。因此,您最好的选择是以对您(或其他人类)最有意义的方式编写查询,以提高可读性和可维护性。