当前位置: 首页 > article >正文

# Oracle 深入学习 Part 11: Managing Tables(管理表)

作为oracle初学者,在此只讨论普通表类型。

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,例如 100K1M)。
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 MOVEDBMS_REDEFINITION 等操作,重建表并清理已经发生行迁移的行,以消除这些额外的指针。

行链接 (Row Chaining)

定义
  • 行链接 是当一行数据过大,无法完全存储在一个数据块中时,Oracle 将行分割成多个片段,每个片段存储在不同的块中。这些行片段通过指针连接起来,从而形成一个完整的行。每个片段都是该行的一部分,并且会存储在不同的数据块中。
  • 行链接通常发生在以下情况:
    • 行包含非常大的数据类型,如 CLOBBLOB 或长文本字段。
    • 表包含的列过多,导致每行的数据量超过了单个数据块的容量。
影响
  • 当行数据被拆分为多个块时,Oracle 必须访问多个数据块来重新组装完整的行,这会导致性能下降。
  • 特别是在需要频繁读取这些大行时,额外的 I/O 操作会明显影响数据库的响应时间。
解决办法
  • 增加数据块大小:通过选择较大的数据块(例如 8KB → 16KB 或 32KB),可以容纳更大的行,从而减少行链接的发生。
  • 拆分表:如果表的某些列特别长,可以考虑将表拆分成多个较小的表,将长列放在独立的表中,以减小单行的大小。
  • 使用合适的数据类型:避免使用过大的数据类型,尤其是在不必要的情况下,避免将数据列设为 CLOBBLOB,这些数据类型会导致行链接。

Nonpartitioned Table Reorg(非分区表重组)

在 Oracle 中,非分区表重组是一个重要的操作,通常用于优化表的存储布局或将表移动到不同的表空间中。重组过程会保留表的结构(例如,列定义),但是会重新安排表的数据存储方式。通过这种方式,可以减少行迁移,优化空间的使用,或者将表迁移到一个性能更好的表空间中。

 ALTER TABLE table_name
 MOVE TABLESPACE tablespace_name;
  • table_name:要重组的表的名称。

  • tablespace_name:目标表空间的名称,表将被移动到这个表空间。

Truncating a Table(清空表)

TRUNCATE TABLE 是一种非常快速的删除表中所有数据的方式,常用于需要快速清空表但不需要日志记录每一行删除的情况。

TRUNCATE TABLE table_name;
  • table_name:指定要清空的表名。

TRUNCATE TABLE 的作用

  1. 删除表中的所有行
    • 执行 TRUNCATE TABLE 后,表中所有的行会被立即删除,但表结构和约束(如索引、触发器等)不会受到影响。
  2. 释放所使用的空间
    • 清空表会释放表占用的存储空间(通常是数据文件中的空间),从而减小表的物理大小。
  3. 清空索引
    • 与表关联的索引会在 TRUNCATE TABLE 操作后被清空,但索引本身不会被删除,索引结构依然存在。
  4. 不会触发触发器
    立即删除,但表结构和约束(如索引、触发器等)不会受到影响。
  5. 释放所使用的空间
    • 清空表会释放表占用的存储空间(通常是数据文件中的空间),从而减小表的物理大小。
  6. 清空索引
    • 与表关联的索引会在 TRUNCATE TABLE 操作后被清空,但索引本身不会被删除,索引结构依然存在。
  7. 不会触发触发器
    • DELETE 不同,TRUNCATE TABLE 不会触发 DELETE 触发器。这意味着如果表上定义了删除触发器,执行 TRUNCATE 时,触发器不会被执行。

http://www.kler.cn/a/444307.html

相关文章:

  • 谷歌建筑下载
  • 【自用】通信内网部署rzgxxt项目_01,后端pipeDemo部署(使用nssm.exe仿照nohup)
  • OpenCV圆形标定板检测算法findGrid原理详解
  • 6.3.1 MR实战:计算总分与平均分
  • run postinstall error, please remove node_modules before retry!
  • Ubuntu本地化安装MYSQL及Navicat
  • 【模型压缩】原理及实例
  • SQL 外联结与全联结的使用详解
  • 常见异构程序设计语言
  • hpe服务器更新阵列卡firmware
  • Tomcat快速入门(Java环境介绍+Tomcat快速安装+Tomcat配置文件+Tomcat配置虚拟主机+Tomcat管理界面)
  • Linux实现两台服务器之间ssh连接
  • 【漫话机器学习系列】013.贝叶斯误差(Bayes Error)
  • C++小细节笔记
  • 详细指南:在Ubuntu 20.04 ROS 1环境下设置和使用OpenNI2 SDK
  • 3.8 路由选择器协议
  • 记一次dockerfile中使用环境变量无效的解决方式
  • RTU 通信模块赋能智慧路灯远程开关管理,点亮智慧城市节能增效
  • C/S软件授权注册系统(Winform+WebApi+.NET8+EFCore版)
  • javascript页面设计案例【使用HTML、CSS和JavaScript创建一个基本的互动网页】
  • IEC101/104中的监视点与控制点
  • 使用Python进行excel的数据简单分析
  • FFMpeg-Window下Qt使用MinGW配置FFmpeg开发环境
  • 代码开发相关操作
  • Rust之抽空学习系列(四)—— 编程通用概念(下)
  • 迎接国庆,我上线了第一款小程序