DM8伪列的使用

 伪列概述

DM伪列在语法上和表中的列很相似,查询时能返回一个值,但实际上伪列在表中并不存在。用户可以对伪列进行查询,但不能插入、更新和删除它们的值。DM支持的伪列有:ROWNUM,ROWID,USER,UID,TRXID等。

  • rowid

DM 中行标识符 ROWID 用来标识数据库基表中每一条记录的唯一键值,标识了数据记录的确切的存储位置。如果用户在选择数据的同时从基表中选取 ROWID,在后续的更新语句中,就可以使用 ROWID 来提高性能。如果在查询时加上 FOR UPDATE 语句,该数据行就会被锁住,以防其他用户修改数据,保证查询和更新之间的一致性。

SQL> select employee_id,employee_name,salary,rowid from DMHR.EMPLOYEE where rowid = 2; 

行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      ROWID               
---------- ----------- ------------- ----------- --------------------
1          1002        程擎武     9000        2

已用时间: 54.530(毫秒). 执行号:1920.
SQL> update DMHR.EMPLOYEE set salary = 10000 where rowid = 2;
影响行数 1

已用时间: 77.662(毫秒). 执行号:1921.
SQL> commit;
操作已执行
已用时间: 35.668(毫秒). 执行号:1922.
SQL> select employee_id,employee_name,salary,rowid from DMHR.EMPLOYEE where rowid = 2;

行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      ROWID               
---------- ----------- ------------- ----------- --------------------
1          1002        程擎武     10000       2

已用时间: 0.732(毫秒). 执行号:1923.
SQL> 
  • rownum

rownum表示从表中查询或者连接查询的行号,值为1...N,N是行的数量。rownum一个重要作用是:限制查询返回行数。例如,我们只想看到前5行数据,可以这样写:

SQL> select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum <= 5;

行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      ROWNUM              
---------- ----------- ------------- ----------- --------------------
1          1001        马学铭     30000       1
2          1002        程擎武     10000       2
3          1003        郑吉群     15000       3
4          1004        陈仙        12000       4
5          1005        金纬        10000       5

已用时间: 0.820(毫秒). 执行号:1975.
SQL> 

 特点一:一个rownum值不是被永久的分配给一行数据的。表中的某一行并没有标号,不可以查询rownum为某个值的行。rownum值只有当被分配之后才会增长,初始值为1。只有满足一行后,rownum才会加1,否则维持原值不变。因此,以下语句在任何时候都不能返回数据:

SQL> select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum > 5;
未选定行

已用时间: 2.514(毫秒). 执行号:1976.
SQL> select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum = 5;
未选定行

已用时间: 44.993(毫秒). 执行号:1977.
SQL> 

特点二:rownum值的分配是在查询的谓词解析之后,任何排序和聚合之前进行的.因此,在排序和聚合使用 ROWNUM 时需要注意,可能得到并非预期的结果。例如,我们要查询工资最高的5个人的信息:

SQL> select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE where rownum <= 5 order by salary desc;

行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      ROWNUM              
---------- ----------- ------------- ----------- --------------------
1          1001        马学铭     30000       1
2          1003        郑吉群     15000       3
3          1004        陈仙        12000       4
4          1005        金纬        10000       5
5          1002        程擎武     10000       2

已用时间: 2.738(毫秒). 执行号:1938.
SQL> 

 以上语句只会对EMPLOYEE表前5行按工资排序输出,并不是按表的所有数据排序后输出前5行,要实现后者,需要使用以下语句:

select * from (select employee_id,employee_name,salary,rownum from DMHR.EMPLOYEE order by salary desc) where rownum <= 5;

或者

select top 5 employee_id,employee_name,salary,rownum from DMHR.employee order by salary desc;

 rownum的使用存在以下限制:

1.在查询中,ROWNUM 可与任何数字类型表达式进行比较及运算,但不能出现在含OR 的布尔表达式中,否则报错处理;
2.ROWNUM 可以在非相关子查询中使用;当参数 ENABLE_RQ_TO_INV 等于 1 时,部分相关子查询支持使用;
3.在非相关子查询中,ROWNUM只能实现与TOP相同的功能,因此子查询不能含ORDER BY 和 GROUP BY;                                                                                                                   4.ROWNUM 所处的子谓词只能为如下形式: ROWNUM op exp,exp 的类型只能是立即数、参数和变量值,op ∈ {<, <=, >, >=, =, <>}。

  • uid和user

user和 uid分别用来表示当前用户的用户名和用户标识。

SQL> select top 5 employee_id,employee_name,salary,user,uid from DMHR.employee order by salary desc;

行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      USER() UID        
---------- ----------- ------------- ----------- ------ -----------
1          1001        马学铭     30000       SYSDBA 50331649
2          3001        苏国华     30000       SYSDBA 50331649
3          7001        郑晓同     30000       SYSDBA 50331649
4          7241        高念        19990       SYSDBA 50331649
5          7240        陈珂        19980       SYSDBA 50331649

已用时间: 1.021(毫秒). 执行号:1956.
SQL> select user(),uid;

行号     USER() UID        
---------- ------ -----------
1          SYSDBA 50331649

已用时间: 55.743(毫秒). 执行号:1957.
SQL>
  •  trxid

trxid用来表示当前事务的事务标识。

SQL> select top 5 employee_id,employee_name,salary,trxid from DMHR.employee order by salary desc;

行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      TRXID               
---------- ----------- ------------- ----------- --------------------
1          1001        马学铭     30000       3882
2          3001        苏国华     30000       3877
3          7001        郑晓同     30000       3877
4          7241        高念        19990       3877
5          7240        陈珂        19980       3877

已用时间: 29.561(毫秒). 执行号:1960.
SQL>
  • sessid

sessid用来表示当前会话的 ID 标识。

SQL> select top 5 employee_id,employee_name,salary,sessid from DMHR.employee order by salary desc;

行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      SESSID              
---------- ----------- ------------- ----------- --------------------
1          1001        马学铭     30000       139625026624328
2          3001        苏国华     30000       139625026624328
3          7001        郑晓同     30000       139625026624328
4          7241        高念        19990       139625026624328
5          7240        陈珂        19980       139625026624328

已用时间: 0.977(毫秒). 执行号:1964.
SQL>
  • phyrowid

 phyrowid 用来表示当前记录的物理存储信息。 

       PHYROWID 值由聚集 B 树或二级 B 树中物理记录的文件号、页号、页内槽号组成,能体现聚集 B 树或二级 B 树的存储信息,聚集 B 树记录的最高位为 1。
       当查询语句中实际使用 CSCN、CSEK、BLKUP 操作符时,PHYROWID 内容是聚集 B 树中记录的物理存储地址;当查询语句中实际仅使用 SSEK、SSCN 操作符时,PHYROWID 内容是二级 B 树中记录的物理存储地址。

SQL> select top 5 employee_id,employee_name,salary,phyrowid from DMHR.employee order by salary desc;

行号     EMPLOYEE_ID EMPLOYEE_NAME SALARY      PHYROWID            
---------- ----------- ------------- ----------- --------------------
1          1001        马学铭     30000       4611686018439970817
2          3001        苏国华     30000       4611686018440757255
3          7001        郑晓同     30000       4611686018440757271
4          7241        高念        19990       4611686018440364084
5          7240        陈珂        19980       4611686018440364083

已用时间: 1.283(毫秒). 执行号:1969.
SQL>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值