当前位置:  数据库>oracle

Oracle 直接路径操作

    来源: 互联网  发布时间:2017-04-12

    本文导语: 总结:直接路径插入直接在高水位线以外分配空间,绕过了数据缓冲区,直接将数据插入进表所在数据文件中。直接路径插入不产生Redo和Undo Log,依赖高水点实现回滚。直接路径插入结束的时候Oracle会维护索引,为了避免维护索...

总结:
直接路径插入直接在高水位线以外分配空间,绕过了数据缓冲区,直接将数据插入进表所在数据文件中。
直接路径插入不产生Redo和Undo Log,依赖高水点实现回滚。
直接路径插入结束的时候Oracle会维护索引,为了避免维护索引的性能影响,可以先删除索引,等插入完成后重新建立。
直接路径插入会导致对被插入的表加表级锁,在提交之前,别的会话不能再对此表进行insert, update, delete等操作。



 一、直接路径插入与间接路径插入的不同
    这个问题相信很多人都已经知道了,为了方便初学者,我再来重审一遍。
create table 表1 as select 列1,列2,... select 表2
insert /*+append*/ into 表1 select 列1,列2,... select 表2
    如上形式的插入,都叫做直接路径插入。当然,在SQL*Loader中也有直接路径插入的形式。
    所谓直接路径插入,就是绕过Buffer cache,直接将数据插入进表所在数据文件中。
    假如有表AA,要将AA中的数据插入进表BB,在普通的间接插入下,先将AA的数据块传进Buffer cache,再将BB的块也传进Buffer cache,在Buffer cache中从AA的块中读出行,插入进BB的块中。BB的块就都变成了脏块,再等待DBWn把它们写进数据文件。因此,间接路径插入后,AA表的块和BB表的块都会在Buffer cache中出现。
    而直接路径插入下,将AA表的数据块传进Buffer cache中,读出行,直接写进BB表所在的数据文件。插入完毕后,除了表头块外,BB表的数据块并不会出现在Buffer cache中。
    下面来试验一下:
步1:准备试验用表:
SQL> create table aa(id number(4),name varchar2(5));
表已创建。
SQL> create table bb(id number(4),name varchar2(5));
表已创建。
SQL> insert into aa values(1,'aa');
已创建 1 行。
SQL> insert into aa values(2,'bb');
已创建 1 行。
SQL> insert into aa values(3,'cc');
已创建 1 行。
SQL> insert into aa values(4,'dd');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from aa;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                   4                                18493
                                   4                                18493
                                   4                                18493
                                   4                                18493
    现在AA表中有4行,占用块18493。BB表中没有数据。
步2:将buffer cache清空,我这里使用重启数据库的方法:
SQL> shutdown immediate
SQL> startup
步3:先用直接路径插入,从AA表向BB表插入数据:
SQL> insert /*+ append*/ into bb select * from aa;
已创建4行。
SQL> commit;
提交完成。
步4:使用V$bh查看Buffer cache中的块:
SQL> select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='AA');
     FILE#     BLOCK#
---------- ----------
         4      18491
         4      18491
         4      18494
         4      18492
         4      18495
         4      18493   select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='BB');
     FILE#     BLOCK#
---------- ----------
         4      18499
         4      18499
         4      18497
SQL> select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from bb;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                   4                                18500
                                   4                                18500
                                   4                                18500
                                   4                                18500
    上面两个查询可以看到,BB表中的数据占用第18500块,但是,直接路径插入后,18500块并没被调进Buffer cache。Buffer cache中只有18499和18497。 其中18499是段头块,而18497是L1块,直接路径插入后,要修改L1块中的数据块使用情况。
步5:再试一次间接路径插入:
SQL> insert into bb select * from aa;
已创建4行。
SQL> commit;
提交完成。
SQL> select file#,block# from v$bh where objd=(select data_object_id from user_objects where object_name='BB');
     FILE#     BLOCK#
---------- ----------
         4      18504    select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from bb;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                   4                                18500
                                   4                                18500
                                   4                                18500
                                   4                                18500
                                   4                                18504
                                   4                                18504
                                   4                                18504
                                   4                                18504
已选择8行。
    从上面的实验可以证明,间接路径插入,要先将数据块传进Buffer cache。这是Oracle通常修改数据的方式,不对数据文件直接进行修改,而是在内存中完成修改,再由日志提供保护。对于小量数据的修改,这种方法的性能还是很不错的。但是大量数据的修改,直接路径插入将可以提供更好的性能。
    直接路径插入除去少了将BB表的块传进Buffer cache这一步外,它还不产生回滚信息,下面来进一步的实验:

































































































    
 
 

您可能感兴趣的文章:

  • 在jsp文件中怎么设置oracle的路径:很简单的,只是因为我不会;
  • Oracle 10g各个帐号的访问权限、登录路径、监控状态命令查询等等
  • ORACLE日期相关操作
  • Linux下如何用C语言操作Oracle数据库相关的图书推荐
  • Oracle终于涉入支持Linux操作系统了
  • Linux平台下Oracle的操作
  • linux c 怎样利用pro*c/c++操作 win2000 下 oracle 谢谢
  • Window客户端通过ADO是否能够连接和操作Unix平台下的Oracle数据库?
  • Oracle将字符编码从GBK转到UTF8,如何操作比较稳妥?
  • 如何设定linux red hat 9的oracle9,让window的电脑可以操作数据库
  • linux oracle数据库删除操作指南
  • Linux环境中Oracle数据导入与导出备份操作
  • Oracle针对数据库某一行进行操作的时候,如何将这一行加行锁
  • oracle的plsql里有没有位操作的功能
  • fedora core5 (FC5) 下面不能装 Oracle 10g 么? (检查操作系统就通不过啊,晕)
  • Linux操作系统下Oracle数据库多实例启动方式及修改内存
  • 怎样在c语言的代码里内嵌的操作oracle数据库,各位大虾谢谢了
  • 一个关于JAVA操作oracle数据库时UPDATE权限的问题
  • Oracle中操作分页
  • Oracle 数据库操作技巧集
  • secureCRT远程连接服务器操作oracle数据库出现的问题
  • 请教各位:JAVA操作ORACLE的问题 急!!!
  • 学习登录oracle数据库时常用的操作命令
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Linux环境中Oracle数据导入与导出备份操作 iis7站长之家
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE数据库常用字段数据类型介绍
  • Linux系统下Oracle的启动与Oracle监听的启动
  • Oracle 12c的九大最新技术特性介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • ORACLE中DBMS_RANDOM随机数生成包
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3