gp里用啥代替oracle里rownum,用啥代替rowid???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gp里用啥代替oracle里rownum,用啥代替rowid???相关的知识,希望对你有一定的参考价值。

无法代替,也是数据库本身的限制。
1,oracle的rowid在普通表中是能唯一标记一行记录,可以快速定位。
2,在Postgresql中有一个与rowid差不多的就是oid,但这个默认没有的 ,要在建表的时候指定with oids才有。这个也可以唯一标记并快速定位行记录。
3,在GREENPLUM中,一个OID确实是可以找到多行,这是因为GREENPLUM是由多个INSTANCE组成的。
参考技术A rowid在记录创建时就生成了,而且是不变的,直接指向硬件上的存储位置,能用rowid直接访问是最快的,但也是人力所无法做到的。rownum是个伪列,查询的时候除非特别指定,否则不会显示。其主要的用处是控制查询返回的行数,比如在WHERE中加ROWNUM<5,则查询结果如果在5行或以上时,只返回前4行。
(一)、概念:行的ROWID标识了该行数据的地址,ROWID包含如下信息:
数据对象编号、
该行数据,在数据文件中的块编号
该行在数据块中的位置(第一行为0)
保存该行数据的数据文件的编号(第一个数据文件为1)
ROWID在插入数据时创建,在删除数据时,删除。
不能手动设置或删除ROWID,ORACLE内部通过ROWID组建索引;
(二)、类型
1、物理ROWID:保存普通表(不含索引组织的表IOT)、聚合表(clustered table)、分区和子分区表、索引、分区和子分区索引中行的地址;

2、逻辑ROWID:保存索引组织表(IOT)的地址;
(三)、物理ROWID
1、类型:物理ROWID包含扩展ROWID与受限ROWID两类
1)、扩展ROWID(extended rowid)
支持表空间关联的数据块地址,有效标识分区表、分区索引以及普通表和索引中的行。
Oracle 8i及更高版本支持extended rowid。

2)、受限ROWID(restricted rowid)
为了向后兼容,如oracle 7及更低版本。
2、扩展ROWID(extended rowid)
a.扩展ROWID使用base64为每一行数据的物理地址进行编码,包含A-Z,a-z,0-9,+以及/。如下查询:
SQL> select rowid,dept.* from dept;
ROWID DEPTNO DNAME LOC
-------------------------------- ------------ -------------------- ----------------
AAAMfKAAEAAAAAQAAA 10 ACCOUNTING NEW YORK
AAAMfKAAEAAAAAQAAB 20 RESEARCH DALLAS
AAAMfKAAEAAAAAQAAC 30 SALES CHICAGO
AAAMfKAAEAAAAAQAAD 40 OPERATIONS BOSTON

b.扩展ROWID格式
扩展ROWID共18位,包含4部分,OOOOOOFFFBBBBBBRRR
a)000000:数据对象编号,标识了数据库中的段;
b)FFF:表空间相关的数据文件编号;
c)BBBBBB:数据文件中的数据块编号;
d)RRR:在数据块中的行编号;
c.DBMS_ROWID包
a)dbms_rowid.rowid_object通过ROWID,获取该数据的对象编号
SQL> select dbms_rowid.rowid_object('AAAMfKAAEAAAAAQAAC') as object_id from dual;
OBJECT_ID
----------------
51146
b)dbms_rowid.rowid_relative_fno通过ROWID获取数据文件编号
SQL> select dbms_rowid.rowid_relative_fno('AAAMfKAAEAAAAAQAAC') as file_no from dual;
FILE_NO
-------------
4
c)dbms_rowid.rowid_block_number通过ROWID,获取该数据的数据块编号
SQL> select dbms_rowid.rowid_block_number('AAAMfKAAEAAAAAQAAC') as block_number from dual;
BLOCK_NUMBER
-------------------------
16
d)dbms_rowid.rowid_row_number通过ROWID,获取数据块中的行编号
SQL> select dbms_rowid.rowid_row_number('AAAMfKAAEAAAAAQAAC') as row_no from dual;
ROW_NO
----------
2

