【问题标题】:Can including columns into the SELECT from the same table slow down the query?将列包含在同一个表中的 SELECT 中会减慢查询速度吗?
【发布时间】:2013-04-03 05:32:55
【问题描述】:

想象 Foo 表在 ColA 和 ColB 上有非聚集索引 在 ColC、ColD 上没有索引

SELECT colA, colB
FROM Foo

需要大约 30 秒

SELECT colA, colB, colC, colD
FROM Foo

需要大约 2 分钟

Foo 表有超过 500 万行。

问题: 包含不属于索引的列是否可能会减慢查询速度? 如果是,为什么? - 它们不是已经读过的 PAGE 的一部分吗?

【问题讨论】:

    标签: sql-server sql-server-2008 tsql indexing non-clustered-index


    【解决方案1】:

    简单的答案是:因为非聚集索引不与数据存储在同一页中,所以 SQL Server 必须查找实际的数据页来获取其余部分。

    非聚集索引存储在单独的数据结构中,而聚集索引存储在与实际数据相同的位置。这就是为什么你只能有一个聚集索引。

    【讨论】:

      【解决方案2】:

      如果您编写的查询使用covering index,则不会访问堆/聚集索引中的完整数据页。

      如果您随后向查询中添加更多列,以使索引不再覆盖,则将发生额外的查找(如果仍在使用索引),或者您完全强制使用不同的数据访问路径(例如使用表扫描而不是使用索引)


      自 2005 年以来,SQL Server 支持 index 中包含的列的概念。这包括索引叶子中的非键列 - 因此它们在索引使用的数据查找阶段没有用,但仍然有助于避免在堆/聚集索引中执行额外的查找,如果他们'足以使索引成为覆盖索引。


      此外,将来,如果您想更好地了解为什么一个查询快而另一个查询慢,请查看生成 Execution Plans,然后您可以进行比较。

      即使你不理解所使用的术语,你至少应该能够“找出它们之间的差异”,然后根据术语进行搜索(例如表扫描、索引查找或查找)

      【讨论】:

        猜你喜欢
        • 2013-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-18
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多