版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载。转载时,请在文章明显位置注明原文链接。若在未经作者同意的情况下,将本文内容用于商业用途,将保留追究其法律责任的权利。如果有问题,请以邮箱方式联系作者(793113046@qq.com)。


表簇索引(cluster index)

对于表簇索引而言,必须使用表簇。

由于簇索引与索引表簇关联紧密,无法单独拿出来总结,因此一并进行总结。

1.1 表簇的定义

  • 表簇是一组通过相同公共列(簇键),构成的表的集合
  • 如上图,右侧独立的两张表,employees员工表与departments部门表,通过簇键department_id列,构成了左侧的一个表簇(cluster)。
  • 当构成表簇后,一个单独的数据块会包含多个表的数据行信息

1.2 表簇的分类

  • 对于oracle数据库,主要支持两种表簇:索引聚簇以及哈希聚簇

1.3 索引聚簇与哈希聚簇定位数据的区别

  • 索引聚簇:oracle使用簇索引,将簇键键值与相应数据所在数据块地址(DBA)关联进行数据定位。
  • 哈希聚簇:oracle使用散列函数替代索引,计算出相应数据的物理存储位置,减少了针对索引块的I/O,进而实现了更快地定位。

1.4 表簇的意义

  • 通过簇键的关联,将不同表的相关数据行尽可能地存储在相同的数据块上,不但可以减少存储数据时使用的空间,而且可以降低数据访问时的磁盘I/O数量,提高访问速度。

1.5 表簇的优点

  • 对于表簇,在物理层面上,尽可能将与簇键关联的数据,存储在相同的数据块,进而减少块调用时的磁盘I/O操作(非簇关系的表,如emp表跟dept表中的各自行数据,一定不在同一个数据块。块调用时读取更多的块。原因:不同的segments,segment-extents-blocks)。
  • 对于表簇,簇键的键值无论在被簇表中出现几次,数据块中,只存储一次,且与相关数据行一并存储,减少了占用的空间。

1.6 表簇使用的注意事项

  • 对于存在大量DML操作的表,不适合建立表簇。

  • 对于需要经常进行全表扫描的表,不适合建立表簇。(不再像非簇表那样,一个数据块中仅包含一张表中的数据,还包含了与簇键相关的其他表数据行的数据,这意味着扫描簇中单独的一张表,需要扫描更多的数据块)

  • 对于需要频繁进行TRUNCATE操作的表,不适合建立表簇。(簇表中无法针对单独的被簇表进行truncate操作)

此外,对于哈希表簇,不用也不能创建索引

1.7 表簇索引

  • 表簇索引,即B-tree簇索引,由B-tree结构构成。主要针对索引表簇(index cluster)
  • 与普通B-tree索引的不同在于,普通B-tree索引的索引键将键值与数据的rowid进行关联。聚簇索引的索引键值与相应数据所在数据块的地址(DBA)相关联。

