索引片及匹配列

访问路径(即执行计划)的成本很大程序上取决于索引片的厚度, 即谓词表达式确定的值域范围.索引片越厚,需要顺序扫描的索引页就越多,需要处理的索引页记录也越多, 而最大开销还是来自于增加对表的同步读操作.相反, 如果索引片比较窄, 就会显著减少索引访问的那部分开销,但主要的成本节省还是在更少的对表的同步读上.

另一种广泛的描述索引片的方法是:定义索引匹配列的数量.

索引过滤及过滤列

有时候,列可能既存在于 WHERE 子句中,也存在于索引中,但这个列却不能参与索引片的定义. 不过, 这些列仍然能减少对表进行同步读的次数, 也以这些列仍然扮演着很重要的角色, 我们称这些列为过滤列.

假如有复合索引: A,B,C,D

从头到尾依次检索索引列:

  1. 在WHERE子句,该列是否至少拥有一个足够简单的谓词与之对应?如果有,那么这个列就是匹配列.如果没有,那么这个列及其后的索引列,都是非匹配列.

  2. 如果该谓词是一个范围谓词,那么剩余的索引列都是非匹配列.

  3. 对于最的一个匹配列之后的索引列,如果拥有一个足够简单的谓词与其对应,那么该列为过滤列.

如: where A = :A and B > :B and C = :C A,B是匹配列,而C是索引过滤列.

访问路径术语

也即是执行计划.

表查找: SQL Server用来描述使用索引并且需要读取表行的访问路径. 消除表访问的最显而易见的方式,就是将缺失的列添加到索引上.许多SQL Server的书将这种能避免某个SELECT调用的表访问的索引称为覆盖索引.使用覆盖索引的SELECT语句,有时被称为覆盖SELECT.

帮助优化器(统计信息)

优化器进行成本估算是基于统计的信息的.如果信息不完整,优化器可能会执行错误的决定.

在应用程序开发的过程中,基于成本的优化器进行访问路径选择的处理成本不容忽视.

每次执行时进行路径访问选择,这方式可能会为优化器提供一个更好的访问路径的机会.

过滤因子

它描述了谓词的选择性, 即表中满足表的谓词条件的记录行所占的比例.

在评估一个索引是否合适时,最差情况下的过滤因子比平均过滤因子更重要.

组合谓词过滤因子

如果谓词A与谓词B没有相关性,那么它们的组合谓词的过滤因子(WHERE A AND B)为 1/A列中不同值的个数 * 1/B列中不同值的个数.

在设计索引结构的时候, 需要将组合谓词看作一个整体来评估过滤因子, 而不能仅仅基于零相关性进行评估.