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 ...
随机推荐
- html标签属性
clientWidth = width + paddingclientHeight = height + paddingoffsetWidth = width + padding + borderof ...
- php 通过PATH_SEPARATOR判断当前服务器系统类型
PATH_SEPARATOR是php中的一个预定义常量,我们可以直接echo这个常量,在linux系统中,该常量输出":",在windows系统中,该常量输出";&quo ...
- 动手学servlet(二) servlet基础
1.我们来试着向一个servlet提交一个表单,现在webcontent下新建一个login.html页面,其中action对应servelt类名,代码如下: <!DOCTYPE HTML PU ...
- 点评App wiki-git标准实践
fetch与pull fetch = pull + merge fetch -p,用于将清理工作同步到本地repository rebase-衍合 merge与rebase是合并的两种方法(上为mer ...
- JSP SQL注入
Login.JSP <%@ page language="java" import="java.util.*" pageEncoding="UT ...
- JAVA Socket:文件传输
客户端:读取文件(FileInputStream),发送文件(OutputStream) 服务器端:接收文件(InputStream),写文件(FileOutputStream) 客户端代码: pac ...
- Win2008或IIS7的文件上传大小限制解决方案
默认情况下,IIS7的上传限制为200K.当上传文件小于30M时,可以通过如下方法设置:在iis7中找到asp设置,在“asp”的“限制属性”中最后一行“最大请求主体限制”,修改该值为你所想要的,如2 ...
- Windows 2008 IIS7.0安装FTP教程 IIS7.5 配置多用户FTP
一. 安装IIS.右键[我的电脑],选择[管理]打开. 选择[角色],选择[添加角色]打开. 二. 配置DOS.输入: CACLS "%Syste ...
- python学习(二):python基本语法
前言:python基本的语法与其他语言诸如C,JAVA等类似,但个中有些许不同. 一.常规语法 1.变量名与关键字 与其他语言类似,变量名由字母.数字.下划线组成,且必须由字母开头. 变量使用不需要提 ...
- NSSet、NSMutableSet
NSSet和NSArray功能性质一样,用于存储对象,属于集合:只能添加cocoa对象,基本数据类型需要装箱. NSSet . NSMutableSet是无序的集合,在内存中存储方式是不连续的,而NS ...