Oracle的簇

l       管理簇的准则

 

簇提供一种可选的存储表的数据的方法.一个簇是由共享相同数据块的一组表组成的. 因为这些表共享公共的列并且经常一起被使用 所以将这些表组合在一起

例如 emp 和dept表共享deptno列,当将emp 和dept 表组成簇,Oracle物理将emp和dept表中有关每个部门的所有行存储到相同的数据块

    因为簇将不同表的相关的行一起存储到相同的数据块所以合理使用簇可以获得两个主要益处:

    1.减少了磁盘I/O并改善了访问簇表的联结所花的时间.

    2.簇键是列或列的组,它们是簇表所共有的创建簇时指定簇键的列 以后在创建增加到簇中的每个表时 指定相同的列 每个簇键值在簇和簇索引中仅存储一次,而不管不同的表有多少行包含这个值

    如在图中,注意对于emp 和dept 表中包含相同值的许多行来说 每个簇键 每个deptno是如何只存储一次的

    创建簇之后,可以在簇中创建表.但是,在将任何行插入到簇表中之前,必须创建簇索引,使用簇不影响在簇表上创建另外的索引,可以照常创建和删除这些索引.

    对于经常单独使用的表来说,不应该使用簇.

    

l       簇和簇表的创建

簇的创建

要想在你的模式中创建簇 必须具有CREATE CLUSTER系统权限,以及打算包含该簇的表空间的限额或具有UNLIMITED TABLESPACE系统权限

     要想在另外用户的模式中创建簇你必须具有CREATE ANY CLUSTER 系统权限 并且该拥有者必须具有打算包含该簇的表空间的限额 或UNLIMITED TABLESPACE 系统权限

     用CREATE CLUSTER 语句创建簇 如下语句创建一个存储emp 和dept 表的按deptno列成簇的 名为emp_dept 的簇

 

    CREATE CLUSTER emp_dept (deptno NUMBER(3))

    PCTUSED 80              --用于插入行的空间百分比

    PCTFREE 5               --用于更新的空间百分比

    SIZE 600                --它是一个估计的平均簇键及其相关的行所需的字节数

    TABLESPACE users        

    STORAGE (INITIAL 200K   --盘区的初始大小

    NEXT 300K               --下一个盘区的大小

    MINEXTENTS 2            --最小的盘区数

    MAXEXTENTS 20           --最大的盘区数(MAXEXTENTS UNLIMITED表示无限制)

    PCTINCREASE 33);        --根据next 大小要根据PCTINCREASE的比例增长

 

 --如果没有指定INDEX 关键词 像本例 就默认地创建一个索引簇 当指定了散列参数

   

创建簇表

用带有CLUSTER 选项的CREATE TABLE 语句在簇中创建表,使用如下语句可以将 emp 和dept 表创建到emp_dept 簇中

 

    CREATE TABLE emp (   

         empno NUMBER(5) PRIMARY KEY,

         ename VARCHAR2(15) NOT NULL,

          ………

         deptno NUMBER(3) REFERENCES dept)

CLUSTER emp_dept (deptno);

 

CREATE TABLE dept (

    deptno NUMBER(3) PRIMARY KEY,

…… )

    CLUSTER emp_dept (deptno);

 

可以在CREATE TABLE 语句中为簇表指定模式簇表可以在与包含该簇的模式所不同的模式中 列的名称也不需要匹配 但它们的结构必须匹配

 

创建簇索引

要创建簇索引 必须满足如下条件之一:

1.      你的模式包含簇.

2.      你具有CREATE ANY INDEX 系统权限

在任一情况之下 你还必须或者具有打算用来包含该簇索引的表空间的限额 或者具有UNLIMITED TABLESPACE 系统权限

在任何行能被插入到任何簇表之前 必须先创建簇索引 如下语句为emp_dept 簇创建一个簇索引

 

    CREATE INDEX emp_dept_index

    ON CLUSTER emp_dept          --在簇emp_dept上创建索引 

    TABLESPACE users

    STORAGE (INITIAL 50K

    NEXT 50K

    MINEXTENTS 2

    MAXEXTENTS 10

    PCTINCREASE 33)

    PCTFREE 5;

 

l       更 改 簇

要想更改簇 你的模式必须包含该簇 或你必须具有ALTER ANY CLUSTER系统权限,可以更改现存簇的如下设置值

     1.物理属性(PCTFREE PCTUSED INITRANS MAXTRANS和存储特征)

     2.为了存储簇键值的所有行所需空间的平均值 SIZE

     3.默认的并行度

当更改簇的数据块空间使用参数PCTFREE 和PCTUSED或簇的大小参数SIZE时,新的设置值适用于该簇所使用的所有数据块 包括已经分配给该簇的和以后分配给该簇的数据块 需要的时候 并不是立即地 重新组织已经给表分配的数据块

