Select 的列数少于索引中的列数
Select has less column then Include columns in index
假设我创建了包含列的非聚簇索引
如果我们从 table1 中查询 select col2, col3 where col1=value1
索引是在 col1 上创建的,包含 col2、col3、col4。
在这种情况下,是否会使用我的非聚集索引,它会使用来自叶节点的包含列?或者它会再次查找 col2 和 col3?因为包含的列比 selected 列多?
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3,Col4)
我的select是:
select col2,col3 from mytable where col1=value1
是的,您的查询应该使用您之前定义的索引。我说 "should," 是因为当情况可能并非如此时总是有警告,但通常我希望 SQL 服务器使用索引。您在 INCLUDE
子句中涵盖的 比 select 所要求的多 列并没有太大变化。这仅表示数据库不会使用 Col4
信息。但其他一切,例如遍历 B 树的行为应该与只覆盖 select 请求的列完全相同。
回到"should"部分。如果您的 table 非常小,比如只有几十条记录或更少,那么 SQL 服务器可能不会选择使用任何索引,而是进行完整的 table 扫描。使用索引需要付出隐含的前期代价,对于非常小的 table,它可能不值得付出代价。可能还有其他边缘情况。
假设我创建了包含列的非聚簇索引 如果我们从 table1 中查询 select col2, col3 where col1=value1
索引是在 col1 上创建的,包含 col2、col3、col4。
在这种情况下,是否会使用我的非聚集索引,它会使用来自叶节点的包含列?或者它会再次查找 col2 和 col3?因为包含的列比 selected 列多?
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3,Col4)
我的select是:
select col2,col3 from mytable where col1=value1
是的,您的查询应该使用您之前定义的索引。我说 "should," 是因为当情况可能并非如此时总是有警告,但通常我希望 SQL 服务器使用索引。您在 INCLUDE
子句中涵盖的 比 select 所要求的多 列并没有太大变化。这仅表示数据库不会使用 Col4
信息。但其他一切,例如遍历 B 树的行为应该与只覆盖 select 请求的列完全相同。
回到"should"部分。如果您的 table 非常小,比如只有几十条记录或更少,那么 SQL 服务器可能不会选择使用任何索引,而是进行完整的 table 扫描。使用索引需要付出隐含的前期代价,对于非常小的 table,它可能不值得付出代价。可能还有其他边缘情况。