为什么len函数可以使用索引?
Why Len Function Can Use Index?
我有一个 table 有 145000 行。并且没有任何索引。
当我运行低于sql。我按预期在执行计划上发现了 table 扫描。它生成六行和 3481 逻辑读取。
SET STATISTICS IO ON
SELECT columnA FROM table WHERE LEN(columnA)<>5
然后我在 columnA 上添加了一个聚集索引,运行 sql.I 在执行计划中发现了一个聚集索引扫描。它生成六行和 3511 逻辑读取。我可以理解更大的逻辑读取 B 树节点读取。
但让我感到困惑的是,我在 columnA 和 运行 sql 上使用了非聚集索引而不是聚集索引。我在执行计划上找到了索引扫描。它生成六行,只需要 417 逻辑读取!。
我不认为 len() 函数可以利用索引。但是为什么 columnA 上的非聚集索引使逻辑读取更少(9 次)?
LEN
函数无法对索引进行"use",但是索引,只包含这一列,占用的空间会少很多space,在整体上,比基础 table 做的要好。所以扫描这个索引比扫描基础table.
更有效率
扫描基础 table 将加载 table 中的所有其他列,即使它们不需要满足查询。
我有一个 table 有 145000 行。并且没有任何索引。
当我运行低于sql。我按预期在执行计划上发现了 table 扫描。它生成六行和 3481 逻辑读取。
SET STATISTICS IO ON
SELECT columnA FROM table WHERE LEN(columnA)<>5
然后我在 columnA 上添加了一个聚集索引,运行 sql.I 在执行计划中发现了一个聚集索引扫描。它生成六行和 3511 逻辑读取。我可以理解更大的逻辑读取 B 树节点读取。
但让我感到困惑的是,我在 columnA 和 运行 sql 上使用了非聚集索引而不是聚集索引。我在执行计划上找到了索引扫描。它生成六行,只需要 417 逻辑读取!。
我不认为 len() 函数可以利用索引。但是为什么 columnA 上的非聚集索引使逻辑读取更少(9 次)?
LEN
函数无法对索引进行"use",但是索引,只包含这一列,占用的空间会少很多space,在整体上,比基础 table 做的要好。所以扫描这个索引比扫描基础table.
扫描基础 table 将加载 table 中的所有其他列,即使它们不需要满足查询。