oracle 基数 选择率,Oracle预估的基数算法

SQL> create table t as select * from dba_objects;

Table created.

SQL> create index idx_t on t(object_id);

Index created.

SQL> BEGIN

2 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'TEST',

3 tabname => 'T',

4 estimate_percent => 100,

5 method_opt => 'for all columns size auto',

6 degree => DBMS_STATS.AUTO_DEGREE,

7 cascade => TRUE);

8 END;

9 /

SQL> alter session set optimizer_features_enable='9.2.0';

Session altered.

SQL> explain plan for select owner from t where object_id<1000;

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------

Plan hash value: 1594971208

---------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost |

---------------------------------------------------------------------

| 0 | SELECT STATEMENT | |958 | 10538 | 26 |

| 1 | TABLE ACCESS BY INDEX ROWID| T |958 | 10538 | 26 |

|* 2 | INDEX RANGE SCAN | IDX_T |958 | | 4 |

---------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - access("OBJECT_ID"<1000)

Note

-----

- cpu costing is off (consider enabling it)

18 rows selected.

那么这个958 Oracle是怎么估算的呢?

Oracle预估的基数等于有效选择性*(num_rows-num_nulls)

其中 有效选择性 ,< 的有效选择性算法为:

(limit-low_value)/(high_value-low_value)

set linesize 200

SQL> select b.num_rows,

a.num_distinct,

a.num_nulls,

utl_raw.cast_to_number(high_value) high_value,

utl_raw.cast_to_number(low_value) low_value,

(b.num_rows - a.num_nulls) "NUM_ROWS-NUM_NULLS",

utl_raw.cast_to_number(high_value) -

utl_raw.cast_to_number(low_value) "HIGH_VALUE-LOW_VALUE"

from dba_tab_col_statistics a, dba_tables b

where a.owner = b.owner

and a.table_name = b.table_name

and a.owner = 'TEST'

and a.table_name = upper('T')

and a.column_name = 'OBJECT_ID'; 2 3 4 5 6 7 8 9 10 11 12 13 14

NUM_ROWS NUM_DISTINCT NUM_NULLS HIGH_VALUE LOW_VALUE NUM_ROWS-NUM_NULLS HIGH_VALUE-LOW_VALUE

---------- ------------ ---------- ---------- ---------- ------------------ --------------------

73964 73964 077085 2 73964 77083

那么估算为:

SQL>

select ceil((1000-2)/77083*73964) from dual;SQL>

CEIL((1000-2)/77083*73964)

--------------------------

958

Oracle 就是根据这个算法的

&lbrack;Oracle&rsqb; 关系型数据库排序算法和数据结构以及关联查询

关系型数据库排序算法和数据结构以及关联查询 1. Merge sort 理解merge sort算法将有助于更好地理解数据库join操作 - merge join 算法逻辑 将2个有序的大小为N/2的 ...

oracle plsql 实现apriori算法

对apriori关联关系算法研究了一段时间,网上能搜到的例子,大部分是python写的,数据集长得像下面这样: [[I1,I2,I5],[I2,I4],[I2,I3],[I1,I2,I4],[I1,I ...

【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)

RAC 特殊问题和实战经验(五) 概述:写下本文档的初衷和动力,来源于上篇的.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)

本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...

SQL Server 执行计划利用统计信息对数据行的预估原理以及SQL Server 2014中预估策略的改变

前提  本文仅讨论SQL Server查询时, 对于非复合统计信息,也即每个字段的统计信息只包含当前列的数据分布的情况下, 在用多个字段进行组合查询的时候,如何根据统计信息去预估行数的. 利用不同字段 ...

Round in Oracle&sol;VBA

VBA的 Round采用的是银行家算法(rounds to the nearest even number) Round(1.5) = 2 Round(0.5) = 在Oracle中实现银行家算法 S ...

Oracle逻辑读详解

1.物理读(physical read) 当数据块第一次读取到,就会缓存到buffer cache 中,而第二次读取和修改该数据块时就在内存buffer cache 了 以下是例子: 1.1  第一次 ...

Oracle 课程二之Oracle数据库逻辑结构

完成本课程的学习后,您应该能够: •数据库总体的逻辑结构 •深入理解数据库最小存储单元block •理解行迁移和行链接 •理解高水位线 •Drop.truncate.delete区别   1.数据库的 ...

oracle中的数据读取与查找

数据读取 首先数据块读入到Buffer Cache中,并将其放在LRU(Last Recently Used)链表的MRU(Most Recently Used)端,当需要再次访问该块时可以直接从bu ...

随机推荐

MSSQL N张表关联查询

declare @newTime varchar(50); declare @lasetTime varchar(50); set @newTime= getdate(); set @lasetTim ...

关于jQuery学习

≡[..]≡≡[..]≡ 所有的实例都位于document.ready里面--为了防止文档在未完全加载之前就运行函数导致操作失败. $(document).ready(function(){ --- ...

Codeforces Round &num;545 &lpar;Div&period; 2&rpar;-Camp Schedule

题目要求,给定一个s序列,一个p序列,问能不能对s做相应的调整,使得s序列中,有尽可能多的p子串(可以重复) 最开始我拿到这个题目,也是一点头绪都没有,如何做调整呢? 首先考虑如何会有尽可能多的子串, ...

MVC&plus;三层&plus;ASP&period;NET简单登录验证

通过制作一个登录小案例来搭建MVC简单三层 在View --Shared下创建一个母版页:

CSS魔法(四)常用属性

元素的显示与隐藏 display.visibility.overflow 在CSS中有三个显示和隐藏的单词比较常见,我们要区分开,他们分别是 display.visibility 和 overflow ...

剑指offer 08跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). java版本: public class Solution { public s ...

mac eclipse 执行adb 命令,提示command not fount

java执行命令: p = Runtime.getRuntime().exec(commandStr); [INFO ] 执行命令结果:nullbash: adb: command not found ...

js表单计算金额问题

strcpy、sprintf、memcpy的区别

char*strcpy(char *dest, const char *src); 其对字符串进行操作,完成从源字符串到目的字符串的拷贝,当源字符串的大小大于目的字符串的最大存储空间后,执行该操作会出 ...

grid 布局 属性示例

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值