为什么Len功能可以使用索引?

joj*_*ojo 4 sql-server clustered-index non-clustered-index

我有一个145000行的表.并没有任何索引.

当我在sql下运行时.我按预期在执行计划上找到了表扫描.它生成六行和3481逻辑读取.

SET STATISTICS IO ON
SELECT columnA FROM table WHERE LEN(columnA)<>5
Run Code Online (Sandbox Code Playgroud)

然后我在columnA上添加一个聚簇索引并运行sql.I在执行计划中找到一个集群索引扫描.它生成六行和3511逻辑读取.我可以理解B树节点读取的更大逻辑读取.

但令我困惑的是,我在columnA上使用非聚集索引而不是聚簇索引并运行sql.我在执行计划上找到了索引扫描.它生成六行,只需要417个逻辑读取!

我不认为len()函数可以利用索引.但是为什么columnA上的非聚集索引会减少逻辑读取次数(9次)?

Dam*_*ver 6

LEN函数不能"使用"索引,但包含此列的索引将占用比基表更少的空间.因此,扫描此索引比扫描基表更有效.

扫描基表将加载表中的所有其他列,即使它们不需要满足查询.