一、准备实验环境

1、建立表

SQL> create table emp2 as select * from emp;

表已创建。

2、在表上建立索引

SQL> create index emp2_empno_ind on emp2(empno);

索引已创建。

3、分析表

SQL> analyze table emp2 estimate statistics;

表已分析。

4、查看集簇因子

SQL> select t.table_name,t.NUM_ROWS,t.BLOCKS,t.AVG_ROW_LEN,i.index_name,i.CLUSTERING_FACTOR from dba_tables t,dba_indexes i

2  where t.table_name=i.table_name

3  and t.owner='SCOTT'

4  and t.table_name='EMP2';

TABLE_NAME   NUM_ROWS     BLOCKS AVG_ROW_LEN INDEX_NAME      CLUSTERING_FACTOR

---------- ---------- ---------- ----------- --------------- -----------------

EMP2               14          4          40 EMP2_EMPNO_IND                  1

5、查看执行计划

SQL> select * from emp2 where empno=7788;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

执行计划

----------------------------------------------------------

Plan hash value: 1554879445

----------------------------------------------------------------------------------------------

| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |                |     1 |    32 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| EMP2           |     1 |    32 |     2   (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | EMP2_EMPNO_IND |     1 |       |     1   (0)| 00:00:01 |

----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - access("EMPNO"=7788)

统计信息

----------------------------------------------------------

0  recursive calls

0  db block gets

3  consistent gets

0  physical reads

0  redo size

843  bytes sent via SQL*Net to client

416  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

1  rows processed

SQL>

从执行计划中可看出,执行语句时为索引查询,集簇因子的值与块数接近:意味着列值相同的行存放得比较集中

二、使empno相同的行分散在不同的块

1、计算出14行数据在每个块中所占比例

SQL> show parameter block

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_block_buffers                     integer     0

db_block_checking                    string      FALSE

db_block_checksum                    string      TYPICAL

db_block_size                        integer     8192

db_file_multiblock_read_count        integer     128

SQL>

SQL> select t.table_name,t.NUM_ROWS,t.BLOCKS,t.AVG_ROW_LEN,i.index_name,i.CLUSTERING_FACTOR from dba_tables t,dba_indexes i

2  where t.table_name=i.table_name

3  and t.owner='SCOTT'

4  and t.table_name='EMP2';

TABLE_NAME   NUM_ROWS     BLOCKS AVG_ROW_LEN INDEX_NAME      CLUSTERING_FACTOR

---------- ---------- ---------- ----------- --------------- -----------------

EMP2               14          4          40 EMP2_EMPNO_IND                  1

14*40/8192≈0.07

所以每个块的剩余空间约为97%

2、修改pctfree的值,改为93,插入多次数据

SQL> alter table emp2 pctfree 93;

表已更改。

SQL>

SQL> insert into emp2 select * from emp;

已创建14行。

/

/

/

SQL> select count(*) from emp2;

COUNT(*)

----------

140

3、分析表,查看集簇因子和执行计划

SQL> analyze table emp2 estimate statistics;

表已分析。

SQL>

SQL>select t.table_name,t.NUM_ROWS,t.BLOCKS,t.AVG_ROW_LEN,i.index_name,i.CLUSTERING_FACTOR

2  from dba_tables t,dba_indexes i

3  where t.table_name=i.table_name

4  and t.owner='SCOTT'

5  and t.table_name='EMP2';

TABLE_NAME   NUM_ROWS     BLOCKS AVG_ROW_LEN INDEX_NAME      CLUSTERING_FACTOR

---------- ---------- ---------- ----------- --------------- -----------------

EMP2              140         16          40 EMP2_EMPNO_IND                140

SQL>

SQL> select * from emp2 where empno=7788;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

已选择10行。

执行计划

----------------------------------------------------------

Plan hash value: 2941272003

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |    10 |   320 |     6   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| EMP2 |    10 |   320 |     6   (0)| 00:00:01 |

--------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("EMPNO"=7788)

统计信息

----------------------------------------------------------

1  recursive calls

0  db block gets

17  consistent gets

0  physical reads

0  redo size

915  bytes sent via SQL*Net to client

416  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

10  rows processed

SQL>

从执行计划可以看出语句执行时为全表扫描,原因:需要查询的数据分散在各个块中,集簇因子的值与行数接近

三、使empno相同的值尽量在同一个块中

1、建立一个新表emp_test,其中的数据和emp2中的数据相同

SQL> create table emp_test as select * from emp2;

表已创建。

2、将表emp2截断

SQL>

SQL> truncate table emp2;

表被截断。

3、将数据按照empno排列后重新插入到enp2中

SQL> insert into emp2 select * from emp_test order by empno;

已创建140行。

SQL>

4、查看集簇因子和执行计划

SQL>  analyze table emp2 estimate statistics;

表已分析。

SQL>

SQL> select t.table_name,t.NUM_ROWS,t.BLOCKS,t.AVG_ROW_LEN,i.index_name,i.CLUSTERING_FACTOR

2  from dba_tables t,dba_indexes i

3  where t.table_name=i.table_name

4  and t.owner='SCOTT'

5  and t.table_name='EMP2';

TABLE_NAME   NUM_ROWS     BLOCKS AVG_ROW_LEN INDEX_NAME      CLUSTERING_FACTOR

---------- ---------- ---------- ----------- --------------- -----------------

EMP2              140         13          40 EMP2_EMPNO_IND                 16

SQL>

SQL> select * from emp2 where empno=7788;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

已选择10行。

执行计划

----------------------------------------------------------

Plan hash value: 1554879445

----------------------------------------------------------------------------------------------

| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |                |    10 |   320 |     3   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| EMP2           |    10 |   320 |     3   (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | EMP2_EMPNO_IND |    10 |       |     1   (0)| 00:00:01 |

----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - access("EMPNO"=7788)

统计信息

----------------------------------------------------------

1  recursive calls

0  db block gets

5  consistent gets

0  physical reads

0  redo size

1255  bytes sent via SQL*Net to client

416  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

10  rows processed

SQL>

从执行计划中可以看出查询语句为索引查询的方式、原因:emp2中的数据按照empno的数据插入的,empno相同的值集聚在相同的块中,集簇因子的值与块数接近

四、柱状图

1、在emp2表中插入数据

SQL> begin

2   for i in 1..1000 loop

3     insert into emp2 values (7788,'SCOTT','ANALYST',7566,sysdate,5000,null,20);

4   end loop;

5   commit;

6  end;

7  /

PL/SQL 过程已成功完成。

SQL> select count(*) from emp2;

COUNT(*)

----------

1140

SQL> select count(*) from emp2 where empno=7788;

COUNT(*)

----------

1010

SQL>

可以看出empno=7788的数据量在整个表中所占比重很大,如果执行select * from emp2 where empno=7788 这条语句理论上是全表扫描执行

2、查看集簇因子和执行计划

SQL> analyze table emp2 estimate statistics;

表已分析。

SQL> select t.table_name,t.NUM_ROWS,t.BLOCKS,t.AVG_ROW_LEN,i.index_name,i.CLUSTERING_FACTOR

2  from dba_tables t,dba_indexes i

3  where t.table_name=i.table_name

4  and t.owner='SCOTT'

5  and t.table_name='EMP2';

TABLE_NAME   NUM_ROWS     BLOCKS AVG_ROW_LEN INDEX_NAME      CLUSTERING_FACTOR

---------- ---------- ---------- ----------- --------------- -----------------

EMP2             1140         95          40 EMP2_EMPNO_IND                 95

SQL>

SQL> select * from emp2 where empno=7788;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 2015-10-19 20:50:44       5000                    20

7788 SCOTT      ANALYST         7566 2015-10-19 20:50:44       5000                    20

7788 SCOTT      ANALYST         7566 2015-10-19 20:50:44       5000                    20

7788 SCOTT      ANALYST         7566 2015-10-19 20:50:44       5000                    20

已选择1010行。

执行计划

----------------------------------------------------------

Plan hash value: 1554879445

----------------------------------------------------------------------------------------------

| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |                |    81 |  2592 |     8   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| EMP2           |    81 |  2592 |     8   (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | EMP2_EMPNO_IND |    81 |       |     1   (0)| 00:00:01 |

----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - access("EMPNO"=7788)

统计信息

----------------------------------------------------------

1  recursive calls

0  db block gets

215  consistent gets

0  physical reads

0  redo size

51965  bytes sent via SQL*Net to client

1153  bytes received via SQL*Net from client

69  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

1010  rows processed

SQL>

可以看出集簇因子数与块数大小接近,但是没有考虑返回数量的大小问题,执行过程中仍是索引查询

3、建柱状图

SQL> analyze table emp2 estimate statistics for columns empno;

表已分析。

4、查看集簇因子和执行计划

SQL> select t.table_name,t.NUM_ROWS,t.BLOCKS,t.AVG_ROW_LEN,i.index_name,i.CLUSTERING_FACTOR

2  from dba_tables t,dba_indexes i

3  where t.table_name=i.table_name

4  and t.owner='SCOTT'

5  and t.table_name='EMP2';

TABLE_NAME   NUM_ROWS     BLOCKS AVG_ROW_LEN INDEX_NAME      CLUSTERING_FACTOR

---------- ---------- ---------- ----------- --------------- -----------------

EMP2             1140         95          40 EMP2_EMPNO_IND                 95

SQL>

SQL> select * from emp2 where empno=7788;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

7788 SCOTT      ANALYST         7566 2015-10-19 20:50:44       5000                    20

已选择1010行。

执行计划

----------------------------------------------------------

Plan hash value: 2941272003

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |  1010 | 32320 |    27   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| EMP2 |  1010 | 32320 |    27   (0)| 00:00:01 |

--------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("EMPNO"=7788)

统计信息

----------------------------------------------------------

1  recursive calls

0  db block gets

162  consistent gets

0  physical reads

0  redo size

14446  bytes sent via SQL*Net to client

1153  bytes received via SQL*Net from client

69  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

1010  rows processed

SQL>

从执行计划中看出为全表扫描查询

SQL> select * from emp2 where empno=7369;

EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

已选择10行。

执行计划

----------------------------------------------------------

Plan hash value: 1554879445

----------------------------------------------------------------------------------------------

| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |                |    10 |   320 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| EMP2           |    10 |   320 |     2   (0)| 00:00:01 |

|*  2 |   INDEX RANGE SCAN          | EMP2_EMPNO_IND |    10 |       |     1   (0)| 00:00:01 |

----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - access("EMPNO"=7369)

统计信息

----------------------------------------------------------

1  recursive calls

0  db block gets

5  consistent gets

0  physical reads

0  redo size

1235  bytes sent via SQL*Net to client

416  bytes received via SQL*Net from client

2  SQL*Net roundtrips to/from client

0  sorts (memory)

0  sorts (disk)

10  rows processed

SQL>

当查询结果返回值数据值小时为索引查询

从以上可以看出索引查询的代价大于全表扫面的代价,原因是数据量太小,当数据量增大时会发现索引查询的代价是会小于全表扫描的

转载于:https://www.cnblogs.com/wangqianqiannb/p/4899128.html

关于集簇因子和柱状图的理解相关推荐

  1. Oracle聚簇因子(Clustering factor,CF)

    Oracle 聚簇因子(Clustering factor) 聚簇因子是 Oracle 统计信息中在CBO优化器模式下用于计算cost的参数之一,决定了当前的SQL语句是否走索引,还是全表扫描以及是否 ...

  2. oracle聚簇因子对于索引使用的影响

    1.聚簇因子的概念 聚簇因子,是CBO优化器决定是否使用索引的因素之一,主要反映索引块上的数据(顺序存储),与该索引基于的表块上的数据(无序存储)的顺序相似程度的差异性.即表数据的存储顺序是否与相应索 ...

  3. PostgreSQL数据库集簇

    数据库集簇的逻辑结构 数据库集簇(database cluster)是指由单个PostgreSQL服务器实例管理的数据库集合.(解读:数据库集簇是集合,其元素是数据库.一个PostgreSQL服务器实 ...

  4. oracle 修改聚簇因子,Oracle 基础篇 --- 聚簇因子(clustering_factor)

    ####4.2.1 聚簇因子(clustering_factor) 统计帮助优化器生成使用索引的成功信息,并且是表中建立了索引的数据排序优良度的一个度量值:向优化器表明了具有同样索引值的数据行是不是存 ...

  5. Oracle11gR2-聚簇因子浅析

    创建表t1,t2 SQL> conn n1/n1 Connected. SQL> SQL> SQL> create table t1 as select trunc(rownu ...

  6. 资源放送丨《Oracle聚簇因子的作用 - 2020云和恩墨大讲堂》PPT视频

    前段时间,墨天轮分享了直播<Oracle聚簇因子的作用 - 2020云和恩墨大讲堂>,在这里我们共享一下PPT和视频,供大家参考学习. 本分享从索引的结构和特点入题,引出聚簇因子的作用,并 ...

  7. [转载]与索引相关的概念---聚簇因子

    原文地址:与索引相关的概念---聚簇因子作者:Ryan 1.聚簇因子(Clustering factor) 索引行的存储顺序与表中行的存储顺序之间的相似程度. 当相似度高时,这些数据行就会密集地存储在 ...

  8. cf(聚簇因子)调优,计划调优,SQL改造

    ---------------1.---------数据.检测准备--------------------------------------------          drop table TE ...

  9. 一次简单的性能优化诊断,聚簇因子过高导致全表扫描。

    一次简单的性能优化诊断,聚簇因子过高导致全表扫描. http://www.itpub.net/thread-1317424-1-1.html

最新文章

  1. python能不能连等赋值_javascript 连等赋值问题
  2. Mysql5.7安装错误处理与主从同步及!
  3. Tomcat中web.xml文件的详细说明
  4. c语言变量作为数组长度,为什么在C中不允许将数组的大小作为常量变量但在C中允许?...
  5. 保存文件_wps文件保存在哪里
  6. 9名程序员被抓!这次我并不同情他们!
  7. Windows Azure 部署 Windows 8 虚拟机
  8. JNI开发笔记(五)--JNI语法总结
  9. Android P 消息
  10. 【Linux】Centos防火墙命令
  11. Leetcode怎么调试java代码,LeetCode–正则表达式匹配
  12. [BZOJ] 1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场
  13. Django笔记 —— 模型高级进阶
  14. TCP Server 实现 RPN计算器(Python)
  15. 计算机软件系统验收标准,软件相关标准目录.xlsx
  16. c语言开发入门教程,C语言开发入门教程
  17. C++ 依赖倒置原则
  18. 进阶-第28__深度探秘搜索技术_实战掌握误拼写时的fuzzy模糊搜索技术
  19. Mac OS X 窗口操作快捷键
  20. 台式计算机没办法连接wifi吗,台式机连接wifi不能用怎么办

热门文章

  1. Web开发必学的8个网页优化技巧!
  2. qt widget设置边框_Qt开源作品16-通用无边框拖动拉伸
  3. 华为手机助手上架流程_2019年各大安卓应用商店上架经验,含流程,物料,方法,建议收藏...
  4. Java教程:Java JDK环境变量配置
  5. java绘制图形_Java绘制图形
  6. 支付宝开放平台开发助手_支付宝:如何创建和接入支付宝电脑网站支付-新手必备...
  7. php清除输出缓冲,php如何清除缓冲区
  8. MATLAB:如何保存图片到指定文件夹?
  9. 基于softmax的文本多分类模型代码实现
  10. Python风格总结:迭代器与生成器