关于集簇因子和柱状图的理解
一、准备实验环境
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
关于集簇因子和柱状图的理解相关推荐
- Oracle聚簇因子(Clustering factor,CF)
Oracle 聚簇因子(Clustering factor) 聚簇因子是 Oracle 统计信息中在CBO优化器模式下用于计算cost的参数之一,决定了当前的SQL语句是否走索引,还是全表扫描以及是否 ...
- oracle聚簇因子对于索引使用的影响
1.聚簇因子的概念 聚簇因子,是CBO优化器决定是否使用索引的因素之一,主要反映索引块上的数据(顺序存储),与该索引基于的表块上的数据(无序存储)的顺序相似程度的差异性.即表数据的存储顺序是否与相应索 ...
- PostgreSQL数据库集簇
数据库集簇的逻辑结构 数据库集簇(database cluster)是指由单个PostgreSQL服务器实例管理的数据库集合.(解读:数据库集簇是集合,其元素是数据库.一个PostgreSQL服务器实 ...
- oracle 修改聚簇因子,Oracle 基础篇 --- 聚簇因子(clustering_factor)
####4.2.1 聚簇因子(clustering_factor) 统计帮助优化器生成使用索引的成功信息,并且是表中建立了索引的数据排序优良度的一个度量值:向优化器表明了具有同样索引值的数据行是不是存 ...
- Oracle11gR2-聚簇因子浅析
创建表t1,t2 SQL> conn n1/n1 Connected. SQL> SQL> SQL> create table t1 as select trunc(rownu ...
- 资源放送丨《Oracle聚簇因子的作用 - 2020云和恩墨大讲堂》PPT视频
前段时间,墨天轮分享了直播<Oracle聚簇因子的作用 - 2020云和恩墨大讲堂>,在这里我们共享一下PPT和视频,供大家参考学习. 本分享从索引的结构和特点入题,引出聚簇因子的作用,并 ...
- [转载]与索引相关的概念---聚簇因子
原文地址:与索引相关的概念---聚簇因子作者:Ryan 1.聚簇因子(Clustering factor) 索引行的存储顺序与表中行的存储顺序之间的相似程度. 当相似度高时,这些数据行就会密集地存储在 ...
- cf(聚簇因子)调优,计划调优,SQL改造
---------------1.---------数据.检测准备-------------------------------------------- drop table TE ...
- 一次简单的性能优化诊断,聚簇因子过高导致全表扫描。
一次简单的性能优化诊断,聚簇因子过高导致全表扫描. http://www.itpub.net/thread-1317424-1-1.html
最新文章
- python能不能连等赋值_javascript 连等赋值问题
- Mysql5.7安装错误处理与主从同步及!
- Tomcat中web.xml文件的详细说明
- c语言变量作为数组长度,为什么在C中不允许将数组的大小作为常量变量但在C中允许?...
- 保存文件_wps文件保存在哪里
- 9名程序员被抓!这次我并不同情他们!
- Windows Azure 部署 Windows 8 虚拟机
- JNI开发笔记(五)--JNI语法总结
- Android P 消息
- 【Linux】Centos防火墙命令
- Leetcode怎么调试java代码,LeetCode–正则表达式匹配
- [BZOJ] 1619: [Usaco2008 Nov]Guarding the Farm 保卫牧场
- Django笔记 —— 模型高级进阶
- TCP Server 实现 RPN计算器(Python)
- 计算机软件系统验收标准,软件相关标准目录.xlsx
- c语言开发入门教程,C语言开发入门教程
- C++ 依赖倒置原则
- 进阶-第28__深度探秘搜索技术_实战掌握误拼写时的fuzzy模糊搜索技术
- Mac OS X 窗口操作快捷键
- 台式计算机没办法连接wifi吗,台式机连接wifi不能用怎么办
热门文章
- Web开发必学的8个网页优化技巧!
- qt widget设置边框_Qt开源作品16-通用无边框拖动拉伸
- 华为手机助手上架流程_2019年各大安卓应用商店上架经验,含流程,物料,方法,建议收藏...
- Java教程:Java JDK环境变量配置
- java绘制图形_Java绘制图形
- 支付宝开放平台开发助手_支付宝:如何创建和接入支付宝电脑网站支付-新手必备...
- php清除输出缓冲,php如何清除缓冲区
- MATLAB:如何保存图片到指定文件夹?
- 基于softmax的文本多分类模型代码实现
- Python风格总结:迭代器与生成器