1.8 关于索引表簇(index cluster)创建

  • 创建的顺序如下:建立簇 - 建立簇表 - 建立簇索引 - 加载数据。
  • 创建簇的参数SIZE,决定了每个簇键值可以关联多少字节的数据,进而计算出每个数据块能容纳多少个簇键。
    • 当SIZE设置过高,单独的数据块可以容纳的簇键会减少,且对于单个簇键会占用比实际需求更多的空间,造成空间的浪费。
    • 当SIZE设置过低,单个的簇键无法在单独的数据块中容纳一条完整的数据,进而导致溢出数据部分串联至新块,影响聚合度。
    • 当SIZE设置为1024时,对于一个8K(8192)的标准块,由于数据块的pct_free,实际可容纳7个簇键。
  • 对于索引表簇,当不创建簇索引时,无法进行数据的加载。
  • 下面进行创建的演示,及cluster、index、cluster table在数据存储上的一些区别的说明。
  • 红色字体为创建的关键语句
  • 绿色字体为步骤说明
  • 绿色粗体字体为对象存储分布的一些特点的说明
  • --创建一个表簇
    Yumiko@Sunny >create cluster clu_info_employee (deptno number) size 1024;
    Cluster created. Yumiko@Sunny >select * from tab where TNAME like '%CLU%'; TNAME TABTYPE CLUSTERID
    ------------------------------ ------- ----------
    CLU_INFO_EMPLOYEE CLUSTER --通过查询user_clusters视图(或者dba_clusters视图),可以看到创建的表簇为index cluster,且SIZE设置为1024
    Yumiko@Sunny >select cluster_name, tablespace_name, cluster_type, key_size from user_clusters; CLUSTER_NAME TABLESPACE_NAME CLUST KEY_SIZE
    ------------------------------ ------------------------------ ----- ----------
    CLU_INFO_EMPLOYEE USERS INDEX 1024 --通过user_objects视图(或者dba_objects视图),同样可以查阅cluster的信息。
    --需要注意,同一个cluster下的对象,其DATA_OBJECT_ID的值一致。
    Yumiko@Sunny >select OBJECT_ID,OBJECT_NAME,DATA_OBJECT_ID,OBJECT_TYPE from user_objects where OBJECT_NAME like '%CLU%'; OBJECT_ID OBJECT_NAME DATA_OBJECT_ID OBJECT_TYPE
    ---------- ------------------------- -------------- -------------------
    52626 CLU_INFO_EMPLOYEE 52626 CLUSTER --通过user_clu_columns视图可以看到,此时未显示刚刚创建的cluster信息,表明该簇目前为空簇。
    Yumiko@Sunny >select * from USER_CLU_COLUMNS;
    no rows selected --此处应该注意到,通过dba_segments视图查看,虽然当前是空簇,但已出现刚刚创建的cluster,证明此时已占用了空间。
    Yumiko@Sunny >select SEGMENT_NAME,SEGMENT_TYPE, extents, HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS from dba_segments where owner='SCOTT' and segment_name like '%CLU%'; SEGMENT_NAME SEGMENT_TYPE EXTENTS HEADER_FILE HEADER_BLOCK BYTES BLOCKS
    ----------------------------------------------------------------------------------------
    CLU_INFO_EMPLOYEE CLUSTER 1 4 395 65536 8 --创建簇表
    Yumiko@Sunny >create table clu_info_dept(DEPTNO number,DNAME VARCHAR2(14),LOC VARCHAR2(13)) cluster CLU_INFO_EMPLOYEE(deptno);
    Table created. Yumiko@Sunny >create table clu_info_emp(DEPTNO number,ENAME VARCHAR2(10),JOB VARCHAR2(9)) cluster CLU_INFO_EMPLOYEE(deptno);
    Table created. --查询user_clu_columns视图可以注意到,此时出现了簇及簇表的相应信息,说明此时,簇已不再是空簇。
    Yumiko@Sunny >select * from USER_CLU_COLUMNS; CLUSTER_NAME CLU_COLUMN_NAME TABLE_NAME TAB_COLUMN_NAME
    -----------------------------------------------------------------------------------------
    CLU_INFO_EMPLOYEE DEPTNO CLU_INFO_DEPT DEPTNO
    CLU_INFO_EMPLOYEE DEPTNO CLU_INFO_EMP DEPTNO Yumiko@Sunny >select * from tab where TNAME like '%CLU%'; TNAME TABTYPE CLUSTERID
    ------------------------------ ------- ----------
    CLU_INFO_DEPT TABLE 1
    CLU_INFO_EMP TABLE 2
    CLU_INFO_EMPLOYEE CLUSTER --同上面所说,查询user_objects视图可以看到簇的所有信息,此外可以注意到DATA_OBJECT_ID列是一致的,如前所说
    Yumiko@Sunny >select OBJECT_ID,OBJECT_NAME,DATA_OBJECT_ID,OBJECT_TYPE from user_objects where OBJECT_NAME like '%CLU%'; OBJECT_ID OBJECT_NAME DATA_OBJECT_ID OBJECT_TYPE
    ---------- ------------------------- -------------- -------------------
    52627 CLU_INFO_DEPT 52626 TABLE
    52628 CLU_INFO_EMP 52626 TABLE
    52626 CLU_INFO_EMPLOYEE 52626 CLUSTER --查询此时的dba_segments视图,并未发现添加的两张簇表
    Yumiko@Sunny >select SEGMENT_NAME,SEGMENT_TYPE, extents, HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS from dba_segments where owner='SCOTT' and segment_name like '%CLU%'; SEGMENT_NAME SEGMENT_TYPE EXTENTS HEADER_FILE HEADER_BLOCK BYTES BLOCKS
    ------------------------------------------------------------------------------------
    CLU_INFO_EMPLOYEE CLUSTER 1 4 395 65536 8 --查询此时的dba_tables视图,却可以发现刚刚建立的表
    Yumiko@Sunny >select TABLE_NAME,CLUSTER_NAME,STATUS from dba_tables where owner='SCOTT' and table_name like '%CLU%'; TABLE_NAME CLUSTER_NAME STATUS
    ------------------------------ ------------------------------ --------
    CLU_INFO_EMP CLU_INFO_EMPLOYEE VALID
    CLU_INFO_DEPT CLU_INFO_EMPLOYEE VALID --尝试加载数据失败,报错明显提示了未建立簇索引,也符合之前说过的创建顺序
    Yumiko@Sunny >insert into clu_info_dept select * from dept;
    insert into clu_info_dept select * from dept
    *
    ERROR at line 1:
    ORA-02032: clustered tables cannot be used before the cluster index is built -- 创建簇索引,注意此时的关键字on cluster
    Yumiko@Sunny >create index CLU_INFO_index on cluster CLU_INFO_EMPLOYEE;
    Index created. --查询此时的dba_segments视图,同样有索引的segments信息。
    Yumiko@Sunny >select SEGMENT_NAME,SEGMENT_TYPE, extents, HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS from dba_segments where owner='SCOTT' and segment_name like '%CLU%'; SEGMENT_NAME SEGMENT_TYPE EXTENTS HEADER_FILE HEADER_BLOCK BYTES BLOCKS
    --------------------------------------------------------------------------------------
    CLU_INFO_INDEX INDEX 1 4 403 65536 8
    CLU_INFO_EMPLOYEE CLUSTER 1 4 395 65536 8 --加载数据
    Yumiko@Sunny >insert into clu_info_dept select * from dept;
    4 rows created. --再次查询dba_segments视图,依然没有cluster table的信息
    Yumiko@Sunny >select SEGMENT_NAME,SEGMENT_TYPE, extents, HEADER_FILE, HEADER_BLOCK, BYTES, BLOCKS from dba_segments where owner='SCOTT' and segment_name like '%CLU%';
    SEGMENT_NAME        SEGMENT_TYPE    EXTENTS HEADER_FILE HEADER_BLOCK    BYTES   BLOCKS
    --------------------------------------------------------------------------------------
    CLU_INFO_INDEX INDEX 1 4 403 65536 8
    CLU_INFO_EMPLOYEE CLUSTER 1 4 395 65536 8
  • 从以上不难看出,对于表簇,cluster table仅仅存储在cluster中,不会成为单独的segment占用空间。

