oracle中的rowid和数据行的结构
在oracle数据库系统中每一行都有一个rowid,oracle数据库系统就是利用rowid来定位数据行的。rowid也是oracle中内置的一个标量数据类型
rowid有一下特点;
是数据库中每一行的唯一标识
并不是显示的存储某一列的值
可以用来定位行,虽然没有直接给出行的物理地址
提供了访问一张表中数据行的最快机制
1)rowid有两种类型:限制rowid和扩展rowid
一、扩展rowid
扩展rowid是oracle8i之后的版本中引入的,其结构如下:
数据对象号+相对文件号+块号+行号
存储(32bit) (10bit)(22bit)(16bit)=10B
显示 6 3 6 3
一个扩展rowid需要10B的空间存储用18个字符显示其组成如下
1、数据对象号:唯一标识数据库对象的数据对象号,被赋予每一个对象
2、相对文件号:对同一个表空间中每一个文件都是唯一的,标识同一个表空间中的不同数据文件
3、块号:为相对文件中包含数据行的数据块的位置
4、行号:标识了块头中行目录的位置
扩展rowid的显示是用一中64位的编码,使用的显示字符为A~Z a~z 0~9和+、/总共64个字符
oracle使用rowid定位数据行的机制:
1、使用数据对象号找到表空间
2、使用相对文件号找到存储的数据文件
3、使用块号找到存储数据行的数据块
4、使用行号找到行目录项,然后使用行目录项就可以定位数据行的起始地址
二、限制rowid
是oracle7或者之前的版本中使用的与扩展rowid的最大区别是没有数据对象号在内部存储时仅使用6个字节存储。在oracle中定位数据行时通过遍历表空间依次向下寻找直到行号。所以在oracle7i版本之前要求数据文件的个数最多为1022个。在8i后由于添加了数据对象号所以要求tablespace最多不能超过1022个。
2)oracle数据行的结构
为了节省存储空间oracle使用了一种特殊的数据行存储结构。每个数据行以变长记录的形式存储在数据块中。通常一行中的列是按照他们被定义的顺序存放的,并且末尾的空列不存储,但是非末尾的空列需要一个字节的存储长度。
数据行的组成:
行头:用来存储该行中的列数,迁移信息和行锁的状态
行数据:由一系列的列长和列值组成对应数据行中的每一列oracle服务器存储该列的列长度和列的实际值
列长:一般需要一个字节
列值:列的实际值紧随着列长字节后存放
oracle的存储是非常紧凑的,在oracle系统中相邻的数据行之间不需要任何空间。数据块中每一行在行目录中都有一个槽,这个槽指向了数据行的起始地址。
oracle中的rowid和数据行的结构的更多相关文章
- Oracle中的rowid
ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...
- 向oracle中的表插入数据的方法
向oracle中的表插入数据的方法有以下几种: 假设表名为User 第一种方法:select t.*,rowid from User t;-->点击钥匙那个标记就可向表中添加数据 第二种方法:s ...
- for循环往Oracle中插入n条数据,主键自增
1.主键自增实现方法:http://www.cnblogs.com/Donnnnnn/p/5959871.html 2.for循环往Oracle中插入n条数据 BEGIN .. loop insert ...
- Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)
应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...
- Oracle中的rowid rownum
1. rowid和rownum都是虚列 2. rowid是物理地址,用于定位oracle中具体数据的物理存储位置 3. rownum则是sql的输出结果排序,从下面的例子可以看出其中的区别. rowi ...
- oracle中number类型的数据使用as string 得到的值为null
1,如果数据的运行时类型(和数据库字段类型相同)不是字符串类型,比如number/date等,将ds.Tables[0].Rows[i][j] 调用 as string 时,不管 这个字段是否有值,这 ...
- 查看SqlAzure和SQLServer中的每个表数据行数
SqlAzure中的方式: select t.name ,s.row_count from sys.tables t join sys.dm_db_partition_stats s ON t.obj ...
- oracle中字符串与表数据拼接的用法--“||”
测试过程中,经常需要批量删除或者插入.修改一些表数据或结构,使用手工复制.粘贴其实很麻烦,所以这是我们就可以使用拼接成sql语句的方法来实现操作数据.下面先讲讲oracle中拼接符 || 的用法,如下 ...
- oracle中insert 多条数据方法
oracle中的insert 和 mysql添加多条数据的 方式不太一样 用到的语法: insert all into 表名(需要添加的表字段)values(添加的字段数据一定要对应字段顺序) int ...
随机推荐
- 如何判断CPU的位数
CPU是16位,32位,还是64位,主要指的是数据总线(data bus)有多少位,16位数据总线表示CPU一次可以从内存取2个byte的数据,32位数据总线表示CPU一次可以从内存取4byte数据, ...
- Linux下安装MySQL步骤
1.下载安装包(这里是32位的): MySQL-client-5.6.13-1.rhel5.i386.rpm MySQL-server-5.6.13-1.rhel5.i386.rpm 2.安装 rpm ...
- HTML5学习笔记一:新增主体结构元素
Dreamweaver快捷键: 属性面板:Ctrl+F3 新建文档:Ctrl+N 选择用网页查看:F12 新增的主体结构元素: section元素(例子如下): <!DOCTYPE HTML&g ...
- 用Python写的简单脚本更新本地hosts
这两天Google墙得严重,于是就产生了做个一键更新hosts的脚本的想法. 由于正在学习Python,理所当然用Python来写这个脚本了. 接触比较多的就是urllib2这个库,习惯性的impor ...
- VS2005快捷键
VS2005快捷键 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL + SHIFT + O打开项目 CTRL + SHIFT + C显 ...
- List 随机排序
List<T> l = new List<T>(); l = l.Select(a => new { a, newID = Guid.NewGuid() }).Order ...
- SqlServer sysobjects_table
--这是查询所有表的信息 select * from sysobjects where xtype='U'; --这是查询表的数量 select count(*) from sysobjects wh ...
- UESTC_邱老师选妹子 2015 UESTC Training for Dynamic Programming<Problem H>
H - 邱老师选妹子 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- Rock the Tech Interview
Today, Infusion held a talk in Columbia University about tech interview. Talker: Nishit Shah @ Infus ...
- MyCat 主键ID自增长配置
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一.为此,MyCat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式,实现方式主要有三种:本地文件方式.数 ...