Oracle索引聚簇表的数据加载中两个组成部分

数据库 Oracle
本文涉及到的有Oracle索引聚簇表的工作原理,以及Oracle索引聚簇表的数据加载在创建的过程中,所要用到的SQL语句的相关内容的介绍。

以下的内容主要是介绍Oracle索引聚簇表的数据加载的两个主要组成部分,其中包括对索引聚簇表的工作原理,以及Oracle索引聚簇表的数据加载创建过程的相关内容的描述,以下是文章内容的详细介绍。

一:首先介绍一下索引聚簇表的工作原理

聚簇是指:如果一组表有一些共同的列,则将这样一组表存储在相同的数据库块中;聚簇还表示把相关的数据存储在同一个块上。利用聚簇,一个块可能包含多个表的数据。概念上就是如果两个或多个表经常做链接操作,那么可以把需要的数据预先存储在一起。聚簇还可以用于单个表,可以按某个列将数据分组存储。

更加简单的说,比如说,EMP表和DEPT表,这两个表存储在不同的segment中,甚至有可能存储在不同的TABLESPACE中,因此,他们的数据一定不会在同一个BLOCK里。而我们有会经常对这两个表做关联查询,比如说:select * from emp,dept where emp.deptno = dept.deptno .仔细想想,查询主要是对BLOCK的操作,查询的BLOCK越多,系统IO就消耗越大。

如果我把这两个表的数据聚集在少量的BLOCK里,查询效率一定会提高不少。比如我现在将值deptno=10的所有员工抽取出来,并且把对应的部门信息也存储在这个BLOCK里(如果存不下了,可以为原来的块串联另外的块)。这就是索引聚簇表的工作原理。

二:创建过程

索引聚簇表是基于一个索引聚簇(index cluster)创建的。里面记录的是各个聚簇键。聚簇键和我们用得做多的索引键不一样,索引键指向的是一行数据,聚簇键指向的是一个Oracle BLOCK。我们可以先通过以下命令创建一个Oracle索引簇。

 

  1. SQL> conn scott/tiger 

已连接。

 

  1. SQL> desc dept 

名称 是否为空? 类型

 

  1. DEPTNO NOT NULL NUMBER(2)  
  2. DNAME VARCHAR2(14)  
  3. LOC VARCHAR2(13)  
  4. SQL> create cluster emp_dept_cluster  
  5. 2 ( deptno number(2) )  
  6. 3 size 1024  
  7. 4 /  

 

簇已创建。

这个名字可以用户定义,不一定叫deptno,数据类型必须和需要使用这个聚簇的数据类型一致NUMBER(2)。在这里最关键的一个参数是size。这个选项原来告诉Oracle:我们希望与每个聚簇键值关联大约1024字节的数据(1024对于一般的表一条数据没问题),Oracle会在用这个数据库块上设置来计算每个块最 多能放下多少个聚簇键。

假设块大小为8KB,Oracle会在每个数据库块上放上最多7个聚簇键,也就是说,对应部门10、20、30、40、50、60和70的数据会放在一个块上,一旦插入部门80,就会使用一个新块。存放的数据是和插入顺序相关的。

因 此,SIZE测试控制着每块上聚簇键的最大个数。这是对聚簇空间利用率影响最大的因素。如果把这个SIZE设置得太高,那么每个块上的键就会很少(单位BLOCK可以存的聚簇键就少了),我们会不必要地使用更多的空间。如果设置得太低,又会导致数据过分串链(一个聚簇键不够存放一条数据),这又与聚簇本来的目的不符,因为聚簇原本是为了把所有相关数据都存储在一个块上。

向聚簇中放数据之前,需要先对聚簇建立Oracle索引。可以现在就在聚簇中创建表,但是由于我们想同时创建和填充表,而有数据之前必须有一个聚簇索引,所以我们先来建立聚簇索引。

聚簇索引的任务是拿到一个聚簇键值,然后返回包含这个键的块的块地址。实际上这是一个主键,其中每个聚簇键值指向 聚簇本身中的一个块。因此,我们请求部门10的数据时,Oracle会读取聚簇键,确定相应的块地址,然后读取数据。聚簇键索引如下创建:

 

  1. SQL> create index emp_dept_cluster_idx  
  2. 2 on cluster emp_dept_cluster  
  3. 3 /  

 

索引已创建。

现在可以创建表了:

 

  1. SQL> conn segment_study/liugao 

已连接。

 

  1. SQL> create table dept  
  2. 2 ( deptno number(2) primary key, 3 dname varchar2(14),  
  3. 4 loc varchar2(13)  
  4. 5 )  
  5. 6 cluster emp_dept_cluster(deptno)  
  6. 7 /  

 

表已创建。

 

  1. SQL> create table emp  
  2. 2 ( empno number primary key, 3 ename varchar2(10),
     4 job varchar2(9), 5 mgr number, 6 hiredate date,
     7 sal number, 8 comm number,  
  3. 9 deptno number(2) constraint emp_fk references
     dept(deptno)  
  4. 10 )  
  5. 11 cluster emp_dept_cluster(deptno)  
  6. 12 /  

 

表已创建。

我们可以通过一下SQL语句查看创建:

 

  1. SQL> select cluster_name, table_name  
  2. 2 from user_tables  
  3. 3 where cluster_name is not null  
  4. 4 order by 1;  
  5. CLUSTER_NAME TABLE_NAME  
  6. EMP_DEPT_CLUSTER DEPT  
  7. EMP_DEPT_CLUSTER EMP  

 

现在,聚簇,聚簇索引,聚簇Oracle索引表都已经建立完成。

【编辑推荐】

  1. 在Oracle 处理日期中对日期语言的设置
  2. 在Oracle 数据类型中如何使用dump函数
  3. Oracle reports工具的使用
  4. Oracle DBA速成法的潜规则
  5. Oracle Names服务的实际操作
责任编辑:佚名 来源: 互联网
相关推荐

2010-04-12 16:50:47

Oracle索引聚簇表

2010-04-12 17:00:37

Oracle索引聚簇表

2010-04-21 13:43:31

Oracle聚簇索引

2023-07-04 15:54:39

数据测试数据质量开发

2024-05-24 09:28:22

2010-07-14 15:04:53

SQL Sever索引

2021-12-12 08:35:13

数据策略数据数据分析

2009-07-07 17:39:26

JSP系统

2010-09-27 11:24:37

SQL聚簇索引

2023-06-12 08:38:23

聚簇索引排序非聚簇索引

2023-04-17 10:47:49

MySQL聚簇索引

2009-09-08 09:37:03

LINQ重要组成部分

2019-08-15 11:38:31

云计算数据管理IT

2018-10-25 15:03:13

2009-06-04 07:55:08

Struts框架简介Struts

2022-09-08 08:44:16

数字化转型技术

2010-04-06 18:04:09

Oracle数据库

2010-06-30 10:02:05

UML建模技术

2009-07-28 15:28:35

ASP.NET AJA

2010-06-29 19:31:48

UML建模技术
点赞
收藏

51CTO技术栈公众号