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,原来ORACLE会自动省去EDNPOINT_VALUE值相同且ENDPOINT_NUMBER相邻的桶的值。省去了桶(EDNPOINT_NUMBER)为1 2 3 4 5 6 ,EDNPOINT_VALUE为5的六条内容。

--说明:在等高直方图中,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的。只能使用等高直方图了。
时间: 2024-12-16 09:54:51

Oracle 直方图实例测试的相关文章

Oracle直方图的详细解析(转)

Oracle直方图解析 一.    何谓直方图: 直方图是一种统计学上的工具,并非Oracle专有.通常用于对被管理对象的某个方面的质量情况进行管理,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数量为底边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布图.比如下图所示,是一个以关学生化学考试成绩分数分布情况绘制的直方图:              二.       Oracle中

Linux平台 Oracle 11g DG测试环境快速搭建参考

环境现状: 两台虚拟主机A和B: 1. A机器已安装ASM存储的Oracle 11g 实例 参考:http://www.cnblogs.com/jyzhao/p/4332410.html 2. B机器已安装系统,配置以及目录结构均和A机器保持一致 /u01 + 3块ASM盘 DG部署规划:   primary standby 主机 JY-DB JY-DBS db_name jyzhao jyzhao db_unique_name jyzhao jyzhao_s instance_name jyz

Oracle Study之--Oracle 单实例11.2.0.1.0升级到11.2.0.3.0

Oracle Study之--Oracle 单实例11.2.0.1.0升级到11.2.0.3.0 系统环境: 操作系统:RedHat EL6(64位) Oracle:    Oracle 11gR2 Oracle 11.2.0.1 单实例升级到11.2.0.3 Oracle 升级的步骤都差不多,先升级Oracle software,然后升级Oracle instance. Oracle 11.2.0.2的patchset No 是:10098816. 关于该Patchset 的下载地址,参考下面

Oracle直方图的详细解析

yuanwen:http://blog.csdn.net/javacoffe/article/details/5578206 Oracle直方图解析 一.    何谓直方图: 直方图是一种统计学上的工具,并非Oracle专有.通常用于对被管理对象的某个方面的质量情况进行管理,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数量为底边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布图.

删除Oracle Online Redo 测试

删除Oracle Online Redo 测试 SQL> select * from v$log; ?   GROUP#   THREAD# SEQUENCE#     BYTES BLOCKSIZE   MEMBERS ARC STATUS ---------- ---------- ---------- ---------- ---------- ---------- --- --------         1          1          4   52428800      

oracle存储过程实例

oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有非常多长处,详细归纳例如以下: * 存储过程和函数以命名的数据库对象形式存储于数据库其中.存储在数据库中的长处是非

Oracle数据库实例核心技术解析_超越OCP精通Oracle视频教程培训05

1.学完本章节Oracle视频教程能掌握以下内容: 启动和停止Oracle DB 和组件使用Oracle Enterprise Manager使用SQL*Plus 工具命令访问数据库如何设置Oracle的环境变量的修改数据库初始化参数跟踪分析数据库启动的各个阶段深入剖析数据库初始化的各个内部过程剖析Oracle数据库的引导过程介绍数据库关闭的过程查看数据库警告日志你对Oracle数据库实例了解多少?实例启动警告日志及启动进程控制文件更新时间与心跳信息解析控制文件内容深入分析数据库的参数文件深入理

Oracle 直方图理论

一.何为直方图 直方图是一种几何形图表,它是根据从生产过程中收集来的质量数据分布情况,画成以组距为底边.以频数为高度的一系列连接起来的直方型矩形图,如图所示 二.ORACLE 直方图 在Oracle中直方图是一种对数据分布情况进行描述的工具.它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够指导优化器根据数据的分布做出正确的选择.在某些情况下,表的列中的数值分布将会影响优化器使用索引还是执行全表扫描的决策. 直方图的使用不受索引的限制,可以在表的任何列上构建直方图

Oracle Net Manager 测试监听服务

前几天因为工作需要,安装了Oracle 11g,但怎么都监听不了本机.打开 PL/SQL Devloper 也登陆不了.随删除之. 今天有时间,又把Oracle 安装上了,想着怎么才能监听.经过操作,现在成功,下面是 过程: 1. 安装完ORACLE 后,进入 配置与移植工具,选择 Net Manager 2. 配置监听程序和服务命名. 我使用的协议为 TCP/IP. 主机 :127.0.0.1 .端口 : 1521. 3. 打开 CMD,输入 sqlplus.exe sys/manager a