直方图、基数、选择性、群集因子

基本概念

基数(Cardinality) 列唯一键(Distinct_keys)的数量,比如性别,该列只有男女之分,所以这一列基数是2。

选择性(Selectivity) 列唯一键(Distinct_Keys)与行数(Num_Rows)的比值。

直方图 (Histogram)是一种对数据分布质量情况进行描述的工具。它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够指导优化器根据数据的分布做出正确的选择。

频率直方图(FREQUENCY HISTOGRAM),当列中Distinct_keys 较少(小于254),如果不手工指定直方图桶数(BUCKET),Oracle就会自动的创建频率直方图,并且桶数(BUCKET)等于Distinct_Keys。

高度平衡直方图(HEIGHT BALANCED),当列中Distinct_keys大于254,如果不手工指定直方图桶数(BUCKET),Oracle就会自动的创建高度平衡直方图。

集群因子(Clustering Factor) 描述一个表中的列是否是规则排序的。

我们知道可以通过dbms_rowid.rowid_block_number(rowid)找到记录对应的block 号。索引中记录了rowid,因此oracle 就可以根据索引中的rowid来判断记录是否是在同一个block 中。举个例子,比如说索引中有a,b,c,d,e五个记录,首先比较a,b 是否在同一个block,如果不在同一个block 那么Clustering Factor +1,然后继续比较b,c 同理,如果b,c 不在同一个block,那么Clustering Factor+1,这样一直进行下去,直到比较了所有的记录。根据算法我们就可以知道clustering factor 的值介于block 数和表行数之间。如果clustering factor 接近block 数,说明表的存储和索引存储排序接近,也就是说表中的记录很有序,这样在做index range scan 的时候能,读取少量的data block 就能得到我们想要的数据,代价比较小。如果clustering factor 接近表记录数,说明表的存储和索引排序差异很大,在做index range scan 的时候,会额外读取多个block,因为表记录分散,代价较高。

1. 创建实验表
SQL> show user;
USER is "ANDY"

SQL>create table test as select * from dba_objects;

2. 先收集统计信息

BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname          => ‘ANDY‘,
tabname          => ‘TEST‘,
estimate_percent => 100,
method_opt       => ‘for all columns size skewonly‘,
no_invalidate    => FALSE,
degree           => 1,
cascade          => TRUE);
END;
/

说明:对于大表 estimate_percent 参数一般指定为 30% ,够CBO用就行。

补充内容
删统计信息   (这里不要操作,作为了解)
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(ownname          => ‘ANDY‘,
tabname          => ‘TEST‘,
estimate_percent => 100,
method_opt       => ‘for all columns size 1‘,
no_invalidate    => FALSE,
degree           => 1,
cascade          => TRUE);
END;
/

3.查询统计信息   (基数和选择性)

select a.column_name,
b.num_rows,
a.num_distinct Cardinality,
round(a.num_distinct / b.num_rows * 100, 2) selectivity,
a.histogram,
a.num_buckets
from dba_tab_col_statistics a, dba_tables b
where a.owner = b.owner
and a.table_name = b.table_name
and a.owner = ‘ANDY‘
and a.table_name = ‘TEST‘;

COLUMN_NAME                      NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM       NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
OWNER                               74770          30         .04 FREQUENCY                30
OBJECT_NAME                         74770       46694       62.45 HEIGHT BALANCED         254
SUBOBJECT_NAME                      74770          51         .07 FREQUENCY                51
OBJECT_ID                           74770       74770         100 NONE                      1
DATA_OBJECT_ID                      74770        9792        13.1 HEIGHT BALANCED         254
OBJECT_TYPE                         74770          43         .06 FREQUENCY                43
CREATED                             74770        1120         1.5 HEIGHT BALANCED         254
LAST_DDL_TIME                       74770        1185        1.58 HEIGHT BALANCED         254
TIMESTAMP                           74770        1240        1.66 HEIGHT BALANCED         254
STATUS                              74770           2           0 FREQUENCY                 2
TEMPORARY                           74770           2           0 FREQUENCY                 2

