聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的。聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。一个表最多只能有一个聚簇索引。

使用 Oracle 聚簇索引

聚簇是一种存储表的方法,这些表密切相关并经常一起连接进磁盘的同一区域。例如,表 BOOKSHELF 和BOOKSHELF_AUTHOR 数据行可以一起插入到称为簇(Cluster)的单个区域中,而不是将两个表放在磁盘上的不同扇区上。簇键(Cluster Key)可以是一列或多列,通过这些列可以将这些表在查询中连接起来(例如,BOOKSHELF表和BOOKSHELF_AUTHOR表中的 Title列)。为了将表聚集在一起,必须拥有这些将要聚集在一起的表。

下面是create cluster命令的基本格式:

create cluster (column datatype [, column datatype]...) [other options];

cluster的名字遵循表命名约定,column datatype是将作为簇键使用的名字和数据类型。column的名字可以与将要放进该簇中的表的一个列名相同,或者为其他有效名字。下面是一个例子:

create cluster BOOKandAUTHOR (Col1 VARCHAR2(100));

这样就建立了一个没有任何内容的.簇(象给表分配了一块空间一样)。COL1的使用对于簇键是不相干的,不会再使用它。但是,它的定义应该与要增加的表的主键相符。接下来,建立包含在该簇中的表:

create table BOOKSHELF

(Title VARCHAR2(100) primary key,

Publisher VARCHAR2(20),

CategoryName VARCHAR2(20),

Rating VARCHAR2(2),

constraint CATFK foreign key (CategoryName) references CATEGORY(CategoryName)

)

cluster BOOKandAUTHOR(Title);

在向BOOKSHELF表中插入数据行之前,必须建立一个聚簇索引:

create index BOOKandAUTHORndx on cluster BOOKandAUTHOR;

在上面的create table语句中,簇BOOKandAUTHOR(Title)子句放在表的列清单的闭括号的后面。BOOKandAUTHOR是前面建立的聚簇的名字。Title是将存储到聚簇Col1中的该表的列。create cluster语句中可能会有多个簇键,并且在created table语句中可能有多个列存储在这些键中。请注意,没有任何语句明确说明Title列进入到Col1中。这种匹配仅仅是通过位置做到的,即Col1和Title都是在它们各自的簇语句中提到的第一个对象。多个列和簇键是第一个与第一个匹配,第二个与第二个匹配,第三个与第三个匹配,等等。现在,添加第二个表到聚簇中:

create table BOOKSHELF_AUTHOR

(Title VARCHAR2(100),

AuthorName VARCHAR2(50),

constraint TitleFK Foreign key (Title) references BOOKSHELF(Title),

constraint AuthorNameFK Foreign key (AuthorName) references AUTHOR(AuthorName)

)

cluster BOOKandAUTHOR (Title);

当这两个表被聚在一起时,每个唯一的Title在簇中实际只存储一次。对于每个Title,都从这两个表中附加列。

来自这两个表的数据实际上存放在一个位置上,就好像簇是一个包含两个表中的所有数据的大表一样。

散列聚簇

对于散列聚簇,它只有一个表。它通过散列算法求出存储行的物理存储位置,从而快速检索数据。创建散列聚簇时要指定码列的数据类型,数据行的大小及不同码值的个数。如果码值不是平均分布的,就可能有许多行存储到溢出块上,从而会降低查询该表的SQL语句的性能。

散列聚簇被用在总是通过主键查询数据的情况,例如要从表 T 查询数据并且查询语句总是是这样:

select * from T where id = :x;

这时散列聚簇是一个好的选择,因为不需要索引。Oracle 将通过散列算法得到值 :x 所对应的物理地址,从而直接取到数据。不用进行索引扫描,只通过散列值进行一次表访问。

散列聚簇语法示例:

CREATE CLUSTER personnel

( department_number NUMBER )

SIZE 512 HASHKEYS 500

STORAGE (INITIAL 100K NEXT 50K);

CREATE CLUSTER personnel

( home_area_code NUMBER,

home_prefix NUMBER )

HASHKEYS 20

HASH IS MOD(home_area_code + home_prefix, 101);

CREATE CLUSTER personnel

(deptno NUMBER)

SIZE 512 SINGLE TABLE HASHKEYS 500;

【Oracle数据库的聚簇技术】相关文章:

