1. --创建表
  2. SQL> create table tab (a number, b number);
  3.  
  4. Table created.
  5.  
  6. --插入数据
  7. SQL> begin
  8. 2 for i in 1..10000 loop
  9. 3 insert into tab values (i, i);
  10. 4 end loop;
  11. 5 commit;
  12. 6 end;
  13. 7 /
  14.  
  15. PL/SQL procedure successfully completed.
  16.  
  17. --更新部分数据
  18. SQL> update tab set b=5 where b between 6 and 9995;
  19.  
  20. 9990 rows updated.
  21.  
  22. --提交
  23. SQL> commit;
  24.  
  25. Commit complete.
  26.  
  27. --创建索引
  28. SQL> create index ix_tab_b on tab(b);
  29.  
  30. Index created.
  31.  
  32. --数据分布
  33. SQL> SELECT b,count(*) from tab group by b order by 1;
  34.  
  35. B COUNT(*)
  36. ---------- ----------
  37. 1 1
  38. 2 1
  39. 3 1
  40. 4 1
  41. 5 9991
  42. 9996 1
  43. 9997 1
  44. 9998 1
  45. 9999 1
  46. 10000 1
  47.  
  48. 10 rows selected.
  49.  
  50. SQL>
  51.  
  52. --禁止产生直方图(size 1
  53. SQL> BEGIN
  54. 2 DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'NC50',
  55. 3 TABNAME => 'TAB',
  56. 4 CASCADE => TRUE,
  57. 5 METHOD_OPT => 'FOR COLUMNS B SIZE 1 ');
  58. 6 END;
  59. 7 /
  60.  
  61. PL/SQL procedure successfully completed.
  62.  
  63. SQL>
  64.  
  65. --查看视图USER_TAB_HISTOGRAMS
  66. SQL> col COLUMN_NAME format a20
  67. SQL> col TABLE_NAME format a15
  68. SQL> SELECT table_name,column_name,endpoint_number,endpoint_value FROM USER_TAB_HISTOGRAMS WHERE TABLE_NAME='TAB';
  69.  
  70. TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
  71. --------------- -------------------- --------------- --------------
  72. TAB B 0 1
  73. TAB B 1 10000
  74.  
  75. SQL>
  76.  
  77. --注:ENDPOINT_NUMBER列值是bucket的标识号。现在只有01两个bucket说明没有产生直方图信息。
  78.  
  79. --在没有直方图的情况下,在B列上进行等值查询的时候,都是索引范围扫描(即使返回总数据量的80%)
  80.  
  81. SQL> set autotrace traceonly explain
  82. SQL> set line 180
  83. SQL> select * from tab where b=1;
  84.  
  85. Execution Plan
  86. ----------------------------------------------------------
  87. Plan hash value: 439197569
  88.  
  89. ----------------------------------------------------------------------------------------
  90. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  91. ----------------------------------------------------------------------------------------
  92. | 0 | SELECT STATEMENT | | 1000 | 7000 | 4 (0)| 00:00:01 |
  93. | 1 | TABLE ACCESS BY INDEX ROWID| TAB | 1000 | 7000 | 4 (0)| 00:00:01 |
  94. |* 2 | INDEX RANGE SCAN | IX_TAB_B | 1000 | | 2 (0)| 00:00:01 |
  95. ----------------------------------------------------------------------------------------
  96.  
  97. Predicate Information (identified by operation id):
  98. ---------------------------------------------------
  99.  
  100. 2 - access("B"=1)
  101.  
  102. SQL>
  103.  
  104. SQL> select * from tab where b=5;---返回9991条数据,总数据量的80%
  105.  
  106. Execution Plan
  107. ----------------------------------------------------------
  108. Plan hash value: 439197569
  109.  
  110. ----------------------------------------------------------------------------------------
  111. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  112. ----------------------------------------------------------------------------------------
  113. | 0 | SELECT STATEMENT | | 1000 | 7000 | 4 (0)| 00:00:01 |
  114. | 1 | TABLE ACCESS BY INDEX ROWID| TAB | 1000 | 7000 | 4 (0)| 00:00:01 |
  115. |* 2 | INDEX RANGE SCAN | IX_TAB_B | 1000 | | 2 (0)| 00:00:01 |
  116. ----------------------------------------------------------------------------------------
  117.  
  118. Predicate Information (identified by operation id):
  119. ---------------------------------------------------
  120.  
  121. 2 - access("B"=5)
  122.  
  123. SQL>
  124.  
  125. --收集直方图信息。看看是什么效果。由于列B唯一值的个数没有超过254因此产生的是等频直方图。
  126.  
  127. SQL> BEGIN
  128. 2 DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'NC50',
  129. 3 TABNAME => 'TAB',
  130. 4 CASCADE => TRUE,
  131. 5 METHOD_OPT => 'FOR COLUMNS B SIZE AUTO ');
  132. 6 END;
  133. 7 /
  134.  
  135. PL/SQL procedure successfully completed.
  136.  
  137. SQL>
  138.  
  139. --在B=1时候采用索引扫描
  140.  
  141. SQL> set autotrace traceonly explain
  142. SQL> select * from tab where b=1;
  143.  
  144. Execution Plan
  145. ----------------------------------------------------------
  146. Plan hash value: 439197569
  147.  
  148. ----------------------------------------------------------------------------------------
  149. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  150. ----------------------------------------------------------------------------------------
  151. | 0 | SELECT STATEMENT | | 1 | 7 | 2 (0)| 00:00:01 |
  152. | 1 | TABLE ACCESS BY INDEX ROWID| TAB | 1 | 7 | 2 (0)| 00:00:01 |
  153. |* 2 | INDEX RANGE SCAN | IX_TAB_B | 1 | | 1 (0)| 00:00:01 |
  154. ----------------------------------------------------------------------------------------
  155.  
  156. Predicate Information (identified by operation id):
  157. ---------------------------------------------------
  158.  
  159. 2 - access("B"=1)
  160.  
  161. --在B=5时候,已经采用全表扫描了,说明直方图起了作用
  162. SQL> select * from tab where b=5;
  163.  
  164. Execution Plan
  165. ----------------------------------------------------------
  166. Plan hash value: 1995730731
  167.  
  168. --------------------------------------------------------------------------
  169. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  170. --------------------------------------------------------------------------
  171. | 0 | SELECT STATEMENT | | 9991 | 69937 | 9 (0)| 00:00:01 |
  172. |* 1 | TABLE ACCESS FULL| TAB | 9991 | 69937 | 9 (0)| 00:00:01 |
  173. --------------------------------------------------------------------------
  174.  
  175. Predicate Information (identified by operation id):
  176. ---------------------------------------------------
  177.  
  178. 1 - filter("B"=5)
  179.  
  180. SQL>
  181.  
  182. --查看此时的直方图信息:
  183. SQL> set autotrace off;
  184. SQL> col TABLE_NAME format a10
  185. SQL> col COLUMN_NAME format a20
  186. SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE
  187. 2 FROM USER_TAB_HISTOGRAMS
  188. 3 WHERE TABLE_NAME = 'TAB';
  189.  
  190. TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
  191. ---------- -------------------- --------------- --------------
  192. TAB B 1 1
  193. TAB B 2 2
  194. TAB B 3 3
  195. TAB B 4 4
  196. TAB B 9995 5
  197. TAB B 9996 9996
  198. TAB B 9997 9997
  199. TAB B 9998 9998
  200. TAB B 9999 9999
  201. TAB B 10000 10000
  202.  
  203. 10 rows selected.
  204.  
  205. SQL>
  206.  
  207. --其中EDNPOINT_NUMBER是累计值,EDNPOINT_NUMBER(N)-EDNPOINT_NUMBER(N-1)=当前桶的数据个数=9995-4=9991
  208. --EDNPOINT_VALUE是列的值。
  209.  
  210. --在看看等高直方图的情况,由于列B10个唯一值,通过size 8可以强制ORACLE使用等高直方图
  211. SQL> BEGIN
  212. 2 DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'NC50',
  213. 3 TABNAME => 'TAB',
  214. 4 CASCADE => TRUE,
  215. 5 METHOD_OPT => 'FOR COLUMNS B SIZE 8 ');
  216. 6 END;
  217. 7 /
  218.  
  219. PL/SQL procedure successfully completed.
  220.  
  221. SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE FROM USER_TAB_HISTOGRAMS
  222. 2 WHERE TABLE_NAME = 'TAB' ;
  223. WHERE TABLE_NAME = 'TAB'
  224. *
  225. ERROR at line 2:
  226. ORA-00933: SQL command not properly ended
  227.  
  228. SQL> SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE
  229. 2 FROM USER_TAB_HISTOGRAMS
  230. 3 WHERE TABLE_NAME = 'TAB';
  231.  
  232. TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE
  233. ---------- -------------------- --------------- --------------
  234. TAB B 0 1
  235. TAB B 7 5
  236. TAB B 8 10000
  237.  
  238. SQL>
  239.  
  240. --从查询结果惊奇的发现只有三个桶0 7 8
  241.  
  242. --说明:在等高直方图中,EDNPOINT_NUMBER代表桶号,这一点与等频直方图不同。
  243.  
  244. SQL> set autotrace traceonly explain;
  245. SQL> select * from tab where b=5;
  246.  
  247. Execution Plan
  248. ----------------------------------------------------------
  249. Plan hash value: 1995730731
  250.  
  251. --------------------------------------------------------------------------
  252. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  253. --------------------------------------------------------------------------
  254. | 0 | SELECT STATEMENT | | 8750 | 61250 | 9 (0)| 00:00:01 |
  255. |* 1 | TABLE ACCESS FULL| TAB | 8750 | 61250 | 9 (0)| 00:00:01 |
  256. --------------------------------------------------------------------------
  257.  
  258. Predicate Information (identified by operation id):
  259. ---------------------------------------------------
  260.  
  261. 1 - filter("B"=5)
  262.  
  263. SQL>
  264.  
  265. --发现执行计划的ROWS部分,ORACLE计算出来的cardinality不是特别精确的。9991才是精确值。而等频直方图可以精确到9991,因此可以说等频直方图比等高直方图稳定,精确。可是现实很多时候,列的唯一值是超过254的。只能使用等高直方图了。

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

  1. RHEL6.4 + Oracle 11g DG测试环境快速搭建参考

    环境现状: 两台虚拟主机A和B: 1. A机器已安装ASM存储的Oracle 11g 实例      参考:http://www.cnblogs.com/jyzhao/p/4332410.html 2 ...

  2. Oracle直方图的详细解析

    yuanwen:http://blog.csdn.net/javacoffe/article/details/5578206 Oracle直方图解析 一.    何谓直方图: 直方图是一种统计学上的工 ...

  3. 详细说明手工创建oracle数据库实例

    手工建库比起使用DBCA建库来说,是比较麻烦的,但是如果我们学好了手工建库的话,就可以使我们更好地理解Oracle数据库的体系结构.手工建库须要经过几个步骤,每一个步骤都非常关键.它包括:1. 创建必 ...

  4. 关于:无法创建链接服务器 "ORCL" 的 OLE DB 访问接口 "OraOLEDB.Oracle" 的实例 (错误:7302)

    本人接触和使用Oracle数据库才有一个季度的时间,问题比较白,大神请无视本文. 环境: 1.数据服务器,windows2008R2,Oracle11g 2.报表服务器,windows2008R2,S ...

  5. 如何使用swingbench进行oracle数据库压力测试

    如何使用swingbench进行oracle数据库压力测试 2014-10-06 08:09:02 标签:oracle 数据库压力测试 swingbench 原创作品,允许转载,转载时请务必以超链接形 ...

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

    Oracle直方图解析 一.    何谓直方图: 直方图是一种统计学上的工具,并非Oracle专有.通常用于对被管理对象的某个方面的质量情况进行管理,通常情况下它会表现为一种几何图形表,这个图形表是根 ...

  7. 删除Oracle Online Redo 测试

    删除Oracle Online Redo 测试 SQL> select * from v$log; ​   GROUP#   THREAD# SEQUENCE#     BYTES BLOCKS ...

  8. Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试

    Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试一.下载相关安装包 1.下载nginx最新版本(nginx1.3.13版之后才支持websocket协议) 下载地址 ...

  9. 转--Oracle 审计和测试操作

    http://blog.itpub.net/21605631/viewspace-759640/转 Oracle 审计和测试操作 :: 分类: Linux 1.1 相关参数 AUDIT_SYS_OPE ...

