Oracle性能优化之oracle里表、索引、列的统计信息
一、表的统计信息
表的统计信息用于描述表的详细信息,包括记录数(num_rows)、表块的数量(blocks)、平均行长度(avg_row_len)等典型维度。这些维度可以通过数据字典表DBA_TABLES、DBA_TAB_PARTITIONS和DBA_TAB_SUBPARTITIONS来分别查看表、分区表的分区和分区表的子分区的统计信息。
二、索引的统计信息
索引的统计信息描述了索引的详细信息,它包含了索引的层级(blevel)、叶子块数量(leaf_blocks)、聚簇因子(clustering_factor)等典型维度。这些维度可以通过数据字典视图DBA_INDEXES、DBA_IND_PARTITIONS和DBA_IND_SUBPARTITIONS来分别查看索引、分区索引的分区、局部分区索引的子分区的统计信息。
1、层级(level)
层级表示从根节点到叶子块的深度,层级被CBO用于计算访问索引叶子块的成本,层级越大,表示从根节点到叶子块所需要访问的数据块的数量就越多,耗费的i/o就会越多,索引访问的成本就会越大。在数据库里如果需要降低索引的层级,需要rebuild才可以。
2、聚簇因子的含义及重要性
oracle数据库中,聚簇因子是指按照索引键值排序的索引行和存储于对应表中的数据行的存储顺序的相似程度。oracle数据库按照如下算法计算聚簇因子:
(1)聚簇因子初始值为1.
(2)oracle首先定位到目标索引处于最左边的叶子块。
(3)从最左边叶子块的第一个索引键值所在的索引行开始顺序扫描,在顺序扫描的过程中,oracle会比较当前索引行的rowid和之前那个索引行的rowid,如果这两个rowid并不是指向同一个表块,那么oracle就将聚簇因子的当前值递增1;如果这两个rowid是指向同一个表块,oracle就不改变聚簇因子的值。oracle在比对rowid时并不会回表去访问相应的表块。
(4)上述的比对过程会持续下去,知道扫描完目标索引的所有索引块的所有索引行。
(5)上述顺序扫描完成后,聚簇因子的当前值就是索引统计信息中的clustering_factor,oracle将其存储在数据字典里。
由以上的过程可知:聚簇因子高的索引走索引范围扫描时比相同条件下聚簇因子低的索引要耗费更多的物理i/o,所以聚簇因子高的索引走索引范围扫描的成本会比相同条件下聚簇因子低的索引走索引范围扫描的成本高。即聚簇因子越小越好。
oracle数据库中,能够降低聚簇因子的唯一方法就是对表中数据按照目标索引的索引键值排序后重新存储。
oracle数据库里,cbo在计算索引范围扫描(index range scan)的成本计算公式入下:
(*)IRS COST=I/O COST+CPU COST
(*)I/O COST=INDEX ACCESS I/O COST+TABLE ACCESS I/O COST
(*)index access i/o cost=blevel_celt(#leaf_blocks*ix_sel)
(*)table access i/o cost=celt(clustering_factor*ix_sel_with_filters)
从这个公式可以推断出走索引范围扫描的成本可以近似看作是与聚簇因子成正比。因此,聚簇因子值得大小实际对CBO判断是否走相关索引起着至关重要的作用。
3、列的统计信息
oracle里列的统计信息用于描述oracle数据库里列的详细信息,包括列的distinct值(num_distinct)、列的null值(num_nulls)得数量、列的最小值(low_value)、列的最大值(high_value)等一些典型维度。可以通过数据字典dba_tab_col_statistics、dba_part_col_statistics和dba_subpart_col_statistics分别查看表、分区表的分区、分区表的子分区的列的统计信息。
(1)列的distinct值(上述数据字典中字段num_distinct表示distinct值数量),cbo用num_distinct值来计算目标列做等值查询时的可选择率。
(2)上述字典中的字段num_nulls存储的就是目标列的null值数量,cbo用num_null值来评估对目标列施加“is null”或“is not null”条件后的返回结果集cardinality。另外cbo还用num_nulls值来调整对有null值得目标列做等值查询时的可选择率selectivity。
对目标列进行等值查询时可选择率计算公式:selectivity=(1/num_distinct)*((num_rows-num_nulls)/num_rows)
(3)上述字典的列low_value和high_value值就是目标列的最小值和最大值,cbo通过low_value和high_value来计算目标列进行范围查询时可选择率selectivity的值。
没有直方图,目标列范围查询可选择率计算公式(略)。
3.1直方图(histogram)
1)直方图含义
在oracle数据库中,CBO会默认认为目标列的数据在最小值low_value和最大值high_value之间是均匀分布的,并且会根据这个均匀分布的原则来计算对目标列施加查询条件后的可选择率以及结果集的cardinality,进而据此来计算成本值并且选择执行计划。但是目标列的数据是均匀分布的这个原则并不总是准确的,在实际的系统中,我们很容易看到一些目标列的数据分布式不均匀的,甚至是极度倾斜的,分布极不均匀。对这样的列如果还按照均匀分布的原则去计算可选择率和结果集,并据此来计算成本,选择执行计划,那么CBO所选择的执行计划就可能是不合理的,甚至是错误的。
对于上述问题,oracle引入了直方图。直方图是一种特殊的列的统计信息,它描述了目标列的数据分布情况。可以通过数据字典视图DBA_TAB_HISTOGRAMS、DBA_PART_HISTOGRAMS和DBA_SUBPART_HISTOGRAMS来分别查看表、分区表的分区和分区表的子分区的直方图统计信息。
如果对目标列收集了直方图,则意味着CBO将不再认为该列上的数据是分布不均匀的,CBO就会用该目标列上的直方图统计信息来计算对该列施加查询条件后的可选择率和返回的结果集的cardinility,进而据此计算成本并选择相应的执行计划。即直方图就是oracle为了专门准确评估这种目标列分布不均匀的可选择率和结果集cardinility的方法。
2)直方图类型
oracle数据库里的直方图使用了一种称为bucket的方式来描述目标列的数据分布。根据bucket的数量,直方图分为2类:
(1)frequency类型直方图:存储在数据字典里用于描述目标列直方图的bucket数量等于目标列的distinct数量。
oracle直方图针对于文本类型的列收集直方图统计信息,则oracle只会将该文本字段头32位字符取出来,并将其转换成一个浮点数。然后将这个浮点数作为直方图统计信息存储在数据字典里。
(2)heigh balanced类型直方图:存储在数据字典里用于描述目标列直方图的bucket数量小于目标列的distinct数量。
Oracle性能优化之oracle里表、索引、列的统计信息的更多相关文章
- Oracle性能优化之 Oracle里的优化器
优化器(optimizer)是oracle数据库内置的一个核心子系统.优化器的目的是按照一定的判断原则来得到它认为的目标SQL在当前的情形下的最高效的执行路径,也就是为了得到目标SQL的最佳执行计划. ...
- Oracle性能优化之Oracle里的统计信息
一.什么是统计信息 oracle数据库里的统计信息是如下的一组数据:他们存储在数据字典里,且从多个维度描述了oracle数据库数据对象的详细信息. oracle数据库里的统计信息主要分为以下6种情况: ...
- Oracle性能优化之Oracle里的执行计划
一.执行计划 执行计划是目标SQL在oracle数据库中具体的执行步骤,oracle用来执行目标SQL语句的具体执行步骤的组合被称为执行计划. 二.如何查看oracle数据库的执行计划 oracle数 ...
- Oracle性能优化之oracle中常见的执行计划及其简单解释
一.访问表执行计划 1.table access full:全表扫描.它会访问表中的每一条记录(读取高水位线以内的每一个数据块). 2.table access by user rowid:输入源ro ...
- Sql Server查询性能优化之走出索引的误区
据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...
- Oracle性能优化之SQL语句
1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...
- ORACLE性能优化之SQL语句优化
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 操作环境:AIX +11g+PLSQL 包含以下内容: 1. SQL语句执行过程 2. 优化器及执行计划 3. 合 ...
- oracle性能优化之awr分析
oracle性能优化之awr分析 作者:bingjava 最近某证券公司系统在业务期间系统运行缓慢,初步排查怀疑是数据库存在性能问题,因此导出了oracle的awr报告进行分析,在此进行记录. 导致系 ...
- Oracle性能优化1-总体思路和误区
最近在看梁敬彬老师关于Oracle性能优化的一些案例,在这里做一些简单的总结 1.COUNT(*)与COUNT(列)哪个更快 drop table t purge; create table t as ...
随机推荐
- Ubuntu系统启动报错:The system is running in low-graphics mode
最近,不小心将自己的Ubuntu-12.04桌面系统搞坏了,主要是由于改变了/var目录下文件的属主,结果桌面系统崩溃了,启动都成问题了.不过还算幸运,可以通过其他的机器登录到我的系统上.根据别人的系 ...
- (转)如何基于FFMPEG和SDL写一个少于1000行代码的视频播放器
原文地址:http://www.dranger.com/ffmpeg/ FFMPEG是一个很好的库,可以用来创建视频应用或者生成特定的工具.FFMPEG几乎为你把所有的繁重工作都做了,比如解码.编码. ...
- EF中修改对象的值的问题。。。(字段超级多的时候)
一般EF中修改单个对象的值,我是这样处理的. 如:DBEntities db=new DBEntities(); student stu = db.student.firstOrdefault(m=& ...
- 怎么快速了解自己的MySQL服务器?
From: http://www.cnblogs.com/benshan/archive/2013/01/09/2853097.html 1.查看数据库服务器状态:status Linux 下的MyS ...
- php将汉字转换为拼音和得到词语首字母(三)
<?php function getfirstchar($s0){ $fchar = ord($s0{0}); if($fchar >= ord("A") and $f ...
- 根据IP定位城市
根据IP定位城市:http://www.sucaihuo.com/js/35.html 示例:http://www.sucaihuo.com/jquery/0/35/demo/
- 模拟Excel中SUBSTITUTE函数
Excel中的SUBSTITUTE是一个很有用的字符串替换函数,其说明如下: 说明 在文本字符串中用 new_text 替换 old_text. 如果需要在某一文本字符串中替换指定的文本,请使用函数 ...
- android大扫盲之SurfaceView,SurfaceHolder,SurfaceHolder.CallBack
最近接触到了SurfaceView,SurfaceHolder,SurfaceHolder.CallBack,一直不求其解,现在来粗浅认识一下它们. 先看一下官方的定义: 1.SurfaceView ...
- Ubuntu 16.04 获取 root 用户权限并以 root权限登录
http://blog.csdn.net/csdn_flyyoung/article/details/52966583
- python2.0_s12_day12_css样式详解
CSScss是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. CSS 存放方式有三种: 一种写法:在<body></body>内部 ...