【Oracle】单表的选择率

  本文只是记录《基于成本的oracle 优化法则》的简单的笔记(因为要重新搭建RAC 把之前的环境删掉了,oracle 环境还没建好,现在先纸上谈兵一下 )

优化器并没有智能--只是一个软件!

1 对含有空值的字段 

基本选择率=1/num_distinct

num_nulls=120

num_rows=1200

选择率=基本选择率*(num_rows-num_nulls)/num_rows=1/12*((1200-120)/1200)=0.075

调整后的基数=1200*0.075=90

2 对于in-list

比如: 

select count(1) from aud where month_no in (6,7,8);

 oracle 会在解析sql的时候将in list转换为or 的形式 :month_no=6 or month_no=7 or month_no=8 

 选择率类似联合概率:

 P(A OR B ORC)=P(A)+ P(B)+P(C)-P(A AND B)-P(A AND C)-P(C AND B)+P(A AND B AND C)

 3/12-3/144+1/1728=0.22975 

 基数=1200*0.22975=275.69

3 对于区间谓词

  month_no > 8

  选择率=(high_value-limit)/(high_value-low_value)=(12-8)/(12-1)=4/11

  month_no >=8

  选择率=(high_value-limit)/(high_value-low_value)+1/num_distinct =(12-8)/(12-1)+1/12=4/11+1/12

  month_no <8  

选择率=(limit-low_value)/(high_value-low_value)=(8-1)/(12-1)=7/11 

  month_no <=8  

选择率=(limit-low_value)/(high_value-low_value)+1/num_distinct=(8-1)/(12-1)+1/12=7/11+1/12   

month_no between 6 and 9  month_no>=6 and month_no<=9  

选择率=(hight_limit-low_limit)/(high_value-low_value)+1/num_distinct+1/num_distinct=(9-6)/(12-1)+1/12+1/12

  month_no>=6 and month_no<9

  选择率 =(9-6)/(12-1)+1/12  

month_no>6 and month_no<=9

  选择率 =(9-6)/(12-1)+1/12  

month_no>6 and month_no<9

  选择率 =(9-6)/(12-1)

4 双谓词

month_no>=8 or month_no<8 

这个选择条件 表明 oracle 的用化器并没有把 谓词看成整体而是独立的谓词。其选择率为

 P(A OR B)=P(A)+ P(B)-P(A AND B)

而对于 and   和 not 条件的选择率的计算方法如下: 

P(A AND B)=P(A)* P(B)

 NOT P(A)=1-P(A)

 oracle 在解析执行计划的时候,将各个谓词视为独立的谓词,当一个表使用多个谓词时,必须确保各个谓词之间没有必然联系,否则cbo 将得不到准确的执行计划

时间: 2024-10-25 08:40:33

【Oracle】单表的选择率的相关文章

oracle大表添加字段default经验分享

当oracle单表数据量上亿时,对表进行alter table aa add column_1 varchar2(2) defalut 'Y';时,效率及安全性是必须考虑的因素. 本帖以2亿的数据表aa举例: alter table aa add column_1 varchar2(2) defalut 'Y'; Table altered Executed in 3600 seconds 直接用了一个小时,而且在这过程中是加上了表级锁,也就是连查询都是会被等待的,这是相当危险的操作. 为什么会

oracle数据库性能调优技术:深入理解单表执行计划

一.概述 这篇文章是数据库性能调优技术的第二篇.上一篇讲解的索引调优是数据库性能调优技术的基础.这篇讲解的深入理解单表执行计划,是数据库性能调优的有力工具. 查询语句可以有多种可选执行计划,如何选择效率最高的执行计划?达梦数据库.oracle数据库.sql server数据库都是采用基于成本的查询优化,对备选执行计划进行打分,选择大家最小的执行计划进行执行.这些内容,我会在后续的几篇文章中进行详细的描述.在此之前,我们首先需要掌握如何理解数据库执行计划.这篇文章讲解只涉及单表操作的执行计划. 达

HTAP数据库 PostgreSQL 场景与性能测试之 36 - (OLTP+OLAP) 不含索引单表批量写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HTAP数据库 PostgreSQL 场景与性能测试之 35 - (OLTP+OLAP) 含索引单表单点写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

HTAP数据库 PostgreSQL 场景与性能测试之 37 - (OLTP+OLAP) 含索引单表批量写入

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos

ORACLE外部表总结

外部表介绍   ORACLE外部表用来存取数据库以外的文本文 件(Text File)或ORACLE专属格式文件.因此,建立外部表时不会产生段.区.数据块等存储结构,只有与表相关的定义放在数据字典中.外部表,顾名思义,存 储在数据库外面的表.当存取时才能从ORACLE专属格式文件中取得数据,外部表仅供查询,不能对外部表的内容进行修改(INSERT.UPDATE. DELETE操作).不能对外部表建立索引.因为创建索引就意味着要存在对应的索引记录.而外部表其实在没有存储在数据库中.故在外部是无法建

求一条sql语句,单表查询的

问题描述 求一条sql语句,单表查询的 表结构 (姓名,课程,成绩) 现在求获的该表总成绩最高学员的名字 解决方案 mysql 数据库select sum(成绩) as t from table group by 姓名 order by t limit 0,1 oracle数据库 select * from (select sum(成绩) as t from table group by 姓名 order by t) WHERE ROWNUM<=1 sqlserver数据库 select top

SQLServer关于SQL单表查寻合并结果

问题描述 SQLServer关于SQL单表查寻合并结果 现有一表. QA, QC,QD 数据 11, 22, SB 22, 11, SD 33, 44, SH 44, 33, SL 需要把数据拼成两条. QA, QC,QD, QA2, QC2,QD2 11, 22, SB , 22, 11, SD 33, 44, SH, 44, 33, SL 这个表就通过QA, QC这俩字段识别 解决方案 有没有尝试着having子句和连表查询啊 解决方案二: SQL单表外连接 解决方案三: 如果用存储过程.

6.单表查询

1.语法格式         select语句的功能就是查询数据,在SQL语句中功能最丰富,可单表查询.多表连接查询.子查询. SELECT  NAME, grade FROM student WHERE grade >80; 数据源student可以是表.视图等:select后列表用于确定选择哪些列(* 即所有列),where确定选择哪些行(无则选出所有行). select语句中可使用算术运算符(+.-.*./)形成算术表达式,用于数值型.日期型的数据列.变量.常量:运算符可在两列间进行运算.