3、受限ROWID(resticted rowid)
a.受限rowid用二进制表示每行数据的物理地址,当使用SQL Plus查询时,二进制表示法被转换为varchar2或16进制表示。
SQL> select dbms_rowid.rowid_to_restricted(rowid,1) as restricted_rowid,dept.* from scott.dept;
RESTRICTED_ROWID DEPTNO DNAME LOC
------------------------------- ------------- --------------------- ------------------
00000010.0000.0004 10 ACCOUNTING NEW YORK
00000010.0001.0004 20 RESEARCH DALLAS
00000010.0002.0004 30 SALES CHICAGO
00000010.0003.0004 40 OPERATIONS BOSTON

b.受限rowid格式:
共16位,包含3部分:AAAAAAAA.BBBB.CCCC
a)AAAAAAAA:保存该行数据的数据块编号
b)BBBB:该行数据在数据块中的行编号
c)CCCC:包含该行数据的数据文件编号

(四)、逻辑ROWID(logical rowid)
1、概述:索引组织的表(IOT)中,row保存在索引的叶子节点,可以在块内或块间移动。
因此,这些rows没有固定的物理地址,无法根据物理地址来唯一标识。
Oracle提供了逻辑ROWID,来标识IOT中的行,逻辑ROWID是基于表的主键;
Oracle可根据这些逻辑ROWID为IOT创建第二索引。
每个第二索引使用的逻辑ROWID都包含一个physical guess;
physical guess标识了当创建第二索引时,IOT中每个row的块位置;

Android Gradle - 用啥代替 compileOnly?

【中文标题】Android Gradle - 用啥代替 compileOnly?【英文标题】:Android Gradle - What to use instead of compileOnly?Android Gradle - 用什么代替 compileOnly? 【发布时间】:2018-04-09 01:10:40 【问题描述】:

根据下面的SO帖子,compile最近变成了implementation:What's the difference between implementation and compile in gradle

我的问题是我应该使用什么来代替compileOnly?上面的帖子没有解决该 gradle 配置。我知道我仍然可以使用compileOnly,但是推荐的配置是什么,不会很快被弃用?

似乎所有包含..compile.. 的配置都将被..implementation.. 替换。我尝试了implementationOnly,但没有被 Android Studio 接受。

【问题讨论】:

并非所有..compile.. 都会被..implementation.. 替换,例如api 您可以使用“我的依赖项中没有编译语句”来扩展您的问题。即使您在构建应用程序时,错误仍然存​​在:“编译”已过时...... ",如果这也是问题的话。 【参考方案1】:

compileOnly 替代品——被弃用的等效配置是provided。见the documentation。

【讨论】:

我的依赖项中没有编译语句。即使你,当应用程序正在构建时,错误仍然存​​在:'compile' is obsolete... @CommonsWare :每天我都因为你而受益。非常感谢您的贡献:-)【参考方案2】:

有一种情况,当您接受IDE自动建议将项目添加到您的gradle文件时,它会添加“编译项目(路径:'xxx')”。纠正它,你会没事的。

【讨论】:

【参考方案3】:

您的项目 gradle 依赖项应该从

更改
dependencies 
    provided 'com.someDependency:api:78'

dependencies 
    compileOnly 'com.someDependency:api:78'

【讨论】:

以上是关于gp里用啥代替oracle里rownum,用啥代替rowid???的主要内容,如果未能解决你的问题,请参考以下文章

数据库中in函数可以用啥代替

用啥代替 $.mobile.changePage()?

Android Gradle - 用啥代替 compileOnly?

Swift 4:NSFilenamesPboardType 不可用。用啥代替 registerForDraggedTypes?

用啥代替 socket.removeAllListeners();在客户端

JwtAccessTokenConverter 和 JwtTokenStore 被贬低了。可以用啥代替?