oracle ndv,CBO_ORACLE

ORACLE_CBO

========================

Oracle的聚簇因子对于查询IO的影响

Oracle中,对于同一个查询语句,有时候会很快的完成,有时候却很慢,但是表结构什么的完全一致,表中的数据也完全一致,这个具体是什么原因呢,就要从Index中的细节说起了。

在Oracle中的一个特殊的视图user_indexes中有一个特殊的列,名字是clustering_factor,这个值的内容就是如果访问表的整个表数据,会造成多少次数据库IO。我们可以通过下面的SQL语句来查看。

SELECT

A.INDEX_NAME,

B.NUM_ROWS,

B.BLOCKS,

A.CLUSTERING_FACTOR

FROM

USER_INDEXES A,

USER_TABLES B

WHERE

A.INDEX_NAME = ?

AND A.TABLE_NAME = B.TABLE_NAME

在这个SQL语句中,?代表的就是我们要检索的Index的名称。在表中数据有时候属于无序状态,这个时候的CLUSTERING_FACTOR比较接近NUM_ROWS,说明如果扫描整个表,每次都要根据Index来读取相应行的RowID,这个时候的IO操作很多,自然检索时间会比较长。如果数据有序的话,CLUSTERING_FACTOR比较接近BLOCKS,说明相邻的数据在一个块中,减少了IO操作数量,自然检索时间会大大降低。

下面这一段是Oracle 手册中关于CLUSTERING_FACTOR的说明:

If the value is near the number of blocks, then the table is very well ordered. In this case, the index entries in a single leaf block tend to point to rows in the same data blocks.

If the value is near the number of rows, then the table is very randomly ordered. In this case, it is unlikely that index entries in the same leaf block point to rows in the same data blocks.

========================

Cost = (

#SRds * sreadtim +

#MRds * mreadtim +

#CPUCycles / cpuspeed

) / sreadtim

对其中因子的解释是:

#SRDS:单数据块读的次数;

#MRDS:多数据块读的次数;

SREADTIM:一次单数据块读的时间;

MREADTIM:一次多数据块读的时间;

#CPUCYCLES:完成查询所需要发出的CPU指令数

CPUSPEED:CPU的处理速度

#SRDS = BLEVEL + INDLEAFBLKS*INDSEL + TABSEL*CLUF (索引扫描)

#MRDS = TABBLKS/MBRC (全表扫描、快速索引全扫描)

SREADTIM = IOSEEKTIM + BLKSIZ/IOTFRSPEED

MREADTIM = IOSEEKTIM + MBRC * BLKSIZ/IOTFRSPEED

其中,

BLEVEL:索引高度;

INDLEAFBLKS:索引叶子数据块数;

INDSEL:索引选择性;

TABSEL:表选择性;

TABBLKS:表在HWM下的数据块数;

MBRC:多数据块读的一次读取的数据块数,Multi_Block_Read_Count;

BLKSIZ:数据块大小;

IOSEEKTIM:IO寻址时间,System Statistics中给出,默认为10ms;

IOTFRSPEED:IO传输速度,System Statistics中给出,默认为4096字节/ms。

表部分

#Rows:表的记录数;

#Blks:表的HWM以下的数据块数;

AvgRowLen:表记录的平均长度

索引部分

Col#:索引中字段在表中的位置;

LVLS:索引高度,即BLevel;

#LB:索引叶子节点数据块数;

LB/K:平均每个键值的叶子节点数据块数;

DB/K:平均每个键值的表数据块数;

CLUF:聚簇因子(Clustering Factor)

字段部分

