设为首页 收藏本站
查看: 526|回复: 0

[经验分享] ORACLE等频直方图

[复制链接]

尚未签到

发表于 2016-7-24 12:16:22 | 显示全部楼层 |阅读模式

ORACLE等频直方图
ORACLE直方图是Oracle CBO优化器使用的一种统计数据,比如有一个字段a,取值范围是1-10000,整个表有100万条记录,那么如果你要查询a>10 and a<100的记录,如果这样的记录有100条,那么走索引是最好的,如果这样的记录有90万条,那么走索引肯定不如全表扫描。直方图里面可以看出记录的分布情况,比如1-100有多少条,101-200有多少条记录,等等。优化器通过使用直方图,可以更准确的判断使用什么执行计划最优。
显然对于存在高度不均匀数据的表,使用柱状图能够产生更好的选择性评估,从而产生更加优化的执行计划。柱状图提供一种有效和简捷的方法来呈现数据的分布情况。
oracle统计信息和直方图的理解
以前一直对统计信息的理解就是对行的数据分布的,提供改CBO来选择高效的执行计划。这段时间看了不少资料,对统计有了一个更清晰的认识
统计信息:
1,表中的统计信息
2,索引列的统计信息
3,一般列的统计信息
表的统计信息:1,表行数,使用的块数,空的块数,块的使用率,行迁移和链接的数量,pctfree,pctused的数据,行的平均大小
索引列的统计信息 1,索引的深度(B-Tree的级别),索引叶级的块数量,集群因子(clustering_factor), 唯一值的个数
列的统计信息 1,唯一的值个数,列最大小值,密度(选择率),数据分布(直方图信息),NUll值个数
关于ORACLE直方图的一个简单测试
1、建表
create table tab(a number,b number);
2、插入数据
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>
'ZFTANG',
TABNAME =>
'TAB',
CASCADE => TRUE,
METHOD_OPT =>
'FOR COLUMNS B SIZE 1 ');
END;

/
3、建索引
create index ix_tab_b on tab(b);

4、分析表-不产生直方图
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>
'ZFTANG',
TABNAME =>
'TAB',
CASCADE => TRUE,
METHOD_OPT =>
'FOR ALL COLUMNS B SIZE 1 ');
END;
/

5、查看结果
select * from USER_TAB_HISTOGRAMS where column_name = 'B';


查看视图USER_TAB_HISTOGRAMS,列B上只有最大值,最小值两条记录分别对应端点号(endpoint_number01,这种显示说明列B没有直方图信息。

6、执行没有直方图之前查询
在没有直方图的情况下,在B列上进行等值查询的时候,都是索引范围扫描。
SQL> select * from tab where b=1;
执行计划
----------------------------------------------------------
Plan hash value: 439197569

----------------------------------------------------------------------------------------
| Id| Operation       | Name | Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT    |    |1000 |6000 | 4 (0)| 00:00:01 |
| 1 |TABLE ACCESS BY INDEX ROWID| TAB  |1000 |6000 | 4 (0)| 00:00:01 |
|*2 | INDEX RANGE SCAN    | IX_TAB_B |1000 |   | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------


SQL> select * from tab where b=5;

已选择9991行。


执行计划
----------------------------------------------------------
Plan hash value: 439197569

----------------------------------------------------------------------------------------
| Id| Operation       | Name | Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT    |    |1000 |6000 | 4 (0)| 00:00:01 |
| 1 |TABLE ACCESS BY INDEX ROWID| TAB  |1000 |6000 | 4 (0)| 00:00:01 |
|*2 | INDEX RANGE SCAN    | IX_TAB_B |1000 |   | 2 (0)| 00:00:01 |


7、产生直方图
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>
'ZFTANG',
TABNAME =>
'TAB',
CASCADE => TRUE,
METHOD_OPT =>
'FOR ALL COLUMNS SIZE AUTO ');
END;
/
收集直方图信息。看看是什么效果。由于列B唯一值的个数没有超过254因此产生的是等频直方图。

8、执行查询结果
B=1时候采用索引扫描,而B=5时候,已经采用全表扫描了,说明直方图起了作用。

SQL> select * from tab where b=1;
执行计划
----------------------------------------------------------
Plan hash value: 439197569

----------------------------------------------------------------------------------------
| Id| Operation       | Name | Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT    |    | 1 | 6 | 2 (0)| 00:00:01 |
| 1 |TABLE ACCESS BY INDEX ROWID| TAB  | 1 | 6 | 2 (0)| 00:00:01 |
|*2 | INDEX RANGE SCAN    | IX_TAB_B | 1 |   | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------

SQL> select * from tab where b=5;

已选择9991行。


执行计划
----------------------------------------------------------
Plan hash value: 1995730731

--------------------------------------------------------------------------
| Id| Operation   | Name | Rows| Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT|  |9991 | 59946 | 6 (0)| 00:00:01 |
|*1 |TABLE ACCESS FULL| TAB|9991 | 59946 | 6 (0)| 00:00:01 |
--------------------------------------------------------------------------

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-248626-1-1.html 上篇帖子: Oracle数据库链接(Database Link)详解 下篇帖子: Oracle 9i中的XMLTYPE应用学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表