作为oracle初学者,在此只讨论普通表类型。
oracle_3">oracle表中的数据类型
数据类型主要分为四类:文本,数值,日期,二进制
文本:
- CHAR(N) :固定长字符类型,N为字符长度。内容不够N字节会使用空格补充。固定占N个字符的位置。
- NCHAR(N):存储Unicode字符的固定长;字符类型。
- VARCHAR(N):可变长字符类型,N为字符长度。占实际内容长度的位置。
- NVARCHAR2(N):存储Unicode字符的可变长类型。
数值:
- NUMBER(P,S):存储精确的数值,支持整数和小数。
- P表示可存储的整数部分和小数部分的总位数(最大为38),S表示小数点后的位数。
- 示例:NMUBER(5,2):可存储最大值为
999.99
。
日期:
- DATE:存储日期和时间,精度到秒。
- TIMESTAMP§:存储日期和时间,支持更高的精度。p表示精确程度。
二进制:
- RAW(N):存储二进制数据,
n
为长度,最大2000字节(2k)。 - LOB:
- BLOB:存储二进制大对象,最大4GB。
- CLOB:存储大文本数据,最大4GB。
- ROWID:存储行的物理地址。
- UROWID:存储逻辑行ID。
ROWID
ROWID 是 Oracle 数据库中用来表示数据库中每一行的唯一标识符,隐含在表中,通过ROWID唯一确定某行,任何表都有ROWID。
-
OOOOOO: 数据对象编号(Object ID),表示所属表。
-
FFF: 文件号,表示存储的表空间文件编号。
-
BBBBBB: 块号,表示行存储的数据库块。
-
RRR: 行号,表示该块中的行位置。
ROWID是快速定位一个记录最快的方法。
创建表
CREATE TABLE table_name (column1 data_type [constraint],column2 data_type [constraint],...[table_constraints]
)
TABLESPACE tablespace_name -- 指定存储表的表空间
STORAGE (INITIAL size -- 第一个区的大小NEXT size -- 后续扩展区的大小MINEXTENTS number -- 初始分配的区数量MAXEXTENTS number | UNLIMITED -- 最大分配的区数量PCTINCREASE percentage -- 每次扩展区大小增长的百分比
)
;
-
table_name
:表名,必须唯一。 -
column1, column2
:列名,每个列需要指定数据类型。 -
data_type
:列的数据类型,如VARCHAR2
,NUMBER
,DATE
。 -
constraint
:列级别约束,如PRIMARY KEY
,NOT NULL
,UNIQUE
。 -
table_constraints
:表级别约束,比如主键、外键等。
参数 | 描述 |
---|---|
INITIAL | 定义分配的第一个区的大小(单位为字节、KB、MB、GB,例如 100K ,1M )。 |
NEXT | 定义第二个区的大小,或后续扩展区的初始大小。 |
MINEXTENTS | 定义对象创建时最少分配的区数量,默认值为 1 。 |
MAXEXTENTS | 定义对象允许的最大区数量,可指定具体值或 UNLIMITED 。 |
PCTINCREASE | 定义扩展区大小的增长比例。0 表示固定大小,不增长;非零值时每次扩展区增量按此百分比计算。 |
创建临时表
CREATE GLOBAL TEMPORARY TABLE table_name (column1 data_type [constraint],column2 data_type [constraint],...
) ON COMMIT {DELETE ROWS | PRESERVE ROWS};
-
table_name
:表名,必须唯一。 -
column1, column2
:列名和数据类型。 -
ON COMMIT DELETE ROWS
:在每次事务提交后删除表中的数据。这是默认行为。 -
ON COMMIT PRESERVE ROWS
:在事务提交后,保留表中的数据,直到会话结束。
Row Migration & Row Chaining
** 行迁移 (Row Migration)**
定义:
- 当某一行数据由于更新操作而增长时,可能会超出该行原本存储的数据块的空间。即使
PCTFREE
为该块留出了空间,也可能因为行的数据量增加(例如,更新了某个列的值,使得它变得更大)导致原数据块无法再容纳整个行。 - 在这种情况下,Oracle 会将整个行迁移到一个新的数据块中,并留下一个指向新位置的指针。这个过程被称为 行迁移 (Row Migration)。
影响:
- 行迁移会导致 Oracle 在读取这行数据时需要访问两个数据块:原始块和新块。
- 这种额外的 I/O 操作会导致性能下降,尤其是当迁移的行被频繁访问时,查询的速度会显著变慢。
解决办法:
- 增加
PCTFREE
的值:为了避免行迁移,可以通过设置较高的PCTFREE
值为数据块预留更多空间,以应对将来的数据增长。 - 定期进行表重建:通过
ALTER TABLE MOVE
或DBMS_REDEFINITION
等操作,重建表并清理已经发生行迁移的行,以消除这些额外的指针。
行链接 (Row Chaining)
定义:
- 行链接 是当一行数据过大,无法完全存储在一个数据块中时,Oracle 将行分割成多个片段,每个片段存储在不同的块中。这些行片段通过指针连接起来,从而形成一个完整的行。每个片段都是该行的一部分,并且会存储在不同的数据块中。
- 行链接通常发生在以下情况:
- 行包含非常大的数据类型,如
CLOB
、BLOB
或长文本字段。 - 表包含的列过多,导致每行的数据量超过了单个数据块的容量。
- 行包含非常大的数据类型,如
影响:
- 当行数据被拆分为多个块时,Oracle 必须访问多个数据块来重新组装完整的行,这会导致性能下降。
- 特别是在需要频繁读取这些大行时,额外的 I/O 操作会明显影响数据库的响应时间。
解决办法:
- 增加数据块大小:通过选择较大的数据块(例如 8KB → 16KB 或 32KB),可以容纳更大的行,从而减少行链接的发生。
- 拆分表:如果表的某些列特别长,可以考虑将表拆分成多个较小的表,将长列放在独立的表中,以减小单行的大小。
- 使用合适的数据类型:避免使用过大的数据类型,尤其是在不必要的情况下,避免将数据列设为
CLOB
或BLOB
,这些数据类型会导致行链接。
Nonpartitioned Table Reorg(非分区表重组)
在 Oracle 中,非分区表重组是一个重要的操作,通常用于优化表的存储布局或将表移动到不同的表空间中。重组过程会保留表的结构(例如,列定义),但是会重新安排表的数据存储方式。通过这种方式,可以减少行迁移,优化空间的使用,或者将表迁移到一个性能更好的表空间中。
ALTER TABLE table_nameMOVE TABLESPACE tablespace_name;
-
table_name
:要重组的表的名称。 -
tablespace_name
:目标表空间的名称,表将被移动到这个表空间。
Truncating a Table(清空表)
TRUNCATE TABLE
是一种非常快速的删除表中所有数据的方式,常用于需要快速清空表但不需要日志记录每一行删除的情况。
TRUNCATE TABLE table_name;
table_name
:指定要清空的表名。
TRUNCATE TABLE
的作用:
- 删除表中的所有行:
- 执行
TRUNCATE TABLE
后,表中所有的行会被立即删除,但表结构和约束(如索引、触发器等)不会受到影响。
- 执行
- 释放所使用的空间:
- 清空表会释放表占用的存储空间(通常是数据文件中的空间),从而减小表的物理大小。
- 清空索引:
- 与表关联的索引会在
TRUNCATE TABLE
操作后被清空,但索引本身不会被删除,索引结构依然存在。
- 与表关联的索引会在
- 不会触发触发器:
立即删除,但表结构和约束(如索引、触发器等)不会受到影响。 - 释放所使用的空间:
- 清空表会释放表占用的存储空间(通常是数据文件中的空间),从而减小表的物理大小。
- 清空索引:
- 与表关联的索引会在
TRUNCATE TABLE
操作后被清空,但索引本身不会被删除,索引结构依然存在。
- 与表关联的索引会在
- 不会触发触发器:
- 与
DELETE
不同,TRUNCATE TABLE
不会触发DELETE
触发器。这意味着如果表上定义了删除触发器,执行TRUNCATE
时,触发器不会被执行。
- 与