ORACLE中索引会产生重做日志么

flzhang 2009-12-16 05:51:13
问下大家,ORACLE 11G在做有索引的字段上做insert或update或delete操作时,除了操作本身产生的重做日志外,索引会产生重做日志么?为什么有的书上总说减少nologging index的开销呢? 请大家帮忙回答下, 谢谢了!
...全文
341 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
flzhang 2009-12-18
  • 打赏
  • 举报
回复
呵呵,涨见识了,多谢各位,发分了!
flzhang 2009-12-17
  • 打赏
  • 举报
回复
楼上的,你是说如果执行这样的语句
select * from author where a_id='1'
或 insert into author(a_id) value('2');

在a_id上如果有索引 不管是select还是insert操作ORACLE都会产生重做日志么?
wh62592855 2009-12-17
  • 打赏
  • 举报
回复
select一般情况下是不会产生REDO的 除非需要延迟块清除的时候
至于延迟块清除这个概念有些深入了 如果你想了解的可以参考下面的链接
http://blog.csdn.net/wh62592855/archive/2009/10/26/4730623.aspx

还有 你的对select、insert和索引的关系肯能有些不太清楚
select和insert执行的过程中都会牵扯到索引
select只是通过索引更快的找到需要的数据而已 不会对索引进行修改 因此不会产生索引相关的REDO 就算产生了REDO 那么就是前面所说的延迟块清除导致的

而insert是往表里插入一条数据 这个时候在索引中也要相应的插入一条数据
不然你下次如何通过索引找到这条新插入的数据呢? 对吧 呵呵
liuyi8903 2009-12-17
  • 打赏
  • 举报
回复
如果有大批量的加载,而没有分段提交的话就有可能有这个情况的。

flzhang 2009-12-17
  • 打赏
  • 举报
回复
请问wh62592855
select * from author where a_id='1'
COMMIT

我在SQLPLUS里执行了这两句话,查看他的执行计划发现 REDO SIZE=0
那是不是说select中用到了索引,就不会产生redo,但insert中用到索引,索引还会产生额外的redo呢?

还有liuyi8903您说的select时块延迟清除时是什么时候啊?不知是什么意思?压力测试中会块延迟清除么


liuyi8903 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 flzhang 的回复:]
楼上的,你是说如果执行这样的语句
select * from author where a_id='1'
或 insert into author(a_id) value('2');

在a_id上如果有索引 不管是select还是insert操作ORACLE都会产生重做日志么?
[/Quote]

inserto当然会啊,但select 就不一定了,如果涉及到块延迟清除的话第一次也会产生redo
wh62592855 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 flzhang 的回复:]
问下大家,ORACLE 11G在做有索引的字段上做insert或update或delete操作时,除了操作本身产生的重做日志外,索引会产生重做日志么?为什么有的书上总说减少nologging index的开销呢?    请大家帮忙回答下, 谢谢了!
[/Quote]
1
索引也会产生相应的重做日志的
这样才能保证在应用日志恢复的时候相应的索引也会被更改

2
nologging并不代表就完全不产生重做日志
和其他很多因素有关
比如说数据库的模式(归档或者非归档)
表的创建模式 NOLOGGING或者LOGGING
插入数据的模式 APPEND或者NOAPPEND
zhangivan 2009-12-17
  • 打赏
  • 举报
回复
关注。up
liuyi8903 2009-12-16
  • 打赏
  • 举报
回复
另外,index也是要产生redo的。
liuyi8903 2009-12-16
  • 打赏
  • 举报
回复
nologgiing是不一定不产生redo的,建议楼主好好实验一下。是减少而不是不产生。

archivelog和noarchivelog下又不一样。
Dave 2009-12-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 flzhang 的回复:]
问下大家,ORACLE 11G在做有索引的字段上做insert或update或delete操作时,除了操作本身产生的重做日志外,索引会产生重做日志么?为什么有的书上总说减少nologging index的开销呢?    请大家帮忙回答下, 谢谢了!
[/Quote]

个人觉得不会, 当对有索引的字段做更新时,表会产生undo前镜像,并对索引进行相应的更新。所以对有索引的表做插入的时候,如果是写日志的情况下,表需要写redo log, 如果是大量的插入会很耗时。

如果表是在nologing 的模式下, 就不会写redo log日志,这样插入的速度会块很多。







------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
Q Q 群:62697716
huangyunzeng2008 2009-12-16
  • 打赏
  • 举报
回复
我觉得应该不会有吧!而且也没这个必要吧!难道恢复时还要用到索引不成!
bzcnc 2009-12-16
  • 打赏
  • 举报
回复
帮楼主顶一下,我不是很了解
crazylaa 2009-12-16
  • 打赏
  • 举报
回复
似乎delete整个表的数据以后,索引数据还在,所以要经常reorg 索引。
我也想知道答案,关注。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