数据库表相关知识详解
立即解锁
发布时间: 2025-08-23 01:58:22 阅读量: 7 订阅数: 32 


Oracle数据库架构与优化指南
### 数据库表相关知识详解
#### 1. 索引与表数量
在数据库中,一个表理论上可以拥有的索引数量等同于列的排列组合数(包括这些列上函数的排列组合,以及任何你能想到的唯一表达式的排列组合)。随着基于函数的索引的出现,理论上可创建的索引数量变为无限。然而,实际应用中,诸如整体性能(每添加一个索引都会增加向该表插入数据的开销)等限制因素,会制约实际创建和维护的索引数量。
对于表的数量,即使在单个数据库内也没有限制。但实际情况会使这个数量保持在合理范围内,一般不会有上百万个表(因为创建和管理这么多表不切实际),不过可能会有数千个表。
#### 2. 术语解释
- **段(Segment)**:在Oracle中,段是占用磁盘存储的对象。常见的段类型如下:
- **簇(Cluster)**:能存储表,有B*树和哈希两种类型。常用于将多个表的相关数据预先连接存储在同一数据库块中,或把单个表的相关信息存储在一起。
- **表(Table)**:表段存储数据库表的数据,常与索引段配合使用。
- **表分区或子分区(Table partition or subpartition)**:用于分区,类似于表段,只存储表数据的一部分。分区表由一个或多个表分区段组成,复合分区表由一个或多个表子分区段组成。
- **索引(Index)**:存储索引结构。
- **索引分区(Index partition)**:类似于表分区,包含索引的一部分。分区索引由一个或多个索引分区段组成。
- **大对象分区、大对象子分区、大对象索引和大对象段(Lob partition, lob subpartition, lobindex, and lobsegment)**:大对象索引和大对象段存储大对象(LOB)的结构。当包含LOB的表进行分区时,大对象段也会分区。
- **嵌套表(Nested table)**:分配给嵌套表的段类型,嵌套表是主/明细关系中的特殊子表。
- **回滚和Type2撤销(Rollback and Type2 undo)**:存储撤销数据。回滚段由DBA手动创建,Type2撤销段由Oracle自动创建和管理。
一个表或索引可能是一个段,但也可能因分区而由多个段组成。通常情况下,创建表时会创建一个新的表段,该段由区(extents)组成,区又由块(blocks)组成。
例如,执行以下简单的`CREATE TABLE`语句:
```sql
EODA@ORA12CR1> create table t ( x int primary key, y clob, z blob );
```
在Oracle 11g Release 1及之前版本,此语句会创建六个段;在Oracle 11g Release 2及以上版本,默认情况下段的创建会延迟到插入第一行数据时。若要立即创建段,可使用以下语句:
```sql
EODA@ORA12CR1> create table t
2 ( x int primary key,
3 y clob,
4 z blob )
5 SEGMENT CREATION IMMEDIATE
6 /
```
执行后查询段信息:
```sql
EODA@ORA12CR1> select segment_name, segment_type from user_segments;
```
结果如下:
| SEGMENT_NAME | SEGMENT_TYPE |
| --- | --- |
| T | TABLE |
| SYS_LOB0000021096C00003$$ | LOBSEGMENT |
| SYS_LOB0000021096C00002$$ | LOBSEGMENT |
| SYS_IL0000021096C00003$$ | LOBINDEX |
| SYS_IL0000021096C00002$$ | LOBINDEX |
| SYS_C005958 | INDEX |
这里,表本身创建了一个段,主键约束为了强制唯一性创建了一个索引段。每个LOB列创建了两个段,一个存储实际数据块,另一个用于组织这些数据块。
需要注意的是,唯一或主键约束可能不会创建新索引,如果约束列上已有索引且这些列位于索引的前沿,约束会使用现有索引。另外,`SEGMENT CREATION IMMEDIATE`是Oracle 11g Release 2及以上版本特有的语法,在早期版本使用会报错。延迟段创建功能仅在Oracle企业版中可用,从企业版数据库导出对象到标准版数据库时需注意,可能会出现`ORA - 00439 feature not enabled`错误,可在企业版数据库中使用`SEGMENT CREATION IMMEDIATE`创建表来解决。
#### 3. 段空间管理
从Oracle 9i开始,有两种管理段空间的方法:
- **手动段空间管理(Manual Segment Space Management,MSSM)**:通过设置`FREELISTS`、`FREELIST GROUPS`、`PCTUSED`等参数,控制段内空间随时间的分配、使用和重用。
- **自动段空间管理(Automatic Segment Space Management,ASSM)**:只需控制`PCTFREE`参数,其他参数在段创建时接受但会被忽略。
MSSM是Oracle的传统实现方式,存在多年。ASSM于Oracle 9i Rele
0
0
复制全文
相关推荐










