Maison > base de données > tutoriel mysql > 理解redo(11)truncate和select的redo

理解redo(11)truncate和select的redo

WBOY
Libérer: 2016-06-07 17:58:19
original
1162 Les gens l'ont consulté

很多系统,在作删除操作时,都只是做一个标志位,并不会去做磁盘置0那样昂贵的操作。truncate也如是,更改的只是segment header和i-node表。truncate 会产生redo,是修改数据字典产生的,不是删除数据来的。truncate降低HWM,释放extent,重新生成data_object

很多系统,在作删除操作时,都只是做一个标志位,并不会去做磁盘置0那样昂贵的操作。truncate也如是,更改的只是segment header和i-node表。truncate 会产生redo,是修改数据字典产生的,不是删除数据来的。truncate降低HWM,释放extent,重新生成data_object_id。之所以比delete快,是因为它根本不需要删除数据,redo只是记录这个操作本身而不会有大量数据的redo记录。因此,对于truncate操作,如果我们知道以前的data_object_id,并且空间未被重用,我们仍然可以找回数据。

什么情况下select会产生redo ?

1`)快速块清除或者叫commit clean out。事务提交的时候,Oracle针对内存里的块:

a)把数据块ITL  ENTRY里flag的标记为U

b)设置commit scn在Scn/Fsc列

有了这两个标记就可以告诉全世界这个事务已经提交。但ITL ENTRY 的Lck标志和每个数据行头的lb(锁定位信息)并不会清除。Oracle 做commit clean out并不会产生日志,这个你可能会感到比较奇怪,修改了块,但是却没产生日志。其实这个产生日志的过程在后面的完整的块清除的时候才做。也就是我们下一次select到这个数据块的时候。

2)延迟块清除。事务提交的时候,事务修改的块已经不在内存里了,这个时候,Oracle不会再从磁盘把块读取到内存里做块清除,而是在下一次读取数据块的时候,做块清除的动作。这个块清除的动作会产生Redo。

另外,因为存在递归等操作,若是对某个事务产生的redo进行会话级的丈量,可能有失偏颇,合理的是,基于实例级的测量:

select name,value from v$sysstat where name='redo size'; 
Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal