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
|
|
分享到:
相关推荐
Oracle 簇是一种数据库优化技术,它允许将一组相关联的表存储在同一组数据块中,从而提高了查询性能,特别是当这些表经常一起被访问时。簇中的表称为簇表,它们共享相同的物理存储,减少了磁盘I/O,提升了数据访问...
大家通常oracle中的cluster的理解是不准确的,经常和sql server中的cluster index混淆。Cluster是存储一组table的一种方法,这些table共享同一数据块中的某些相同column,并把不同table在这一共享column上值相同的...
### Oracle中聚簇表的使用 #### 聚簇表的概念 在Oracle数据库中,聚簇表(Cluster Table)是一种特殊的数据存储结构,它允许多个表通过共享某些相同的列值来存储在同一个数据块内。这种特性使得相关联的数据能够在...
Oracle数据库是世界上最广泛使用的数据库管理系统之一,以其高效、稳定和强大的功能著称。本文将深入探讨Oracle的一些核心知识点,包括数据导入导出、系统性能优化、动态SQL、数据安全以及数据库的架构和管理。 1. ...
表和表簇是 Oracle 数据库中的基本结构,包括表、索引、表簇等。表和表簇是 Oracle 数据库的基本组成部分,它们共同组成了 Oracle 数据库的逻辑结构。 索引和索引组织表 索引和索引组织表是 Oracle 数据库中的重要...
12. **数据库架构调整**:包括表空间管理、数据分布策略(如表分区、簇、位图索引等)、以及数据库块大小的选择,都会影响性能。 13. **SQL优化工具**:Oracle提供了一些内置工具,如SQL Tuning Advisor和Automatic...
6. **段**(Segments):段是由一组连续的数据库块组成的,它是Oracle存储对象(如表、索引、簇等)的基本单位。每个对象都有自己的段。 7. **区**(Extents):区是段内的逻辑分区,由一组连续的数据块组成。当...
聚簇管理是Oracle数据库管理系统的重要组件,用于管理聚簇的创建、修改、删除等操作。通过dba_clusters视图,可以查询聚簇的基本信息,包括聚簇名称、聚簇类型、创建日期等信息。 快照管理 快照是Oracle数据库中的...
“Oracle_11gR2_概念_第2章_表和表簇.pdf”讲解了Oracle中数据存储的主要方式——表和表簇。表是数据的基本组织单元,包含一系列列和行,而表簇则是一种优化数据存储的方式,允许将相关的表物理地存储在一起,提高...
9. **模式管理与数据库对象**:理解模式与账户的关系,创建和管理表、索引,以及其他数据库对象,如聚簇、序列、同义词和快照。 10. **归档模式与恢复**:了解归档与非归档模式,基于事务日志的恢复机制,物理备份...
- **簇 (Cluster)**:一组表共享同一组数据块,适用于存储相关表的数据。 - **维 (DIMENSION)**:在OLAP环境中定义维度属性。 - **Java对象**:支持在数据库中存储和执行Java代码。 - **实体视图 (Materialized ...
4. **内部存储结构**:Oracle提供了多种存储机制,如分区、索引和簇,以优化数据的访问和存储。分区允许大型表按逻辑划分,提高查询效率。索引则提供了快速查找数据的方法,包括簇索引、表索引和位图索引。簇将相关...
Oracle数据库系统基于SQL标准,提供了丰富的数据类型,如数值、字符串、日期、二进制等,以及复杂的数据结构,如表、视图、索引、分区和簇。其强大的事务处理能力保证了数据的一致性和完整性。Oracle还支持分布式...
紧接着,对表的基本概念、表簇(包括索引化表簇和哈希簇)进行了详细介绍,还包括表的示例创建与修改语句、Oracle数据类型、完整性约束、对象表、临时表、外部表和表存储等内容。 第3章索引和索引组织表,主要介绍...
- **表和表簇**:表是数据的基本存储单元,可以单表存储或通过表簇进行物理组织,提高I/O效率。 - **索引**:索引是加快查询速度的关键工具,分为B树索引、位图索引、函数索引等。B树索引适合全值匹配,位图索引...
- 了解表、索引、分区和簇的创建与管理。 - 探讨数据库实例和进程模型,理解数据库的启动、运行和关闭过程。 4. **数据库性能优化**: - 学习如何通过索引优化、查询优化器和统计信息提升查询性能。 - 了解SQL ...
"第六讲 Oracle其他数据库对象"可能包括了如簇、物质化视图、同义词等扩展的对象类型,以及如何利用它们优化数据库设计和性能。 "第七讲 PLSQL编程"分为两部分,详细讲解了PL/SQL编程语言,包括流程控制、异常处理...
簇(Cluster)是Oracle中用于物理存储表数据的一种结构,它允许将经常一起使用的表数据存储在一起。簇可以将相关行存储在相同的数据块中,从而提高多表关联查询的性能。在Oracle数据库设计中,簇是提高性能的一种...