包含oraclerowid的词条

本篇文章给大家谈谈oraclerowid,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

在Oracle中有个rowid和rownum,他们是一样的吗?有什么作用?大神求解!!!

rowid和rownum都是伪列,但含义完全不同。rowid是物理地址,用于定位Oracle中具巧败体数据的物理存储位置,而rownum则是sql的输出结果排序。通俗的讲:rowid是相对不变的,rownum会变化,尤其是使用order by的时候。

rowid 用于定位数据表中某孝枣颤条数据的位置,是唯一的、也不会改变

rownum 表示查询某条记录在整岩握个结果集中的位置, 同一条记录查询条件不同对应的 rownum 是不同的而 rowid 是不会变的

ORACLE数据库中的ROWID

我们可能对oracle的rowid的使用并不陌生 不过 如果仔细分析一下 发现其还是有些知识点 rowid是一个伪列 是用来确保表中行的唯一性 它并不能指示出行的物理位置 但可以用来定位行 rowid是存储在索引中的一组既定的值(当行确定后) 我们可以像表中普通的列一样将它选出来 利用rowid是访问表中一行的最快方式 rowid需要 个字节来存储 显示为 位的字符串 贺差棚rowid的组成结构为 data object number( 位字符串)+relative file number( 位字符串禅则)+block number( 位字符串)+row number( 位字符串) 如 AAAADeAABAAAAZSAAA 我们可以借助oracle提庆裂供的包dbms_rowid 来对rowid进行解析从而获取关于行的相关信息 bossdb SQLselect rowid dbms_rowid rowid_object(rowid) obj_id dbms_rowid rowid_relative_fno(rowid) df# dbms_rowid rowid_block_number(rowid) blknum dbms_rowid rowid_row_number(rowid) rowno from p_test where rownum ;ROWID OBJ_ID DF# BLKNUM ROWNO AAAQ+tAANAAAC SAAA AAAQ+tAANAAAC SAAB AAAQ+tAANAAAC SAAC AAAQ+tAANAAAC SAAD 我们可以看到 通过rowid_row_number得到的行号是从 开始的 这是和rownum伪列的一个不同之处 我猜测rowid_row_number在求行号的时候是计算首行的偏移量 一般来说 当表中的行确定后 rowid就不会发生变化 但当如下情况发生时 rowid将发生改变 对一个表做表空间的移动后 对一个表进行了EXP/IMP后 lishixinzhi/Article/program/Oracle/201311/17378

[img]

"oracle"中rowid怎么用?

ROWID是一种数据类型,它使用基于64为编码的18个字符来唯一标识一条记录物理位置的一个ID,类似于Java中一个对象的哈希码,都是为了局型迹唯一桐并标识对应对象的物理位置,需要注意的是ROWID虽然可以在表中进行查询,但是其值并未存储在表中,所以不支持增删改操作,下面看个例子:

[html] view plain copy

SELECT ROWNUM,ROWID,empno,ename,job FROM emp WHERE ROWNUM = 5;

结果如下:

可以看到ROWID确实由18个字符组成,组成结构如下:

数据对象编号    文件编号    块编号    行编号  

OOOOOO    FFF    BBBBBB    RRR  

至于ROWID的作用,由于ROWID用来唯一标识表中数据的唯一性,所以可以利用这个特性去除重复,举个例子,首先运行下述两行代码:

[html] view plain copy

CREATE TABLE dept_bak AS SELECT * FROM dept;

INSERT INTO dept_bak SELECT * FROM dept;

得到一个如下的数据库表

很明显,数据有重复的,但是ROWID肯定不会重复的,那么就可以利用这个特性去重,租扮简单示例代码如下:

[html] view plain copy

DELETE FROM dept_bak WHERE ROWID NOT IN( SELECT MIN(ROWID) FROM dept_bak GROUP BY DEPTNO);

oracle中rowid和rownumber的区别

rownum和rowid都是族卖裂伪列,但是两者的根本是不同的,rownum是根据sql查询出的结果给每行分配一个逻辑编号,所以你的sql不同也就会导致最终rownum不同,但是rowid是物理结构上的,在每条记录insert到数据库中时,都会有一个唯一的物理记录

例如

AAAMgzAAEAAAAAgAAB

7499

ALLEN

SALESMAN

7698

1981/2/20

1600.00

300.00

30

