ITPub博客

首页 > Linux操作系统 > Linux操作系统 > DB优化小常识 - 执行计划中Cardinality的计算

DB优化小常识 - 执行计划中Cardinality的计算

原创 Linux操作系统 作者:tolywang 时间:2012-07-18 15:07:02 0 删除 编辑

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博客 ” ,链接:https://blog.itpub.net/35489/viewspace-743631/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    14695548