1.9 关于索引表簇(index cluster)删除

  • drop cluster cluster_name                                                           -- 用于删除空簇
  • drop cluster cluster_name including tables                                     -- 用于删除非空簇
  • drop cluster cluster_name including tables cascade constraints        --用于删除非空簇及外键约束

此外,对于簇表本身的删除,按照普通表方法即可。

1.10 哈希表簇(hash cluster)简介

下面引用oracle官方文档的例子:

CREATE CLUSTER call_detail_cluster (
telephone_number NUMBER,
call_timestamp NUMBER SORT,
call_duration NUMBER SORT )
HASHKEYS 10000
HASH IS telephone_number
SIZE 256;

其中:
HASH IS参数:

  • 该参数可选,用于指明进行散列的列,可以不明确指定。
  • 当目标列数据类型为number类型,且可以唯一标识行时,可以将该列指定为散列值。
  • 不指明该参数时,oracle使用内部散列函数。

HASHKEYS参数:

  • 该参数用于指定和限制散列函数可以产生的唯一的散列值的数量。
  • 该参数越小,相对关联的数据块越多,发生的物理读越多。

SIZE参数:

  • 该参数基本含义与索引聚簇相似。
  • 该参数越大,虽然单独的数据块可以容纳的簇键会减少,甚至可能会由于单个簇键占用比实际需求更多的空间造成空间的浪费,但由于有更多的空间存储更多的相关数据,只要设置合理,一
    定程度上却可以降低物理读。