(#n):字段位置;

A(VARCHAR2):字段名称和数据类型;

AvgLen:字段平均长度;

NDV:字段中唯一值数量;

Nulls:字段中空值数量;

Density:字段密度

规则1:CPUSPEED与#CPUCYCLES无关

规则2:IOTFRSPEED与#CPUCYCLES无关

规则3:IOSEEKTIM与#CPUCYCLES无关。

公式22:COST_CPU = TYPFAC*TABROWS + 0.32*TABBLKS*TABSIZ + 4500*TABBLKS

其中

TYPFAC = ROUND((130 + MAXFLTCOLPOS*20 + EXPTYPEFAC1+ EXPTYPEFAC2* EXPSEL1 + 20*EFFQRYCOLNUM*MAX(1,ROUND(EXPTYPEFAC *TABROWS,0))/TABROWS)*TABROWS,0)/TABROWS

其中,子句的计算是由它的上优先级的子句计算得出,计算式如下:

AND子句:

EXPTYPEFAC = MIN((SUBEXPTYPFAC1+ SUBEXPTYPFAC2*SUBEXPSEL1), (SUBEXPTYPFAC2+ SUBEXPTYPFAC1*SUBEXPSEL2)

EXPSEL = SUBEXPSEL1*SUBEXPSEL2

OR子句:

EXPTYPEFAC = MIN((SUBEXPTYPFAC1+ SUBEXPTYPFAC2*(1-SUBEXPSEL1)), (SUBEXPTYPFAC2+ SUBEXPTYPFAC1*(1-SUBEXPSEL2))

EXPSEL = SUBEXPSEL1 + SUBEXPSEL2 - SUBEXPSEL1*SUBEXPSEL2

其中SUBEXPTYPFAC和SUBEXPSEL可以为子句或者字段的TYPFAC和SELECTIVITY。

不同数据类型字段的TYPFAC:

数据类型

COLTYPEFAC

CHAR、VARCHAR2

50

NUMBER

150

DATE

300

当匹配符为LIKE时,COLTYPEFAC_NEW = COLTYPEFAC + 50

当匹配符为IN、NOT IN时COLTYPFAC_NEW = COLTYPEFAC*(1-1/NDV)^0+COLTYPEFAC*(1-1/NDV)^1+…+COLTYPEFAC*(1-1/NDV)^(INNUM-1)

各种匹配符的选择性计算如下:

匹配符

COLSEL

>、=

1/20

LIKE

1/20

=

1/NDV

<>

1-1/NDV

IN

NOTINNUM*1/NDV

NOT IN

(1-1/NDV)^NOTINNUM

当作用NOT时,选择性变为 (1-原选择性).

[@more@]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle将千万行查询优化到一秒内,oracle下一条SQL语句的优化过程(比较详细)

oracle下一条SQL语句的优化过程(比较详细)更新时间&#xff1a;2010年04月14日 23:56:49 作者&#xff1a;很简单的一次调整&#xff0c;语句加了适当的索引后性能就有大幅的提升。当时看到这条语句的时候&#xff0c;第一感觉就是执行效率肯定低下。语句的功能是求某一客户当…

商城是用jsp还是php,建设网上购物网站使用JSP系统还是ASP系统

网上购物系统是用来建设网上商城网站的体系架构&#xff0c;也成为电商购物系统和商城系统。网上商城系统的种类有不少&#xff0c;如jsp网上购物系统、asp购物系统和php网购系统等。今天小编来和大家探讨一下建设网上商城网站是使用jsp系统好呢还是使用asp系统好呢&#xff1f…

oracle tb级别数据量,备份TB级别Oracle数据库的一些技巧

备份TB级别数据的一些技巧1、 考虑使用增量备份&#xff0c; 不要老是想着用全量备份2、 对于增量备份而言 开启block change tracking 能极大地减少物理读&#xff0c;提升速度3、 11g以后对于bigfile tablespace可以启用section size 来提升速度4、 考虑到负载更低的 Data Gu…

oracle dg snapshot,Oracle Broker Snapshot Standby测试

Oracle 11g Dataguard Snapshot Standby数据库功能&#xff0c;可将备库置于打开读写状态&#xff0c;进行模拟生产环境主库中测试。当备库Snapshot standby任务完成后&#xff0c;可以切换回物理备库角色。在Snapshot Standby数据库状态下&#xff0c;备库是可以接受主库传过来…

oracle ora 47306,Oracle SQL提示含义与示例 --- 分布式查询和并行提示

《Oracle 高性能SQL引擎剖析&#xff1a;Oracle SQL 优化与调优技术详解》一书的附录部分。作为对该书的补充&#xff0c;帮助读者理解和掌握“提示”这一项在SQL优化中使用的这一重要辅助手段。语法&#xff1a;DRIVING_SITE([])描述&#xff1a;指示优化器选择那个数据库作为…

oracle 拉文件进ubuntu,ubuntu 18-20 安装oracle java 打开jnlp文件

时间太久&#xff0c;转载的链接找不到了。一、安装orale java上java官网&#xff0c;下载jre文件包。解压缩到 /usr/lib/jvm/目录下&#xff0c;或者其他目录也行。我的是在/usr/lib/jvm/jre1.8.0_261/bin/etc/alternatives 目录 javaws,controlpanel连接到 jre目录。/usr/bin…

linux用vfork创建进程,[Linux进程]使用vfork创建子进程并且执行命令

/*这是一个其分别利用子进程和父进程对一个count进行计数并且输出&#xff0c;用于展示父进程和子进程是共享一个数据段*/#include #include #include #include int main (int argc,char *argv[]){int count 1;int child;printf("此时执行的是父进程&#xff0c;当前coun…

linux安装网卡驱动tgz,Linux安装网卡驱动

查看网卡cd /etc/sysconfig/network-scripts/如果安装正常会有&#xff1a;ifcfg-lo、ifcfg-eth0&#xff0c;其中ifcfg-eth0就表示第一个网卡如果没有ifcfg-eth0这个一般表示没有网卡或者网卡驱动程序没有安装之类的问题查看网卡硬件识别信息lspci | grep Eth //表示搜索局域…

linux c 数据库编程,linux c 编程操作数据库(sqlite3应用)

C/C语言中调用sqlite的函数接口来实现对数据库的管理(创建数据库、创建表格、插入数据、查询数据、删除数据等)。首先要编译好sqlite的库文件 :libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig可执行文件 : sqlite3本次测试&#xff…

linux看网络电影,Linux中看电影、听音乐

Linux中看电影&#xff0c;听音乐目录&#xff1a;一、简介二、软件安装三、简单使用一、简介一直以来很多人不使用Linux作为自己的日常操作系统&#xff0c;是因为Linux在多媒体方面的应用不给力&#xff0c;现在的Linux有很多个版本(RedHat、Ubuntu、CentOS、SUSE等)。但这些…

linux自动化处理excel,Excel:批处理实现自动化操作(转)

Excel&#xff1a;批处理实现自动化操作(转)信息技术课教学过程中经常要做一些重复的工作&#xff0c;如建立一个班级的学生文件夹&#xff0c;把作业分发到学生文件夹中等等。《中国电脑教育报》2004第5期F6版《批量自动生成文件夹》一文构思巧妙&#xff0c;它通过VBScript来…

linux hive配置文件,Hive安装与配置

前提条件&#xff1a;安装好相应版本的《在Fedora上部署Hadoop2.2.0伪分布式平台》)、安装好JDK1.6或以上版本(可以参见《如何在Linux平台命令行环境下安装Java1.6》) [wypwyp Downloads]$ wget \http://archive.apache.org/dist/hive/hive-0.10.0/hive-0.10.0.tar.gz[wypwyp D…

LINUX无法运行navixat,关于RX5700XT的驱动方法以及bug解决方案

AMD Navi显卡在macOS Catalina 10.15.1 beta2中已经正式免驱&#xff0c;博主购入测试&#xff0c;现公布新显卡的驱动方法以及bug解决方案。Windows使用DDU卸载原驱动并下载安装官方的RX5700XT的驱动即可。LinuxLinux 5.3起正式加入Navi显卡支持&#xff0c;所以我们要做的就是…

redhat linux yum仓库,关于RHEL6发行版yum仓库的配置

红帽的企业6安装好后&#xff0c;往往好多初学者不知道如何配置本地的yum仓库&#xff0c;而一些常用的软件都在yum仓库中包含了&#xff0c;这里我把yum的配置写到下面(光盘)&#xff1a;1.首先将光盘插入电脑&#xff0c;执行命令&#xff1a;mount -t iso9660 /dev/cdrom /m…

linux 管道交互,Linux C:具有独立读写命名管道的“交互式会话”?

我正在尝试使用“使用命名管道的进程间通信简介 - 使用命名管道的全双工通信”&#xff0c;link;特别是fd_server.c(包括如下供参考)Linux C&#xff1a;具有独立读写命名管道的“交互式会话”&#xff1f;这是我的信息&#xff0c;并编译行&#xff1a;:~$ cat /etc/issueUbun…

linux sz到指定的机器,linux 机器之间 zssh, rz, sz互相传输讲解

zssh的全名叫ZMODEM SSH.看名字就知道&#xff0c;使用的zmodem&#xff0c;我们习惯了SecureCRT,直接就可以用来发送文件&#xff0c;比使用scp方便很多。zmodem协议方便主要表示在以下点其一,不需要输入很长的命令和密码&#xff0c;直接使用rz,sz加文件名&#xff0c;就能实…

ghost linux 全盘拷贝,如何用ghost实现小硬盘对大硬盘的全盘拷贝?

先安装Ghost然后启动机器到纯DOS模式下&#xff0c;并且不加载任何应用程序&#xff0c;执行Ghost.exe文件&#xff0c;在显示出Ghost主画面后&#xff0c;选择Local→Partition→To Image"&#xff0c;屏幕显示出硬盘选择画面和分区选择画面&#xff0c;请根据需要选择所…

内网中入侵linux系统,MSSQL 入侵提权之内网渗透案例分析

图文&#xff1a;udb311主题&#xff1a;MSSQL内网渗透案例分析发表&#xff1a;黑白前线描述&#xff1a;对于内网渗透技术一直感觉很神秘&#xff0c;手中正巧有一个webshell是内网服务器。借此机会练习下内网入侵渗透技术&#xff01;本文敏感信息以屏蔽&#xff01;密码都以…

【Linux】僵尸与孤儿 进程等待

目录 一&#xff0c;僵尸进程 1&#xff0c;僵尸进程 2&#xff0c;僵尸进程的危害 二&#xff0c;孤儿进程 1&#xff0c;孤儿进程 三&#xff0c;进程等待 1&#xff0c;进程等待的必要性 2&#xff0c;wait 方法 3&#xff0c;waitpid 方法 4&#xff0c;回收小结…

linux bool变量,Objective-C中的占位符,打印BOOL类型数据

常用的一些占位符&#xff1a;%&#xff1a;字符串占位符%d:整型%ld:长整型%f:浮点型%c:char类型%%&#xff1a;%的占位符尽管有那么多的占位符&#xff0c;但是好像没有发现BOOL型的数据的占位符&#xff0c;这也是比较纠结的地方&#xff0c;看了一下别人是怎么解决这个问题的…