COLUMN_NAME                      NUM_ROWS CARDINALITY SELECTIVITY HISTOGRAM       NUM_BUCKETS
------------------------------ ---------- ----------- ----------- --------------- -----------
GENERATED                           74770           2           0 FREQUENCY                 2
SECONDARY                           74770           2           0 FREQUENCY                 2
NAMESPACE                           74770          20         .03 FREQUENCY                20
EDITION_NAME                        74770           0           0 NONE                      0

15 rows selected.

观察得到:
如果 CARDINALITY 基数小于254 ,那么 NUM_BUCKETS 桶数 就= 列基数 CARDINALITY。

总结:

1.
在OLTP系统中,基数/选择性高的列,适合建立B-Tree索引,选择性低的列不适合建立索引。
在OLAP环境中,基数低的列根据需求,可能会建立bitmap索引。

2.
没有直方图,CBO认为这个数据是分布均匀的,执行计划中估算返回的行数是基于列基数的平均值,
与实际返回的行数不符,可能产生错误的执行计划。

3.
什么时候该执行统计直方图操作  -> 执行计划估算的行数和实际查询返回的行数进行比较,如果相差很大,则需。

时间: 2024-11-08 23:24:55

直方图、基数、选择性、群集因子的相关文章

Oracle索引详解

Oracle索引详解(一) ### --索引介绍 ??索引对于Oracle学习来说,非常重要,在数据量巨大的状况下,使用恰到好处的索引,将会使得数据查询时间大大减少,于2017/12/25暂时对Oracle中的索引进行一个大致的了解. 索引的创建语法 索引的特点 索引的不足 比较适合建立索引的列的特点 不适合建立索引的列的特点 限制索引(建立了索引,但是无法使用) 查询索引 组合索引 Oracle rowid 选择性 群集因子 二元高度 快速全表扫描 跳跃式扫描 索引的创建语法 create o

【转载】oracle索引详解2

原文URL:http://justplayoop1.iteye.com/blog/1259562 一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC,                <column_na

Oracle 索引(转)

一.索引介绍 1.1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC, <column_name> | <expression> ASC | DESC,...) TABLESPACE <tablespac

Oracle 索引 详解

一. 索引介绍 1.1  索引的创建 语法 : CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <schema>.<table_name> (<column_name> | <expression> ASC | DESC,               <column_name> | <expression> ASC | DESC,...)      T

作为一个新手的Oracle(DBA)学习笔记【转】

一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cmd—>sqlplus “/as sysdba” //以sysdba用户登录,这样可以管理权限,添加用户等 Win+R—cmd—>sqlplus username/password //以指定用户名密码登录 win+R —> cmd —–> sqlplus //按照提示,输入用户名密码 

oracle-索引原理

Oracle索引原理 Oracle提供了大量索引选项.知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要.一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止.而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄.这篇文章就将简单的讨论每个索引选项.主要有以下内容: [1] 基本的索引概念 查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES的方法来检索模式(s

oracle数据库优化之统计信息

1.统计信息简介 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.比如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于统计信息.CBO正是根据这些统计信息数据,计算出不同访问路径下,不同join 方式下,各种计划的成本,最后选择出成本最小的计划. 在CBO(基于代价的优化器模式)条件下,SQL语句的执行计划由统计信息来决定,若没有统计信息则会采取动态采样的方式决定执行计划!可以说统计信息关乎sql的执行计划是否正确,

PLSQL_性能优化系列15_Oracle Statistics统计信息

2014-12-18 BaoXinjian 一.摘要 Statistic 对Oracle 是非常重要的. 它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Statistic 对Oracle 是非常重要的,它会收集数据库中对象的详细信息,并存储在相应的数据字典里. 根据这些统计信息, optimizer 可以对每个SQL 去选择最好的执行计划. Oracle Statistic 的收集,可以使用analy

Oracle的优化器介绍

Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 RBO是一种基于规则的优化器,随着CBO优化器的逐步发展和完善,在最新的10g版本中Oracle已经彻底废除了RBO.正在使用Oracle8i或9i的人们或多或少的都会碰到RBO,因此在详细介绍CBO之前,我们有必要简单回顾一下古老的RBO优化器. 在RBO中Oracle根据可用的访问路径和访问路