随机推荐

  1. html标签属性

    clientWidth = width + paddingclientHeight = height + paddingoffsetWidth = width + padding + borderof ...

  2. php 通过PATH_SEPARATOR判断当前服务器系统类型

    PATH_SEPARATOR是php中的一个预定义常量,我们可以直接echo这个常量,在linux系统中,该常量输出":",在windows系统中,该常量输出";&quo ...

  3. 动手学servlet(二) servlet基础

    1.我们来试着向一个servlet提交一个表单,现在webcontent下新建一个login.html页面,其中action对应servelt类名,代码如下: <!DOCTYPE HTML PU ...

  4. 点评App wiki-git标准实践

    fetch与pull fetch = pull + merge fetch -p,用于将清理工作同步到本地repository rebase-衍合 merge与rebase是合并的两种方法(上为mer ...

  5. JSP SQL注入

    Login.JSP <%@ page language="java" import="java.util.*" pageEncoding="UT ...

  6. JAVA Socket:文件传输

    客户端:读取文件(FileInputStream),发送文件(OutputStream) 服务器端:接收文件(InputStream),写文件(FileOutputStream) 客户端代码: pac ...

  7. Win2008或IIS7的文件上传大小限制解决方案

    默认情况下,IIS7的上传限制为200K.当上传文件小于30M时,可以通过如下方法设置:在iis7中找到asp设置,在“asp”的“限制属性”中最后一行“最大请求主体限制”,修改该值为你所想要的,如2 ...

  8. Windows 2008 IIS7.0安装FTP教程 IIS7.5 配置多用户FTP

    一. 安装IIS.右键[我的电脑],选择[管理]打开.     选择[角色],选择[添加角色]打开.                   二. 配置DOS.输入: CACLS "%Syste ...

  9. python学习(二):python基本语法

    前言:python基本的语法与其他语言诸如C,JAVA等类似,但个中有些许不同. 一.常规语法 1.变量名与关键字 与其他语言类似,变量名由字母.数字.下划线组成,且必须由字母开头. 变量使用不需要提 ...

  10. NSSet、NSMutableSet

    NSSet和NSArray功能性质一样,用于存储对象,属于集合:只能添加cocoa对象,基本数据类型需要装箱. NSSet . NSMutableSet是无序的集合,在内存中存储方式是不连续的,而NS ...