很多初学者,在接触Oracle数据库后,都会很疑惑Oracle聚簇索引是什么,如何使用Oracle聚簇索引,Oracle散列聚簇又与Oracle聚簇索引有什么关系。本文针对这3个问题结合相关资料,给出了点看法。

1. 什么是聚簇

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

2. 使用 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表中插入数据行之前,必须建立一个Oracle聚簇索引:

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,都从这两个表中附加列。

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

3. 散列聚簇

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

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

select * from T where id = :x;

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

【编辑推荐】

【责任编辑:王婧瑶 TEL:(010)68476606】

点赞 0

oracle索引是不是聚簇索引,Oracle聚簇索引的使用方式相关推荐

  1. oracle 索引回表,oracle 索引简单总结

    建立索引时先进行排序,逻辑上分为Root(根块),Branch(茎块),leaf(叶子块).leaf中存在索引列的值.长度.和所在rowid,茎块存了指向具体茎块的指针,root块同理.这是逻辑上的划 ...

  2. oracle 索引-1无效,oracle 索引失效原因及解決方法

    一.以下的方法會引起索引失效 ‍1,<> 2,單獨的>, 3,like "%_" 百分號在前. 4,表沒分析. 5,單獨引用復合索引里非第一位置的索引列. 6,字 ...

  3. oracle 索引命中条件,Oracle索引命中与扫描规律总结 | 学步园

    索引扫描类型(该表取自网络文章): index unique scan(索引唯一扫描)通过唯一索引查找一个数值经常返回单个ROWID.如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导 ...

  4. oracle索引重建并行,oracle重建索引(一)

    重建索引有多种方式,如drop and re-create.rebuild.rebuild online等.下面简单比较这几种方式异同以及优缺点: 首先建立测试表及数据: SQL> CREATE ...

  5. oracle索引未使用,oracle

    我正在使用Oracle 12C,我有以下代码 SELECT d.id, 'Status' "ImportStatus", p.importid "ImportID&quo ...

  6. oracle索引图文解析,oracle索引介绍(图文详解)

    针对数据库查询而言,数据库索引是一个必选择项,但针对如今的各种各样大中型数据库查询而言,数据库索引能够 进一步提高数据库查询的特性,以致于它变成了数据库查询不能缺乏的一部分. 数据库索引归类: 逻辑性 ...

  7. oracle索引使用例子,Oracle中利用函数索引处理数据倾斜案例

    关于B-Tree.Bitmap.函数索引的相关内容请参考另一篇博文: Oracle中B-Tree.Bitmap和函数索引使用案例总结 通常来说,索引选取的数据列最好为分散度高.选择性好.从索引树结构的 ...

  8. oracle索引未使用,oracle - 未使用主键索引 - SO中文参考 - www.soinside.com

    首先,您应该考虑索引并不总是一个好主意. 如果Oracle必须从表中读取大多数数据,它将使用FULL TABLE SCAN,因为它比首先读取索引块然后再读取数据块更快.涉及太多的IO操作. 现在,回到 ...

  9. oracle 索引 序列,【Oracle】表、视图、序列、索引

    表(数据类型.约束).修改表结构 表的创建:create table 表名(字段名 数据类型 [约束]): 表的删除:drop table 表名: oracle表包括: 表名.字段.数据类型.[约束] ...

  10. oracle 索引 lob 迁移,Oracle 11g到19c迁移TB级lob表的酸爽

    从Oracle数据库官方服务支持生命周期表我们可以清晰看到Oracle11g已过主支持生命周期,2020年后不再支持,取而代之的是12C及以上版本. 基于这个背景,大部分的客户开始了新一轮的数据库升级 ...

最新文章

  1. Nginx防盗链与访问控制
  2. (五)门级电路低功耗设计优化
  3. ccf命令行选项只能用c实现_CCF-201403-3-命令行选项
  4. 如何用vbs编写一个游戏_如何编写一个 SkyWalking 插件
  5. json_encode 注意点
  6. html 5 本地数据库(二)-- Web Sql Database核心方法openDatabase、transaction、executeSql 详解
  7. 三十二个vbs整蛊代码,好玩到没朋友
  8. 基于Labview的小波去噪
  9. C语言 AES算法 加密解密
  10. 特斯拉进化论:舍命狂奔背后的生存哲学
  11. Datawhale数据分析学习——学术前沿趋势分析 任务1
  12. illustrator插件--常用功能开发--色标生成器--js脚本开发--AI插件
  13. 【Linux】 常用命令
  14. Windows下代码比较工具Meld diff 以及 VScode配置,解决“Meld Diff Error: Error running diff command! StdErr: ‘meld‘ �
  15. Python——解一元二次方程
  16. 推荐几本经典计算机书籍
  17. 怎样设定绩效考核指标
  18. warning C4819 的解决方法
  19. gitlab仓储搭建
  20. 主流计算虚拟化技术/华为的产品介绍

热门文章

  1. 大学毕业10年内真的可以年入百万吗?是过于自信还是真的能做到?
  2. 最新大猿人中控充值系统 免授权学习版 支持公众号H5、分销等功能
  3. WKT与GeoJson
  4. AEJoy —— 表达式之模拟超越与反弹(四)【JS】
  5. Linux-更改系统主机名(hostname)的方法
  6. C语言isdigit函数介绍、示例和实现
  7. Git远程仓库回退到指定版本
  8. 基于 MVC 模型框架之:SpringMVC
  9. C# .Net WinForm 进度条ProgressBar 用法 实例
  10. 线段树(区间修改 + 根节点查询):Just a Hook