Oracle 直方图实例测试
--创建表
SQL> create table tab (a number, b number); Table created. --插入数据
SQL> begin
2 for i in 1..10000 loop
3 insert into tab values (i, i);
4 end loop;
5 commit;
6 end;
7 / PL/SQL procedure successfully completed. --更新部分数据
SQL> update tab set b=5 where b between 6 and 9995; 9990 rows updated. --提交
SQL> commit; Commit complete. --创建索引
SQL> create index ix_tab_b on tab(b); Index created. --数据分布
SQL> SELECT b,count(*) from tab group by b order by 1; B COUNT(*)
---------- ----------
1 1
2 1
3 1
4 1
5 9991
9996 1
9997 1
9998 1
9999 1
10000 1 10 rows selected. SQL> --禁止产生直方图(size 1)
SQL> BEGIN
2 DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'NC50',
3 TABNAME => 'TAB',
4 CASCADE => TRUE,
5 METHOD_OPT => 'FOR COLUMNS B SIZE 1 ');
6 END;
7 / PL/SQL procedure successfully completed. SQL> --查看视图USER_TAB_HISTOGRAMS
SQL> col COLUMN_NAME format a20
SQL> col TABLE_NAME format a15
SQL> SELECT table_name,column_name,endpoint_number,endpoint_value FROM USER_TAB_HISTOGRAMS WHERE TABLE_NAME='TAB'; TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
--------------- -------------------- --------------- --------------
TAB B 0 1
TAB B 1 10000 SQL> --注:ENDPOINT_NUMBER列值是bucket的标识号。现在只有0、1两个bucket说明没有产生直方图信息。 --在没有直方图的情况下,在B列上进行等值查询的时候,都是索引范围扫描(即使返回总数据量的80%) SQL> set autotrace traceonly explain
SQL> set line 180
SQL> select * from tab where b=1; Execution Plan
----------------------------------------------------------
Plan hash value: 439197569 ----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1000 | 7000 | 4 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TAB | 1000 | 7000 | 4 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IX_TAB_B | 1000 | | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("B"=1) SQL> SQL> select * from tab where b=5;---返回9991条数据,总数据量的80% Execution Plan
----------------------------------------------------------
Plan hash value: 439197569 ----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1000 | 7000 | 4 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TAB | 1000 | 7000 | 4 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IX_TAB_B | 1000 | | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("B"=5) SQL> --收集直方图信息。看看是什么效果。由于列B唯一值的个数没有超过254因此产生的是等频直方图。 SQL> BEGIN
2 DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'NC50',
3 TABNAME => 'TAB',
4 CASCADE => TRUE,
5 METHOD_OPT => 'FOR COLUMNS B SIZE AUTO ');
6 END;
7 / PL/SQL procedure successfully completed. SQL> --在B=1时候采用索引扫描 SQL> set autotrace traceonly explain
SQL> select * from tab where b=1; Execution Plan
----------------------------------------------------------
Plan hash value: 439197569 ----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 7 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TAB | 1 | 7 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IX_TAB_B | 1 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("B"=1) --在B=5时候,已经采用全表扫描了,说明直方图起了作用
SQL> select * from tab where b=5; Execution Plan
----------------------------------------------------------
Plan hash value: 1995730731 --------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9991 | 69937 | 9 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| TAB | 9991 | 69937 | 9 (0)| 00:00:01 |
-------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter("B"=5) SQL> --查看此时的直方图信息:
SQL> set autotrace off;
SQL> col TABLE_NAME format a10
SQL> col COLUMN_NAME format a20
SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE
2 FROM USER_TAB_HISTOGRAMS
3 WHERE TABLE_NAME = 'TAB'; TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
---------- -------------------- --------------- --------------
TAB B 1 1
TAB B 2 2
TAB B 3 3
TAB B 4 4
TAB B 9995 5
TAB B 9996 9996
TAB B 9997 9997
TAB B 9998 9998
TAB B 9999 9999
TAB B 10000 10000 10 rows selected. SQL> --其中EDNPOINT_NUMBER是累计值,EDNPOINT_NUMBER(N)-EDNPOINT_NUMBER(N-1)=当前桶的数据个数=9995-4=9991
--EDNPOINT_VALUE是列的值。 --在看看等高直方图的情况,由于列B有10个唯一值,通过size 8可以强制ORACLE使用等高直方图
SQL> BEGIN
2 DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'NC50',
3 TABNAME => 'TAB',
4 CASCADE => TRUE,
5 METHOD_OPT => 'FOR COLUMNS B SIZE 8 ');
6 END;
7 / PL/SQL procedure successfully completed. SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE FROM USER_TAB_HISTOGRAMS
2 WHERE TABLE_NAME = 'TAB' ;
WHERE TABLE_NAME = 'TAB'
*
ERROR at line 2:
ORA-00933: SQL command not properly ended SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE
2 FROM USER_TAB_HISTOGRAMS
3 WHERE TABLE_NAME = 'TAB'; TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
---------- -------------------- --------------- --------------
TAB B 0 1
TAB B 7 5
TAB B 8 10000 SQL> --从查询结果惊奇的发现只有三个桶0 7 8 --说明:在等高直方图中,EDNPOINT_NUMBER代表桶号,这一点与等频直方图不同。 SQL> set autotrace traceonly explain;
SQL> select * from tab where b=5; Execution Plan
----------------------------------------------------------
Plan hash value: 1995730731 --------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8750 | 61250 | 9 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| TAB | 8750 | 61250 | 9 (0)| 00:00:01 |
-------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter("B"=5) SQL> --发现执行计划的ROWS部分,ORACLE计算出来的cardinality不是特别精确的。9991才是精确值。而等频直方图可以精确到9991,因此可以说等频直方图比等高直方图稳定,精确。可是现实很多时候,列的唯一值是超过254的。只能使用等高直方图了。
Oracle 直方图实例测试的更多相关文章
- RHEL6.4 + Oracle 11g DG测试环境快速搭建参考
环境现状: 两台虚拟主机A和B: 1. A机器已安装ASM存储的Oracle 11g 实例 参考:http://www.cnblogs.com/jyzhao/p/4332410.html 2 ...
- Oracle直方图的详细解析
yuanwen:http://blog.csdn.net/javacoffe/article/details/5578206 Oracle直方图解析 一. 何谓直方图: 直方图是一种统计学上的工 ...
- 详细说明手工创建oracle数据库实例
手工建库比起使用DBCA建库来说,是比较麻烦的,但是如果我们学好了手工建库的话,就可以使我们更好地理解Oracle数据库的体系结构.手工建库须要经过几个步骤,每一个步骤都非常关键.它包括:1. 创建必 ...
- 关于:无法创建链接服务器 "ORCL" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的实例 (错误:7302)
本人接触和使用Oracle数据库才有一个季度的时间,问题比较白,大神请无视本文. 环境: 1.数据服务器,windows2008R2,Oracle11g 2.报表服务器,windows2008R2,S ...
- 如何使用swingbench进行oracle数据库压力测试
如何使用swingbench进行oracle数据库压力测试 2014-10-06 08:09:02 标签:oracle 数据库压力测试 swingbench 原创作品,允许转载,转载时请务必以超链接形 ...
- Oracle直方图的详细解析(转)
Oracle直方图解析 一. 何谓直方图: 直方图是一种统计学上的工具,并非Oracle专有.通常用于对被管理对象的某个方面的质量情况进行管理,通常情况下它会表现为一种几何图形表,这个图形表是根 ...
- 删除Oracle Online Redo 测试
删除Oracle Online Redo 测试 SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKS ...
- Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试
Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试一.下载相关安装包 1.下载nginx最新版本(nginx1.3.13版之后才支持websocket协议) 下载地址 ...
- 转--Oracle 审计和测试操作
http://blog.itpub.net/21605631/viewspace-759640/转 Oracle 审计和测试操作 :: 分类: Linux 1.1 相关参数 AUDIT_SYS_OPE ...
随机推荐
- make menuconfig 是一个目录。停止 错误解决
在移植Linux内核时候,发现用 make menuconfig 发生如下错误 linux@ubuntu:/work/linux-socfpga$ make menuconfig make: *** ...
- C#将C++动态库的回调函数封装成事件
关于C#调用C++动态库的文章很多,调用动态库中回调函数的方法也不在少数.但大多数调用回调函数的方法依然保留了C++的语法特点. 比如有一段C++的回调函数代码,为了表达它的意思,我把注释也粘贴了进来 ...
- Runtime机制之结构体及操作函数
一.动态语言 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:具有灵活性,比如:消息转发,方法交换等.它有一个运行时系统Ob ...
- 翻译的技巧(The Technique of Translation)——前言
曰:你要发文章才能毕业! 答:谨遵圣命-- 缘起 研三了,要找工作了,要离开学校了,又要像浮萍般飘荡在世上了,还是学校好呀!本以为写个毕业论文就可以了,谁知老板幽幽地说写篇文章发了吧.我竟无言以对.不 ...
- 挣值管理(EVT)
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 第二个大计算,根据PV.EV.AC计算出CV.SV.SPI.CPI.ETC.EAC. ...
- HP Mobile Center 1.01 Related System Requirements
最近要开始使用HP Mobile Center,以下是我在官网上搜集的配置信息,包含软硬件. Reference: http://mobilecenterhelp.saas.hp.com/en/la ...
- 洛谷P1828 香甜的黄油 Sweet Butter
P1828 香甜的黄油 Sweet Butter 241通过 724提交 题目提供者JOHNKRAM 标签USACO 难度普及+/提高 提交 讨论 题解 最新讨论 我的SPFA为什么TLE.. 为 ...
- 洛谷P2722 总分 Score Inflation
P2722 总分 Score Inflation 184通过 295提交 题目提供者该用户不存在 标签USACO 难度普及- 提交 讨论 题解 最新讨论 关于算法 题目背景 学生在我们USACO的 ...
- MVC 百度地图的基本使用
最近做的这个项目里面为了方便路线查询,将百度地图的插件加到了项目里,效果图如下: 下面我就把我的步骤贴出来: 第一步:进网站 http://developer.baidu.com/map/注册 第二步 ...
- swing 复选框
通过 box1 和 box2的 public boolean isSelected()的方法 返回按钮的状态. 如果选定了切换按钮,则返回 true,否则返回 false.