当更改簇的事务项设置值INITRANS和MAXTRANS时 INITRANS的新设置值仅适用于以后分配给该簇的数据块 而MAXTRANS 的新设置值适用于该簇的所有数据块已经分配的和以后分配的数据块,不能更改存储参数INITIAL 和MINEXTENTS其他存储参数的所有新设置值仅仅影响以后分配给簇的盘区

   

 用ALTER CLUSTER 语句来更改簇 如下语句更改emp_dept 簇

    ALTER CLUSTER emp_dept

    PCTFREE 30

    PCTUSED 60;

 

更改簇表

可以用ALTER TABLE 语句来更改簇表.但是,如在ALTER TABLE 语句中给簇表设置任何数据块空间参数 事务项参数或存储参数 都将产生一条错误消息 ORA_01771,illegal option for a clustered table 对于簇表而言违法选项Oracle 将簇的参数用于所有簇表 因此 对于簇表而言 可以用ALTER TABLE 语句所做的事 仅仅是增加或修改列删除非簇键列 或是增加 删除 启用或停用完整性约束或触发器

 

更改簇索引

更改簇索引与更改其他索引一样

注意:在估计簇索引的大小时 要记住索引是建立在每个簇键上的而不是建立在实际的行上的.因此,每个键仅在索引中出现一次

 

l       删除簇

 

如果不再需要簇中的表 则可以将簇删除,删除簇时也将簇中的表及其对应的簇索引删除,属于簇的数据段的盘区和属于簇索引的索引段的盘区都将返还给它们所处的表空间,并可被表空间中的其他段使用,为了删除不包含表的簇及其簇索引使用DROP CLUSTER语句

 

DROP CLUSTER emp_dept; --删除名为emp_dept 的空簇

DROP CLUSTER emp_dept INCLUDING TABLES; --删除簇,并删除簇表在后面加INCLUDING TABLES选项

    DROP CLUSTER emp_dept INCLUDING TABLES CASCADE CONSTRAINTS; --删除簇和簇表并删除外键约束

 

删除簇表

    要想删除一个簇你的模式必须包含该簇,或你必须具有DROP ANY CLUSTER系统权限,删除一个包含表的簇不需要另外的权限,甚至于簇的拥有者不拥有簇表时也不需要另外的权限

    簇表可以被单独地删除而不影响表的簇其他簇表或簇索引 删除簇表就像删除非簇表一样用DROP TABL语句    

注意:当从簇中删除单个表时Oracle单独地删除该表的每一行 为了最有效地删除整个簇即删除包含所有表的簇 使用带有INCLUDING TABLES 选项的DROP CLUSTER语句,仅当你希望保留簇的剩余部分时 才从簇中删除单独的表使用DROP TABLE 语句

                            

l       管理散列簇

 

何时使用散列簇

为了改善数据检索的性能,一种可选的方法是将表存储到一个散列簇中,散列簇是一种为非簇表提供索引或索引簇的可选方法.对于索引表或索引簇Oracle使用存储在单独的索引中的键值来定位表中的行,为了使用散列方法,就要创建散列簇并将表装入其中. Oracle物理地将表中的行存储到散列簇,并根据散列函数的结果来检索它们.

Oracle使用散列函数来产生被称为散列值的,基于特殊的簇键值的数字值的分布.散列簇的键类似于索引簇的键,可以是单个列或组合键(多列键)为了在散列簇中查找或存储行,Oracle将散列函数应用到行的簇键值.产生的散列值对应于簇中的数值块,然后Oracle 根据发布的语句在这些数据块上读或写.

    为了在簇表或簇中查找或存储行最少要执行两个I/O(经常更多)

l            一个或多个I/O,在索引中查找或存储键值.

l            另一个I/O,在表或簇中读或写行.

    相反,使用散列函数在散列簇中定位行时不需要I/O.其结果是,在散列簇中读或写行需要至少1个I/O操作

 

散列方法有用的情况

在具有如下条件时 散列方法有用:

l          大多数查询是簇键上的相等查询

    SELECT ... WHERE cluster_key = ...;

    此时,相等条件中的簇键被散列并且 通常读一次就能找到对应的散列键.相对照,对于索引表,必须首先在索引中找到其键值,通常要读几次,然后再从表中读行(另一次读)

l          散列簇中的表的大小基本是不变的,因此,可以决定簇中表的行数及其所需的空间数量,如果散列簇中的表需要比初始分配给该簇的更多的空间则性能肯定会降低 因为需要溢出数据块了

 

散列方法无益的情况

l          在如下情况时,散列方法是无益的,表上的大多数查询是在簇键值的一个范围中检索行,例如,在全表扫描或类似下面的查询中,散列函数不能被用于决定特定的散列键的位置,为了找到查询的行,必须做全表扫描.

