【问题标题】:Using ORDER BY on indexed columns在索引列上使用 ORDER BY
【发布时间】:2010-11-12 12:01:26
【问题描述】:

在 SQL Server 2008 中,假设我在员工表上有一个索引 (LastName, FirstName)。索引在两列上按 ASC 排序。以下查询中的 ORDER BY 是否有任何意义?

SELECT   LastName, FirstName
FROM     Employees
ORDER BY LastName, FirstName

查询分析器是否足够聪明,可以忽略 ORDER BY,因为数据已经按索引排序?还是总是指定所需的顺序更安全?

附言。我不是想进入“微优化”——只是为了更好地理解在这种情况下会发生什么。

更多信息:

为了验证理论,我随机添加了一些数据,创建了一个省略了 ORDER BY 的查询,结果是有序的。

【问题讨论】:

    标签: sql sql-server sql-order-by


    【解决方案1】:

    NO,您不能省略 order by。

    如果没有特别排序,则无法保证记录返回的顺序。

    看看

    Order of Result Set of SELECT Statement on Clustered Indexed Table When ORDER BY is Not Used

    【讨论】:

      【解决方案2】:

      即使您必须使用 ORDER BY 子句来获取结果,但 SQL 优化器足够聪明,可以利用索引进行此操作。 检查执行计划,您会发现只使用索引而不使用基表,并且操作也不会花费太多时间,因为记录是从已经排序的索引中获取的。

      【讨论】:

        【解决方案3】:

        只是想提一下 asstander 的回答中列出的文章中的一个 cmets,我觉得这很有趣......

        Create view foobar 
        as 
        select top 100 percent * from foo order by bar 
        
        select * from foobar 
        

        上述语句将不是来自 foo 的排序结果集。您没有要求订单,因此查询计划实际上可以从视图中删除订单请求。即使此 DID 在某些较旧版本的 SQL Server 上工作,它也不是预期的结果。您没有在最终查询中要求订单,这意味着无需在将结果返回给您之前对其进行排序......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-20
          • 2016-01-03
          • 2018-04-29
          • 1970-01-01
          • 2011-09-29
          • 2012-03-27
          相关资源
          最近更新 更多