oracle中的聚簇,Oracle数据库的聚簇技术相关推荐

  1. oracle数据库insert into,oracle中insert into用法 oracle中insert如何带条件添加数据?

    oracle insert into 脚本怎么写 INSE INTO BOOK(bookid,name,price) VALUES('100123','oracle ',54); 或者 INSE IN ...

  2. oracle中的guid,在Oracle中使用Guid

    在Oracle中使用Guid 在Oracle中使用Guid 在Oracle中可以用SYS_GUID()来生成一个guid,相当于msSql中的newid(). 在Oracle9i和Oracle 10g ...

  3. oracle中exist什么意思,oracle中not exists 是什么意思 , oracle数据库中exists的作用

    导航:网站首页 > oracle中not exists 是什么意思 , oracle数据库中exists的作用 oracle中not exists 是什么意思 , oracle数据库中exist ...

  4. oracle中删除yuj_oracle如何删除数据库?

    oracle删除数据库的方法:首先确认要删除的数据库,并关闭数据库:然后以restrict方式重新打开数据库,并启动到mount状态:最后使用drop database语句,并删除数据库的管理或跟踪信 ...

  5. oracle中asm磁盘不足,Oracle用户无法访问ASM磁盘组问题

    1. 权限问题引起找不到ASM磁盘组 1.1 确认操作系统用户属主 # 确认属主 Grid Infrastructure Home Owner : grid Primary Group : oinst ...

  6. oracle中dblink怎么用,Oracle中建立了dblink怎么使用

    Oracle应用服务器OS 1.查看数据库的global_name SELECT * FROM GLOBAL_NAME; 2.查看global_name参数是true还是false show para ...

  7. oracle中pga指什么,oracle中pga内存分配原则

    pga_aggregate_target 通常缩写为P_A_T,该参数同时限制全局pga分配和私有工作区内存分配 在oracle9i以及10gr1中,单个sql操作内存使用存在如下限制: 对于串行操作 ...

  8. oracle中的sysdba角色,oracle 以sysdba角色 登陆用户

    1.首先try{ Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 利用Oracle获取一个新的实例. ...

  9. oracle中nowait怎么用,oracle中UPDATE nowait 的使用方法介绍

    oracle中UPDATE nowait 的使用方法介绍 1.UPDATE nowait 应用以下场景:查询某条数据,并对其开启数据库事务.如果查询的当前数据没有加锁,则正确返回结果,并对当前数据加锁 ...

  10. oracle中minus什么意思,Oracle Minus关键字

    Oracle Minus关键字 SQL中的MINUS关键字 SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果 ...

最新文章

  1. SpringBootStarter种类
  2. c语言二维数组代码,C语言之二维数组(示例代码)
  3. 判断输入的字符串是否为回文_刷题之路(九)--判断数字是否回文
  4. sql in转换为join_同一个SQL语句,为啥性能差异咋就这么大呢?(1分钟系列)
  5. 关于linux交换分区的增大
  6. 信息检索:“众筹”专利分析
  7. WinCE下直接启动自己应用程序的方法
  8. fir.im Weekly - 从零开始创建 Android 新项目
  9. Java常见算法(一)
  10. Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
  11. 爬取百度文库内容(Selenium+BeautifulSoup)
  12. Office2013 Visio2013 Project2013零售版与VL版互相转换
  13. pytorch实现 chatbot聊天机器人
  14. 电梯控制系统的实现(代码简洁优质、易懂)
  15. Windows - 关于网络唤醒设置的说明
  16. 花几分钟了解java中的final,何乐而不为呢
  17. 【Vue3+Express实战-3】实现新增课程接口
  18. 网络架构及其演变过程(BS和CS区别)
  19. Ribbon原理解析
  20. 公文识别开发包软件简介

热门文章

  1. 用户自定义协议client/server代码示例
  2. 嵌入式Linux设备驱动程序:编写内核设备驱动程序
  3. 编译器设计-代码优化
  4. YOLOv5目标检测源码重磅发布了!
  5. 未来几年自动驾驶预测(上)
  6. Python案例:使用XPath的爬虫
  7. Android 多语言
  8. INSTALL_FAILED_TEST_ONLY
  9. public static final int REMIN_REQUEST_CODE = 0x911 自己的大致理解
  10. 为经典版eclipse增加web and JavaEE插件