Oracle索引梳理系列(五)- Oracle索引种类之表簇索引(cluster index)的更多相关文章

  1. Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  2. Oracle索引梳理系列(二)- Oracle索引种类及B树索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  3. [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table、View

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  4. Oracle索引梳理系列(六)- Oracle索引种类之函数索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  5. Oracle索引梳理系列(四)- Oracle索引种类之位图索引

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  6. Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  7. Oracle索引梳理系列(十)- 直方图使用技巧及analyze table操作对直方图统计的影响(谨慎使用)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  8. Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  9. Oracle索引梳理系列(一)- Oracle访问数据的方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

随机推荐

  1. Cesium应用篇:2影像服务(下)

    文章中相关范例下载路径:https://yunpan.cn/cByQqkANWN7Pu 访问密码 823d 上篇主要介绍了Cesium自带的影像Provider ,在本篇中,我们主要涉及到如何扩展这些 ...

  2. 记录下Sublime Text Mac版的快捷键【转】

    推荐使用最新版本的Chrome/Safari或者Firefox浏览器浏览此页,否则Mac按键可能无法正常展示 The Latest Version of Chrome/Safari or Firefo ...

  3. APP接口自动化测试JAVA+TestNG(一)之框架环境搭建

    前言 好久不曾写点啥,去年换到新公司组测试团队与培养建设花费大量时间与精力,终于架构成型与稳定有时间可以打打酱油了.很久没有总结点啥,提笔想写的内容太多,先放APP接口自动化的内容吧,这个估计大家比较 ...

  4. 在新浪云SAE中使用smarty引擎模版

    在新浪云上使用smarty时会发现又这样的错误信息: “SAE_Fatal_error: Uncaught exception 'SmartyException' with message 'unab ...

  5. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)

    ExcelUtility 类库经过我(梦在旅途)近期不断的优化与新增功能,现已基本趋向稳定,功能上也基本可以满足绝大部份的EXCEL导出需求,该类库已在我们公司大型ERP系统全面使用,效果不错,今天应 ...

  6. 轻松理解AOP思想(面向切面编程)

    本文旨在帮助还没有理解AOP的童鞋看透弄懂AOP,也欢迎高手批评指正. 先说一个Spring是什么吧,大家都是它是一个框架,但框架这个词对新手有点抽象,以致于越解释越模糊,不过它确实是个框架的,但那是 ...

  7. React Native Changed the World? or Nothing.

    RN是一个awesome的技术, facebook很有想法的团队创造出一项新的技术改变了native开发界. 但是RN本身又疑点重重, RN是为了解决什么问题而存在的? 在诞生了一年后, RN又解决了 ...

  8. [转载]C/C++框架和库

    C/C++框架和库 装载自:http://blog.csdn.net/xiaoxiaoyeyaya/article/details/42541419 值得学习的C语言开源项目 Webbench Web ...

  9. ASP.NET MVC过滤器

    在ASP.NET MVC中有个重要特性就是过滤器,使得我们在MVC程序开发中更好的控制浏览器请求的URL,不是每个请求都有响应内容,只有特定得用户才有.园子里关于过滤器的资料也有很多,这篇文章主要是记 ...

  10. Redis所需内存 超过可用内存怎么办

    爬虫和转载请注明原文地址:博客园蜗牛 http://www.cnblogs.com/tdws/p/5727633.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...