表类型
- 普通(按堆组织的)表:数据以无序集合(堆)方式存储
- 分区表:数据被分为多个更小、更易管理的片段
- 按索引组织的表 (IOT):数据(包括非键值)按顺序存储在 B 树索引结构中
- 聚簇表:一个或多个表中的相关数据存储在一起
分区
- 概览
- 是“超大型”表或索引的片段
- 存储在自己的段中
- 用于提高性能和易管理性
- 特性
- 相同的逻辑属性:列、约束条件和索引均相同
- 不同的物理属性:存储在不同的表空间中
- 对应用程序是透明的
- 多种分区方法
- 范围分区:根据列值的逻辑范围映射行
- 散列分区:根据分区键的散列值映射行
-
CREATE TABLE regions
(region_id NUMBER, region_name VARCHAR2 (25))
PARTITION BY HASH (region_id)
PARTITIONS 4 STORE IN (tbs1, tbs2, tbs3, tbs4); - 列表分区:根据 DBA 提供的离散值列表映射行
- 范围-散列分区:使用范围方法映射行,然后在每个范围分区内创建散列子分区
- 范围-列表分区:先根据某一范围的值映射行,然后根据离散值映射行
- 创建分区
- 管理-->表-->创建 -->分区选项卡
- 分区维护
- 管理-->表-->编辑-->分区选项卡
IOT
- 按索引组织的表和堆表
- 与堆表相比较,IOT
- 可以基于键更快地访问表数据
- 逻辑行ID 通过以下两种方法实现对IOT 中各行的可能的最快访问
- 物理推测法,访问时间相当于对物理行ID 的访问时间
- 不推测(或在推测错误后)访问,这将对IOT 执行主键访问
- 不会复制主键值的存储区
- 要求的存储空间更少
- 使用二级索引和逻辑行 ID
- 可用性更高,因为表重组时不会使二级索引失效
- IOT 有以下限制
- 必须有一个不是 DEFERRABLE 的主键
- 不能聚簇
- 不能使用组合分区
- 不能包含类型为 ROWID 或 LONG 的列
- 创建按索引组织的表
-
CREATE TABLE country
( country_id CHAR(2)
CONSTRAINT country_id_nn NOT NULL,
country_name VARCHAR2(40),
currency_name VARCHAR2(25),
currency_symbol VARCHAR2(3),
map BLOB,
flag BLOB,
CONSTRAINT country_c_id_pk
PRIMARY KEY (country_id))
ORGANIZATION INDEX
TABLESPACE indx
PCTTHRESHOLD 20
OVERFLOW TABLESPACE users; --设置代表块大小
百分比的阈值,指定将行转到溢出区中
簇
- 概览
- 簇是由共享相同数据块的一个或多个表构成的组
- 由于聚簇表是相互联接的,因此减少了磁盘I/O 操作,加快了访问时间。
- 对于键值相同的所有行,每个簇键值只存储一次;因此它使用的存储空间较少。
- 对聚簇表执行全表扫描时,速度通常要比非聚簇表慢
- 类型
- 索引簇
- 索引簇使用索引(称为簇索引)来维护簇中的数据。要存储、访问或维护索引簇中的数据,必须有簇索引。
- 簇索引可存储空键值。簇索引中每个键值只有一个条目
- 散列簇
- 散列簇使用散列算法(用户定义的或系统生成的)来计算某行的位置
- 已排序的散列簇
- 概览
- 用于存储按非主键列排序的数据
- 簇键值都已经过散列处理
- 对应于特定簇键值的行将根据排序键进行排序
- 用于保证行顺序可按查询返回,而无需对数据进行排序
- 行按特定簇键值的升序或降序返回
- 按升序检索行时,ORDER BY 子句不是必需的
- 示例
- 第一步是创建已排序的散列簇
- 第二步,创建实际的表,同时使用CLUSTER 子句指定已排序的散列簇的链接。
-
CREATE CLUSTER calls_cluster
( origin_number NUMBER
, call_timestamp NUMBER SORT
, call_duration NUMBER SORT)
HASHKEYS 10000
SINGLE TABLE HASH IS origin_number
SIZE 50;
CREATE TABLE calls
( origin_number NUMBER
, call_timestamp NUMBER
, call_duration NUMBER
, other_info VARCHAR2(30))
CLUSTER calls_cluster(
origin_number,call_timestamp,call_duration
); - 基本体系结构
- 簇的应用场合
- 何时不使用簇
- 应用程序只是偶尔使用联接表的查询或需要频繁修改其公用列值。
- 经常只对其中一个聚簇表执行全表扫描。
- 一个簇键值的所有行的数据超过了一个或两个Oracle 块
- 何时不使用散列簇
- 如果表不断增长或应用程序需要频繁修改簇键值
- 如果应用程序经常执行全表扫描,必须为散列簇分配大量的空间以满足表增长需要
DBA 任务
- 包括
- 估计新表的大小
- 分析增长趋势
- 管理优化程序统计信息
- 联机重组方案对象
- 估计资源使用量
- 创建表-->估计表大小-->估计行数-->估计行大小
- 分析增长趋势
- 表-->编辑-->段
- 管理优化程序统计信息
- 表-->管理优化程序统计信息
- 联机重组方案对象
- 修改方案对象(例如表或索引)的逻辑结构或物理结构
- 对用户是透明的
- 空间要求
- 手动联机重组的基本步骤
- 验证表是否是联机重组的候选对象。DBMS_REDEFINITION.CAN_REDEF_TABLE
- 创建一个临时表。CREATE TABLE
- 启动重新定义过程。DBMS_REDEFINITION.START_REDEF_TABLE
- 复制相关对象。DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS 和DBMS_REDEFINITION.CONS_ORIG_PARAMS
- 查询 DBA_REDEFINITION_ERRORS 视图,检查是否有错误。
-
SELECT object_name, base_table_name, ddl_txt
FROM DBA_REDEFINITION_ERRORS; - 同步临时表 DBMS_REDEFINITION.SYNC_INTERIM_TABLE
- 完成重新定义 DBMS_REDEFINITION.FINISH_REDEF_TABLE
- 删除临时表 DROP TABLE … PURGE