这里的AAAMgzAAEAAAAAgAAB物理位置对应了这条记录,这个记录是不会随着sql的改变而改变。

因此,这就导致了他们的使用场景不同了,通常在sql分页时或是查找某一范围内的记录时,我们会使用rownum。

1、rownum

例如:

查找2到10范围内的记录(这里包括2和10的记录)

select

*

from

(select

rownum

rn,

a.*

from

emp

a)

t

where

t.rn

between

2

and

10;

查找前三名的记录

select

*

from

emp

a

where

rownum

3;这里我们要注意,直接用rownum查找的范围必须要包含1;因为rownum是从1开始记录的,当然你可以把rownum查出来后放在一个虚表中作为这个虚表的字段再根据条件查询。

例如:

select

*

from

(select

rownum

rn,

a.*

from

emp

a)

t

where

t.rn

2;这就可以了

2、rowid

我们在处理一张表中重复记录时经常用到他,当然配伏你也可以用一个很原始的方法,就是兆闭将有重复记录的表中的数据导到另外一张表中,最后再倒回去。

SQLcreate

table

stu_tmp

as

select

distinct*

from

stu;

SQLtruncate

table

sut;

//清空表记录

SQLinsert

into

stu

select

*

from

stu_tmp;

//将临时表中的数据添加回原表但是要是stu的表数据是百万级或是更大的千万级的,那这样的方法显然是不明智的,因此我们可以根据rowid来处理,rowid具有唯一性,查询时效率是很高的,

例如,学生表中的姓名会有重复的情况,但是学生的学号是不会重复的,如果我们要删除学生表中姓名重复只留学号最大的学生的记录,怎么办呢?

delete

from

stu

a

where

rowid

not

in

(select

max(rowid)

from

stu

b

where

a.name

=

b.name

and

a.stno

b.stno);

这样就可以了。

说说Oracle的rowid

在Oracle中rowid唯一标识每条记录所在的位置 它作为一个伪列在查询中出现

select rowid id

from test_table

where rownum= ;

ROWID                      ID

AAAVcbAAPAAAAALAAA         

AAAVcbAAPAAAAALAAB         

AAAVcbAAPAAAAALAAC         

AAAVcbAAPAAAAALAAD         

AAAVcbAAPAAAAALAAE         

AAAVcbAAPAAAAALAAF         

AAAVcbAAPAAAAALAAG         

AAAVcbAAPAAAAALAAH         

AAAVcbAAPAAAAALAAI         

AAAVcbAAPAAAAALAAJ        

rowid是由 个字符组成分 个部分 分别是

个字符的对象编号 个字符的文件号 个字符的块编号 个字符的行编号

每一个字符的取值范围以及对应的数值是

| A|  |    | a| |    | | |

| B|  |    | b| |    | | |

| C|  |    | c| |    | | |

| D|  |    | d| |    | | |

| E|  |    | e| |    | | |

| F|  |    | f| |    | | |

| G|  |    | g| |    | | |

| H|  |    | h| |    | | |

| I|  |    | i| |    | | |

| J|  |    | j| |    | | |

| K| |    | k| |    | +| |

| L| |    | l| |    | /| |

| M| |    | m| |    |  |   |

| N| |    | n| |    |  |   |

| O| |    | o| |    |  |   |

| P| |    | p| |    |  |   |

| Q| |    | q| |    |  |   |

| R| |    | r| |    |  |   |

| S| |    | s| |    |  | 姿和  |

| T| |    | t| |    |  |   |

| U| |    | u| |    |  |   |

| V| |    | v| |    |  |   |

| W| |    | w| |    |  |   |

| X| |    | x| |    |  |   |

| Y| |    | y| |    |  |   |

| Z| |    | z| |    |  |   |

可以看到rowid是一个 进制的表示方式 利用上述对应表即可计算出

对象编号 AAAVcb  =

文件号 AAP =

块号 AAAAAL =

行号 AAA~AAJ = ~

进制的转换完全可以交给机器去做 Oracle也是这么认为的 于是提供了一个叫做dbms_rowid的宽册枣包 它包含了一系列的方法 我们借助这个包就可完成上述的工作了

