【问题标题】:Select has less column then Include columns in index选择的列少于索引中的包含列
【发布时间】:2020-01-31 19:57:52
【问题描述】:

假设我创建了包含列的非聚集索引 如果我们查询 select col2, col3 from table1 where col1=value1

索引在 col1 上创建,包括 col2,col3,col4。

在这种情况下,是否会使用我的非聚集索引,并且会使用叶节点的包含列?或者它会再次查找col2和col3?因为包含的列比选定的列多?

CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3,Col4)

我的选择是:

select col2,col3 from mytable where col1=value1

【问题讨论】:

  • 听起来你可以很容易地测试自己
  • 执行计划告诉你什么,或者你看它时有什么不明白的地方?

标签: sql-server non-clustered-index


【解决方案1】:

是的,您的查询应该使用您之前定义的索引。我说“应该”,因为在可能并非如此的情况下,总是有一些警告,但总的来说,我希望 SQL Server 使用索引。您在INCLUDE 子句更多 列中覆盖的内容比您的选择要求的内容并没有太大变化。这只意味着数据库不会使用Col4 信息。但其他一切,例如遍历 B 树的行为应该与您只覆盖了您的 select 请求的列完全相同。

回到“应该”部分。如果您的表非常小,比如只有几十条记录或更少,那么 SQL Server 可能不会选择使用任何索引,而是进行全表扫描。使用索引有一个隐含的预付费用,对于一个非常小的表,它可能不值得这个价格。可能还有其他边缘情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多