设为首页 收藏本站
查看: 1308|回复: 0

[经验分享] Oracle ROWID 方式访问数据库

[复制链接]

尚未签到

发表于 2016-7-26 11:57:13 | 显示全部楼层 |阅读模式
   和ROWNUM一样,ROWID是一个伪列,即是一个非用户定义的列,而又实际存储于数据库之中。每一个表都有一个ROWID列,一个ROWID值用于
唯一确定数据库表中的的一条记录。因此通过ROWID 方式来访问数据也是 Oracle 数据库访问数据的实现方式之一。一般情况下,ROWID方式的
访问一定以索引访问或用户指定ROWID作为先决条件,因为所有的索引访问方式最终都会转换为通过ROWID来访问数据记录。(注:index full
scan 与index fast full scan除外)由于Oracle ROWID能够直接定位一条记录,因此使用ROWID方式来访问数据,极大提高数据的访问效率。

-->查看表上rowidscott@CNMMBO> select rowid,empno,ename from emp where deptno=20;ROWID                   EMPNO ENAME------------------ ---------- ----------AAATTBAALAAAAuUAAA       7369 SMITHAAATTBAALAAAAuUAAD       7566 JONESAAATTBAALAAAAuUAAH       7788 SCOTTAAATTBAALAAAAuUAAK       7876 ADAMSAAATTBAALAAAAuUAAM       7902 FORD-->下面使用rowid来进行访-->以下演示中忽略了物理读,仅考虑逻辑读的情形scott@CNMMBO> set autot trace;scott@CNMMBO> select empno,ename from emp where rowid='AAATTBAALAAAAuUAAA';Execution Plan----------------------------------------------------------Plan hash value: 1116584662-----------------------------------------------------------------------------------| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |-----------------------------------------------------------------------------------|   0 | SELECT STATEMENT           |      |     1 |    22 |     1   (0)| 00:00:01 ||   1 |  TABLE ACCESS BY USER ROWID| EMP  |     1 |    22 |     1   (0)| 00:00:01 |-----------------------------------------------------------------------------------Statistics----------------------------------------------------------1  recursive calls     0  db block gets1  consistent gets     0  physical reads--此时执行计划中操作1为TABLE ACCESS BY USER ROWID,注意此时为USER ROWID,表明由用户直接调用产生--统计信息中的consistent gets为1,即只需要根据rowid即可返回数据 --使用多个rowid的情形scott@CNMMBO> select empno,ename from emp where rowid in ('AAATTBAALAAAAuUAAA','AAATTBAALAAAAuUAAD');Execution Plan----------------------------------------------------------Plan hash value: 1106538681------------------------------------------------------------------------------------| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |------------------------------------------------------------------------------------|   0 | SELECT STATEMENT            |      |     1 |    22 |     1   (0)| 00:00:01 ||   1 |  INLIST ITERATOR            |      |       |       |            |          ||   2 |   TABLE ACCESS BY USER ROWID| EMP  |     1 |    22 |     1   (0)| 00:00:01 |------------------------------------------------------------------------------------Statistics----------------------------------------------------------1  recursive calls0  db block gets2  consistent gets0  physical reads--上面的执行计划中出现了INLIST ITERATOR,即INLIST迭代,该操作说明其子操作多次重复时,会出现该操作。--由于我们使用了in运算,且传递了2个rowid,故出现INLIST迭代操作--迭代操作意味着条件中的对象列表一个接一个的迭代传递给子操作--此时统计信息中的consistent gets为2,因为一个rowid一次逻辑运算--下面来看看直接使用列来访问表的情形scott@CNMMBO> select empno,ename from emp where empno=7369;Execution Plan----------------------------------------------------------Plan hash value: 2949544139--------------------------------------------------------------------------------------| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time     |--------------------------------------------------------------------------------------|   0 | SELECT STATEMENT            |        |     1 |    10 |     1   (0)| 00:00:01 ||   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    10 |     1   (0)| 00:00:01 ||*  2 |   INDEX UNIQUE SCAN         | PK_EMP |     1 |       |     0   (0)| 00:00:01 |--------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - access("EMPNO"=7369)Statistics----------------------------------------------------------1  recursive calls0  db block gets2  consistent gets0  physical reads--在通过谓词访问表时,此执行计划中使用了INDEX UNIQUE SCAN扫描方式--此时先实施INDEX UNIQUE SCAN,然后将该操作的结果传递给父操作TABLE ACCESS BY INDEX ROWID来定位记录--此时也给出了谓词信息:2 - access("EMPNO"=7369)--此时的逻辑读consistent gets的值是2,即一次读索引,一次通过rowid读表上的数据块--下面来看看直接使用列且使用in访问多条记录的情形scott@CNMMBO> select empno,ename from emp where empno in (7369,7566);Execution Plan----------------------------------------------------------Plan hash value: 1899965127---------------------------------------------------------------------------------------| Id  | Operation                    | Name   | Rows  | Bytes | Cost (%CPU)| Time     |---------------------------------------------------------------------------------------|   0 | SELECT STATEMENT             |        |     2 |    20 |     2   (0)| 00:00:01 ||   1 |  INLIST ITERATOR             |        |       |       |            |          ||   2 |   TABLE ACCESS BY INDEX ROWID| EMP    |     2 |    20 |     2   (0)| 00:00:01 ||*  3 |    INDEX RANGE SCAN          | PK_EMP |     2 |       |     1   (0)| 00:00:01 |---------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------3 - access("EMPNO"=7369 OR "EMPNO"=7566)Statistics----------------------------------------------------------1  recursive calls0  db block gets5  consistent gets0  physical reads--此时执行计划中的索引扫描方式变成了索引范围扫描INDEX RANGE SCAN--由于存在in操作,因此此时在第2步也出现了迭代操作--此处的逻辑读consistent gets的值是5 ?  为什么是 5 呢? 下面来分析看看scott@CNMMBO> alter system flush shared_pool;scott@CNMMBO> alter system flush buffer_cache;scott@CNMMBO> set serveroutput off;scott@CNMMBO> set autot off;scott@CNMMBO> select /*+ gather_plan_statistics */ empno,ename from emp where empno in (7369,7566);EMPNO ENAME---------- ----------7369 SMITH7566 JONESscott@CNMMBO> select * from table(dbms_xplan.display_cursor(null,null,'iostats last'));PLAN_TABLE_OUTPUT----------------------------------------------------------------------------SQL_ID  373xnw8s521t4, child number 0-------------------------------------select /*+ gather_plan_statistics */ empno,ename from emp where empno in (7369,7566)Plan hash value: 1899965127----------------------------------------------------------------------------------------------------------| Id  | Operation                    | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |----------------------------------------------------------------------------------------------------------|   1 |  INLIST ITERATOR             |        |      1 |        |      2 |00:00:00.01 |       5 |      2 ||   2 |   TABLE ACCESS BY INDEX ROWID| EMP    |      2 |      2 |      2 |00:00:00.01 |       5 |      2 ||*  3 |    INDEX RANGE SCAN          | PK_EMP |      2 |      2 |      2 |00:00:00.01 |       3 |      1 |----------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------3 - access(("EMPNO"=7369 OR "EMPNO"=7566))--从上面的执行计划可知,2次索引扫描,2次rowid扫描,加上1次迭代,因此总的consistent gets为5。--与此类似的使用基于rowid的update操作,其性能同样高于直接使用列来实现update操作,此处不再演示--使用rowid删除重复记录的示例DELETE FROM emp e                                                                     WHERE  e.ROWID > (SELECT MIN( x.ROWID )     FROM   emp x                                                       WHERE  x.empno = e.empno);  --Author: Robinson Cheng--Blog :  http://blog.csdn.net/robinson_0612--总结:使用rowid访问数据时可以减少逻辑读的数量,因为一个rowid能唯一定位一条记录尽管rowid能极大程度的提高数据的访问效率,然而由于其不易识别性(为十六进制)在大量数据访问时并不易于使用   更多参考
  Oracle ROWID
  NULL 值与索引(一)
  NULL 值与索引(二)

  SQL tuning 步骤
  
  高效SQL语句必杀技

  父游标、子游标及共享游标
  绑定变量及其优缺点
  dbms_xplan之display_cursor函数的使用
  dbms_xplan之display函数的使用
  执行计划中各字段各模块描述
  使用 EXPLAIN PLAN 获取SQL语句执行计划
  启用 AUTOTRACE 功能
  函数使得索引列失效
  Oracle 绑定变量窥探
  Oracle 自适应共享游标
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-249669-1-1.html 上篇帖子: Oracle数据性能优化的若干诀窍 下篇帖子: Oracle 物化视图 快速刷新 限制 说明
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表