DB中如果我们使用CBO作为优化器,一条SQl语句就会有多种执行路径,那么CBO会计算各个执行路径的访问代价,选择代价最小的作为我们的执行计划。CBO在做访问路径估算的时候有一个很重要的参数作为我们计算Cost的因数,这个就是我们通常所说的扫描字段的集的势(Cardinality) 。
一般公式如下:
Cardinality=MAX(Cardinality Factor * Rowcount,1)
1) . 索引字段: 对于这个字段的查询条件是"="的情况下,我们的Cardinality Factor的计算公式就如下:
Cardinality Factor = 1 / 字段上的唯一值的数量
2). 索引字段的查询条件是"" "<=" ">=" 那么我们计算Cardinality Factor的公式就为
Cardinality Factor = (1 / 字段上的唯一值的数量) + (1 / 记录数)
3). 索引字段的查询条件是in,那么我们的公式就为:
Cardinality Factor = in条件中的变量数 / 字段上的唯一值的数量
4). 索引字段的查询条件是"<>",那么我们的公式就为:
Cardinality Factor = ( 1 - (1 / 字段上的唯一值的数量 ) )
5). 查询条件为not in的时候,Cardinality的结果是根据not in中变量作为阶乘得出的公式为:
Cardinality Factor = ( 1 - (1 / 字段上的唯一值的数量 ) ) ^ (not in 变量数)
非索引字段
1). 当查询条件为"="或者是"in"的时候,非索引字段的Cardinality Factor的计算公式为:
Cardinality Factor = 1 / 100
2). 当查询条件为"","<=",">=","<>","not in",非索引字段的Cardinality Factor的计算公式为:
Cardinality Factor = 1 / 20
3). 非索引多字段
公式: Cardinality Factor = 字段1的Cardinality Factor * 字段2的Cardinality Factor * ... * 字段n的Cardinality Factor
4). 全表扫描
Cardinality Factor=1;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-743631/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-743631/