关于Oracle数据库中的undo回滚段
Oracle数据库当中,关于日志与回滚那一部分,与别的数据库确实有很大的不同。为了避免在写日志的同时后台进程对日志文件的读操作,Oracle使用了单独的回滚段来记录“旧”的数据。这样可以达到并行读写的目的,整体I/O效率提高了不少,但也引入了一些问题。
最经典的莫过于ORA-01555:snapshot too old错误了。
1.什么操作产生最多的撤消?
Insert产生最小的撤消,但是应该产生相当多的redo数据。因为undo回滚面只需要记录要“删除”那些新行的id。
Update一般是第二位(通常情况下),所要做的是记录修改过的字段值,常见的情况是update整行数据的一小部分。
Delete才会产生最多的撤消,一个事务有可能就是delete一张超大的表,结果导致回滚段不够用,出现上述错误。
2.set transaction语句调用回滚段
Set transaction语句用于“选择”事务要使用的回滚段。这主要是为了对某些较大的操作能够确保有大的回滚段。对于某些特定的事务,可能有必要这么做。
若有必要的话,可以进行一个最优的设置,让回滚段扩展到一定大小后缩小为原来大小,因为不必拥有一个特别的“大回滚段”。
最经典的莫过于ORA-01555:snapshot too old错误了。
1.什么操作产生最多的撤消?
Insert产生最小的撤消,但是应该产生相当多的redo数据。因为undo回滚面只需要记录要“删除”那些新行的id。
Update一般是第二位(通常情况下),所要做的是记录修改过的字段值,常见的情况是update整行数据的一小部分。
Delete才会产生最多的撤消,一个事务有可能就是delete一张超大的表,结果导致回滚段不够用,出现上述错误。
2.set transaction语句调用回滚段
Set transaction语句用于“选择”事务要使用的回滚段。这主要是为了对某些较大的操作能够确保有大的回滚段。对于某些特定的事务,可能有必要这么做。
若有必要的话,可以进行一个最优的设置,让回滚段扩展到一定大小后缩小为原来大小,因为不必拥有一个特别的“大回滚段”。