select rowid

   substr(rowid ) || : || dbms_rowid rowid_object(rowid)       数据对象编号/object_id

   substr(rowid ) || : || dbms_rowid rowid_relative_fno(rowid) 文件编号/file_id

   substr(rowid )|| : || dbms_rowid rowid_block_number(rowid) 块编号/block_id

   substr(rowid )|| : || dbms_rowid ROWID_ROW_NUMBER(rowid)   行编号慎拆/row_num

from test_table

where rownum= ;

ROWID              数据对象编号/object_id    文件编号/file_id     块编号/block_id      行编号/row_num

AAAVcbAAPAAAAALAAA AAAVcb :             AAP :              AAAAAL :           AAA :

AAAVcbAAPAAAAALAAB AAAVcb :             AAP :              AAAAAL :           AAB :

AAAVcbAAPAAAAALAAC AAAVcb :             AAP :              AAAAAL :           AAC :

AAAVcbAAPAAAAALAAD AAAVcb :             AAP :              AAAAAL :           AAD :

AAAVcbAAPAAAAALAAE AAAVcb :             AAP :              AAAAAL :           AAE :

AAAVcbAAPAAAAALAAF AAAVcb :             AAP :              AAAAAL :           AAF :

AAAVcbAAPAAAAALAAG AAAVcb :             AAP :              AAAAAL :           AAG :

AAAVcbAAPAAAAALAAH AAAVcb :             AAP :              AAAAAL :           AAH :

AAAVcbAAPAAAAALAAI AAAVcb :             AAP :              AAAAAL :           AAI :

AAAVcbAAPAAAAALAAJ AAAVcb :             AAP :              AAAAAL :           AAJ :

这个结果对不对呢?我们可以这样验证 注意 以下查询需要DBA权限

首先是object_id

select

   owner object_name object_id

from dba_objects

where object_name= TEST_TABLE ;

OWNER      OBJECT_NAME           OBJECT_ID

TEST       TEST_TABLE               

然后是文件编号和块编号

select

   owner segment_name segment_type extent_id

   file_id block_id blocks bytes

from dba_extents

where segment_name= TEST_TABLE ;

OWNER  SEGMENT_NAME  SEGMENT_TYPE   EXTENT_ID  FILE_ID  BLOCK_ID  BLOCKS  BYTES

TEST   TEST_TABLE    TABLE                                          

TEST   TEST_TABLE    TABLE                                         

编号为 的块落在了编号为 的exntent上 只能说是验证了一半 接下来我们将数据块dump出来看看 不过做之前先为这一行打上 标记 看以下过程

test$logdw@logdw SQL select rowid t * from test_table t where rownum= ;

ROWID                      ID DATA

AAAVcbAAPAAAAALAAA                                        Q

AAAVcbAAPAAAAALAAB                                        Q

AAAVcbAAPAAAAALAAC                                        Q

AAAVcbAAPAAAAALAAD                                        Q

AAAVcbAAPAAAAALAAE                                        Q

rows selected

test$logdw@logdw SQL update test_table set data=lpad( killkill ) where id= ;

row updated

test$logdw@logdw SQL select rowid t * from test_table t where rownum= ;

ROWID                      ID DATA

AAAVcbAAPAAAAALAAA                                 killkill

AAAVcbAAPAAAAALAAB                                        Q

AAAVcbAAPAAAAALAAC                                        Q

AAAVcbAAPAAAAALAAD                                        Q

AAAVcbAAPAAAAALAAE                                        Q

rows selected

test$logdw@logdw SQL mit;

做好了 标记 可以dump数据块了

sys$logdw@logdw SQL select get_trace_name() from dual ;

GET_TRACE_NAME()

/u /app/oracle/diag/rdbms/logdw/logdw/trace/logdw_ora_ trc

sys$logdw@logdw SQL alter system dump datafile block ;

System altered

打开trc文件 摘录如下

Start dump data blocks tsn: file#: minblk maxblk

Dump of memory from x A F A to x A F A

A F F C B   [             kil]

A F F C B C C C E C   [lkill     ]

block_row_dump:

tab row @ x ac

tl: fb: H FL lb: x   cc:

col  : [ ]  c

col  : [ ]

  b c

  c b c c

lishixinzhi/Article/program/Oracle/201311/17417

Oracle数据库中rowid什么作用?

ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据念历的位置。

ROWID可以分为物理rowid和逻辑rowid两种。普通的堆表中的rowid是物理rowid,索引组织表(IOT)的rowid是逻辑rowid。oracle提供了一种urowid的数据类型,同时支持物理和逻辑rowid。