SELECT . . . WHERE cluster_key < . . . ;

用索引的话,键值在索引中被排序,因此,就能用相对少的 I/O找到满足查询中的WHERE子句的簇键值

l          表不是静止的,而是经常增长,如果表的增长没有尽头,在表(及其簇)的生命期中所需的空间就不能预先决定了

l          应用经常对表进行全表的扫描,并且很少填充表在此情况下,用散列方法的全表扫描需要更长时间

l          不能提供散列簇最终需要的预分配空间

 

l     创建散列簇

 

    CREATE CLUSTER语句来创建散列簇 但要指定HASHKEYS子句 如下语句创建存储trial 表的,按trialno 列成簇的,名为trial_cluster的簇另一个语句在该簇中创建表

   

CREATE CLUSTER trial_cluster (trialno NUMBER(5,0))

    PCTUSED 80

    PCTFREE 5

    TABLESPACE users

    STORAGE (INITIAL 250K NEXT 50K MINEXTENTS 1 MAXEXTENTS 3 PCTINCREASE 0)

HASH IS trialno—默认是用内部散列函数 如簇键是唯一的标识就将该簇键指定为散列值.

HASHKEYS 150; --指定和限制该簇所使用的散列函数可以产生的唯一的散列值的数量

 

CREATE TABLE trial (

    trialno NUMBER(5,0) PRIMARY KEY,

    ...)

    CLUSTER trial_cluster (trialno);

    

与索引簇相似,散列簇的键可以是单个列或组合键(多列键)本例中是单个列 .

在散列簇上不能创建簇索引 并且不需要在散列簇键上创建索引.

 

创建单个表散列簇

你还可以创建单个表散列簇.它提供了对表中的行的快速访问,当然,这个表必须是散列簇中仅有表.本质上说,必须在散列键和数据行之间存在一对一的映射,如下语句创建一个簇键为variety的名为peanut 单个表散列簇

 

CREATE CLUSTER peanut (variety NUMBER)

SIZE 512 SINGLE TABLE HASHKEYS 500;

                                               

Oracle将HASHKEY值舍入成最接近的素数 所以这个簇具有最大503个散列键值,每个有512字节

注意SINGLE TABLE选项仅对散列簇有效 还必须指定HASHKEYS.

 

控制散列簇的空间使用

创建散列簇时,重要的事是:正确地选择簇键和设置HASH IS SIZE 和HASHKEYS参数,以便性能和空间使用是最优的.下面的准则描述如何设置这些参数

1.选择键

选择正确的簇键取决于针对簇表所发布的最常用的查询的类型.例如,考虑散列簇中的emp表,如果查询常常是按职员号码来选择行则empno 列就应该是簇键 如果查询常常是按部门号码来选择行 则deptno 列就应该是簇键 对于包含单个表的散列簇 簇键典

型地是其所包含的表的整个主键

散列簇的键 就像索引簇的键 可以是单个列或组合键(多列键).具有组合键的散列簇必须使用Oracle 的内部散列函数

2.设置HASH IS

仅仅当簇键是NUMBER 数据类型的,包含均匀分布的整数的,单个的列时,才指定HASH IS 参数.如果上述条件成立,你就可以在簇中分配行,以便每个唯一簇键值会无冲突(两个簇键值具有相同的散列值)地分配到唯一的散列值.如果上述条件不成立,就忽略这个选项,以便使用内部散列函数.

3.设置SIZE

应将SIZE 设置成为保持任何给定散列键的所有行所需的空间的平均数 因此,为了合理地决定SIZE    必须注意数据的特征

1.如果散列簇仅包含单个表 并且该表中的行的散列键值是唯一的(一个值一行),就可以将SIZE 设置成簇中的平均的行大小

2.如果散列簇包含多个表,就可以将SIZE 值设置成,为保持与有代表性的散列值相关的所有行所需的空间的平均数.

进一步,当决定了一个SIZE的(初步)值时,考虑下面的情况 如果SIZE 值小(可以给每个数据块赋予 4个以上的散列键) 就可在CREATE CLUSTER 语句中使用这个SIZE值.然而,如果size值大,(只能给每个数据赋予4个以下散列键)那么,就还应该考虑所期望的冲突频率,以及是否数据检索的性能,或空间使用的效率更重要

3.如果散列簇不使用内部散列函数(如果指定了HASH IS),并期望很少或没有冲突就可以使用SIZE 的初始值.无冲突,并且尽可能有效地使用空间.

4.如果预料到插入时会经常冲突,则为了存储行而分配溢出数据块的可能性就很高.为了减少溢出数据块的可能性,并在频繁冲突时使性能最好,就应按下图所示调整SIZE.

