1. 基本数据库对象管理概述
在Oracle数据库中,无论是数据库管理员还是普通用户,都需要经常对数据库对象进行管理,比如表、索引、视图、存储过程和触发器等。这些数据库对象按逻辑关系组织在一起,形成了一个模式(Schema)。
1.1 模式(Schema)
- 定义:模式是某个用户拥有的所有数据库对象的集合。每个数据库对象都属于某个用户。当创建一个用户时,该用户的模式也会同时被创建,模式的名称与用户名称相同。
- 作用:用户在其模式中拥有对这些数据库对象的完全控制权,包括创建、删除、修改等操作。
2. 普通表的管理
普通表是数据库中最基础和重要的对象,用于存储系统或用户的数据。普通表的管理包括表的结构定义、表的创建、表的修改与删除等操作。
2.1 普通表的结构
表的数据存储:表中的数据是按行和列的格式存放的。表中的每一行数据都有一个唯一的行号(ROWID),用于标识该行数据在数据库文件中的物理位置。行号(ROWID)由数据库自动生成,由18个字符组成,包括以下部分:
- 数据对象编号:标识数据行所属的数据库对象。
- 数据文件编号:标识数据行存储在哪个数据文件中。
- 数据块编号:标识数据行存储在哪个数据块中。
- 行号:标识数据行在数据块中的具体位置。
例如,可以通过以下查询来获取表DEPT
中每行数据的行号:
SELECT ROWID, DEPTNO, DNAME, LOC FROM DEPT;
该查询的执行结果将返回每行数据的行号(ROWID),以及对应的部门编号(DEPTNO)、部门名称(DNAME)和位置(LOC)。
2.2 普通表的创建
在创建表时,可以为表指定一些重要的属性,如存储参数、表空间等。这些属性可以通过CREATE TABLE
命令的子句来指定。
2.2.1 PCTFREE和PCTUSED子句
定义:
PCTFREE
:用于指定数据块中预留的未使用空间百分比,用以存放将来可能的行更新。默认值通常为10%。PCTUSED
:指定数据块在被重新用于插入数据之前必须达到的已使用空间百分比。通常PCTFREE
和PCTUSED
之和接近100%。
作用:
- 控制数据块的空间使用情况,减少数据块的迁移。
示例:
CREATE TABLE T_1 ( name VARCHAR2(10) ) PCTFREE 20 PCTUSED 40;
该语句创建了一个名为
T_1
的表,其中PCTFREE
设置为20%,表示每个数据块将预留20%的空间用于未来更新;PCTUSED
设置为40%,表示当数据块已使用的空间低于40%时,该数据块将被重新用于插入数据。
2.2.2 TABLESPACE子句
- 定义:指定将表创建在哪个表空间上。如果不指定
TABLESPACE
子句,表将在用户的默认表空间上创建。 示例:
CREATE TABLE T_2 ( id NUMBER, name VARCHAR2(50) ) TABLESPACE user_data;
该语句创建了一个名为
T_2
的表,并将其存储在user_data
表空间中。
2.2.3 INITRANS和MAXTRANS子句
定义:
INITRANS
:指定数据块中用于开始事务的初始事务槽位数。MAXTRANS
:指定数据块中最多允许的并发事务数。
作用:控制数据块上事务的并发数量。
示例:
CREATE TABLE T_3 ( name VARCHAR2(10) ) INITRANS 10 MAXTRANS 200;
该语句创建了一个名为
T_3
的表,指定初始事务数为10,最大并发事务数为200。
2.3 行号(ROWID)的解析
行号(ROWID)是由Oracle数据库生成的字符串,用于表示某一行数据在数据库中的位置。它由18个字符组成,前6个字符表示数据库对象编号,接下来3个字符表示数据文件编号,再接下来6个字符表示数据块编号,最后3个字符表示行号。
DBMS_ROWID包:Oracle提供了DBMS_ROWID
包,可以利用其中的函数对行号进行解析。例如,可以通过以下查询获取dept
表中每行数据所在的文件编号、数据块编号、行号等信息:
SELECT
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) AS 文件编号,
DBMS_ROWID.ROWID_OBJECT(ROWID) AS 对象编号,
DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) AS 数据块编号,
DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) AS 行号
FROM dept;
在Oracle数据库中,表是最基础且最重要的对象,存储了系统和用户的数据。表的管理涉及对表的结构、存储参数及事务并发等属性的配置和优化。通过合理使用这些参数,可以显著提高数据库的性能与稳定性。
示例
创建表T_1:
CREATE TABLE T_1 ( name VARCHAR2(10) ) PCTFREE 20 PCTUSED 40;
创建表T_2:
CREATE TABLE T_2 ( id NUMBER, name VARCHAR2(50) ) TABLESPACE user_data;
创建表T_3:
CREATE TABLE T_3 ( name VARCHAR2(10) ) INITRANS 10 MAXTRANS 200;
解析行号:
SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) AS 文件编号, DBMS_ROWID.ROWID_OBJECT(ROWID) AS 对象编号, DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) AS 数据块编号, DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) AS 行号 FROM dept;
非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。
学习成功人士的经验,提供全面的学习资源和社群支持,多种副业选择,总有一个适合你。
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。