物理rowid又分为扩展rowid(extended rowid)和限制猜拿rowid(restricted rowid)两种格式。限制rowid主要是oracle7以前的rowid格式,现在已经仔兆搜不再使用,保留该类型只是为了兼容性。

1.创建一临时表

create table test_rowid (id number, row_id rowid);

2.插入一行记录

insert into test_rowid values(1,null);

3.修改刚插入的记录

update test_rowid set row_id = rowid where id = 1;

4.查看rowid

select rowid,row_id from test_rowid;

关于oraclerowid和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

相关阅读

  • 数据存储(数据存储华为数据存储)

    数据存储(数据存储华为数据存储)

    数据存储在IT技术中扮演着非常重要的角色,它指的是将数据保存在计算机或服务器的存储设备中,以便日后进行访问和处理。数据存储是计算机系统中的一个基本组成部分,对于企业和个人用户来说都是至关重要的。在本文中,我们将深入探讨数据存储的重要性、常见...

    2024.04.12 18:00:34作者:intanet.cnTags:数据存储
  • 包含awsredis的词条

    包含awsredis的词条

    AWS Redis是一种云端的Redis管理服务,能够提供高性能的内存数据库,用来加速应用程序、增加应用程序缓存、实现消息传递、实现任务队列等功能。AWS Redis可以帮助开发者更轻松地构建可靠、高性能的应用程序。# 什么是AWS Red...

    2024.04.12 16:22:18作者:intanet.cnTags:awsredis
  • mongodb怎么读(mongodb中文)

    mongodb怎么读(mongodb中文)

    MongoDB是一种流行的NoSQL数据库管理系统,它使用文档存储结构,为开发人员提供了灵活性和性能。本文将介绍如何读取MongoDB中的数据。# 连接到MongoDB数据库首先,我们需要连接到MongoDB数据库。可以使用MongoDB官...

    2024.04.12 16:11:11作者:intanet.cnTags:mongodb怎么读
  • 关于redishdel的信息

    关于redishdel的信息

    简介:Redishdel是一种IT技术工具,被广泛应用于数据存储和缓存管理领域。它以高效的内存数据库系统著称,通过使用快速的数据结构和灵活的命令功能,帮助用户提升数据处理效率和性能。多级标题:1. Redishdel的特点2. Redish...

    2024.04.12 16:00:42作者:intanet.cnTags:redishdel
  • mysqlupdate(MySQL update set)

    mysqlupdate(MySQL update set)

    简介:MySQL是一种广泛使用的开源关系型数据库管理系统,用来管理和存储数据。在数据库操作中,数据库的更新是很常见的操作之一。而MySQL提供了多种更新数据的方法,其中包括使用UPDATE语句进行数据更新操作。本文将介绍MySQL更新数据的...

    2024.04.12 09:55:26作者:intanet.cnTags:mysqlupdate
  • mysql服务(mysql服务怎么删除)

    mysql服务(mysql服务怎么删除)

    **简介:**MySQL是一种关系型数据库管理系统,广泛应用于互联网应用和大型企业级系统中。它是开源软件,具有稳定性高、性能优异、功能强大等特点,被广泛应用于各种企业级系统的数据存储和管理中。**多级标题:**一、MySQL服务的架构二、M...

    2024.04.12 02:22:25作者:intanet.cnTags:mysql服务
  • 分布式系统架构(分布式的架构)

    分布式系统架构(分布式的架构)

    分布式系统架构简介:随着IT技术的不断发展,分布式系统架构在当今互联网行业中变得越来越重要。分布式系统架构是将系统的各个部分分散在不同的计算机或服务器上,这样可以提高系统的可靠性、可扩展性和性能。本文将详细说明分布式系统架构的定义、特点和应...

    2024.04.11 18:33:28作者:intanet.cnTags:分布式系统架构
  • oracle8.1.7下载(oracle最新版本下载)

    oracle8.1.7下载(oracle最新版本下载)

    标题:Oracle 8.1.7下载简介:Oracle 8.1.7是一款被广泛使用的数据库管理系统软件,它具有稳定性高、性能优异、功能强大等特点。许多企业和开发者都选择使用Oracle 8.1.7来管理他们的数据库。在本文中,将介绍如何下载O...

    2024.04.11 18:22:14作者:intanet.cnTags:oracle8.1.7下载