每个数据块的可用空间/计算值SIZE 的设置值

Size的设置值

1

SIZE

2  

        SIZE+15%

3 

        SIZE+12%

4

SIZE+8%

>4

        SIZE

估计过高的SIZE 值增加簇中未使用空间的数量 如果空间的效率比数据检索的性能更重要,就忽略上面的调整并使用SIZE 的初始值

4.设置HASHKEYS

为了散列簇中的行的最大分布 Oracle 将HASHKEYS 值舍入成最接近的素数

下面的例子显示如何正确地选择簇键,并设置HASH IS,SIZE 和HASHKEYS 参数.在所有例子中,假设数据块大小是2K,并且平均来说,每个数据块的可用数据空间(数据块大小减系统开销)是1950字节

 

1:你打算将emp表装载进一个散列簇.大多数查询按职员号码检索职员记录,你估计在任何给定时间emp表中的最大行数是10000并且平均行大小是55个字节

这时,应将empno 作为簇键,因为该列包含唯一的整数,所以,可以不使用内部散列函数size可被设置成平均行大小55字节,注意,给每个数据块赋予了34个散列键. HASHKEYS可被设置成表中的行数 10000.Oracle 将该值尽似成最接近的素数10007

 

    CREATE CLUSTER emp_cluster (empno

    NUMBER)

    ……

    SIZE 55

    HASH IS empno HASHKEYS 10000;

 

2条件与上例相似.然而此时,通常按部门号码检索行.常常是有1000个部门每个部门平均有10个职员.部门号码按10递增(0,10,20,30,……)

这时,应将deptno 作为簇键,因为该列包含均匀分布的整数,所以可以不使用内部散

列函数SIZE的初始值(为保持每个部门的所有行所需的空间的平均数)是55字节*10

   550                SIZE                                3

550字节,使用这个SIZE值,仅仅可以给每个数据块赋予3个散列键,如果预料到某些冲突,并且希望数据检索的性能最好,稍微地更改所估计的SIZE 值,以预防需要溢出数据块而带来的冲突.调整10%的SIZE,到620字节就为可能冲突的行提供了更多的空间.

HASHKEYS可被设置成唯一的部门号码的个数 1000.Oracle 将该值舍入成最接近的素数:1009.

 

    CREATE CLUSTER emp_cluster (deptno NUMBER)

    ……

    SIZE 620

    HASH IS deptno HASHKEYS 1000;

 

估计散列簇所需的空间大小

就像索引簇,估计散列簇中数据所需的存储量很重要.

依据SIZE和HASHKEYS的设置值Oracle保证最初分配的空间足够存储散列表,如果对存储参数INITIAL,NEXT和MINEXTENTS的设置值不能满足簇表的大小,则分配增加的(附加的)盘区直到至少满足 SIZE*HASHKEYS.例如,假设数据块大小是2K,每个数据块可用的数据空间大约是1900字节(数据块大小减系统开销),并且,在CREATE CLUSTER语句中按如下方式指定了STORAGE 和HASH 参数:

 

    STORAGE (INITIAL 100K

    NEXT 150K

    MINEXTENTS 1

    PCTINCREASE 0)

    SIZE 1500

    HASHKEYS 100

 

本例中仅仅可以给每个数据块赋予一个散列键,因此,该散列簇所需的初始空间至少是100*2K 或200K对存储参数的设置值不能满足这个需求.因此,分配给该散列簇一个100K的初始盘区和一个150k的第2个盘区.

可选地 假设HASH 参数被指定为:

    SIZE 500 HASHKEYS 100

这时,就可以给每个数据块赋予三个散列键了.因此,该散列簇所需的初始空间至少是34*2K 或68K.存储参数的最初设置值满足了这个需求(分配给该散列簇100K 的初始盘区).

 

l     更改散列簇

 

可以用ALTER CLUSTER 语句来更改散列簇

 

    ALTER CLUSTER emp_dept . . . ;

更改散列簇的含意与”更改簇”中描述的更改索引簇一样在但是,在ALTER CLUSTER语句中不能指定SIZE HASHKEYS和HASH IS参数.为了更改这些参数,必须重建簇,然后从原始簇中复制数据.

 

l     删除散列簇

 

可以用DROP CLUSTER 语句来删除散列簇

   

DROP CLUSTER emp_dept;

 

DROP TABLE 语句来删除散列簇中的表 删除散列簇和删除散列簇中的表的含意与删除索引簇一样

 

查看有关散列簇的信息

视图 

说明

DBA_CLUSTER_HASH_EXPRESSIONS

这些视图列出用于散列簇的散列函数

ALL_CLUSTER_HASH_EXPRESSIONS

 

USER_CLUSTER_HASH_EXPRESSIONS

 

 

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值