一般来讲,INSERT 生成的 undo 最少,因为 Oracle 为此需记录的只是要“删除”的一个rowid(行ID) 。UPDATE 一般排名第二(在大多数情况下)。DELETE生成的 undo最多。与加索引列的更新相比,对一个未加索引的列进行更新不仅执行得更快,生成的 undo 也会好得多。而更新有索引的列则可能生成大量的undo,因为索引结构本身所固有的复杂性,而且我们更新了这个表中的每一行,移动了这个结构中的索引键值。【验证知识】
一、测试目标:
DML语句操作使用UNDO表空间新增大小的情况测试
二、测试内容
对单一表HIS_Recipe_Test进行INSERT、DELETE、UPDATE相关操作,记录各个DML操作占用UNDO表空间的情况。
三、测试步骤
1、Create Table His_Recipe_Test。
2、查询UNDO表空间已被使用32.687MB。
3、INSERT INTO HIS_RECIPE_TEST表100万条记录。
4、查询第3步INSERT后的UNDO表空间已被使用35.75MB,与第2步求差值得出第3步新增UNDO表空间3.063MB
5、执行DELETE * FROM HIS_RECIPE_TEST删除200万条记录。
6、查询第5步DELTE后的UNDO表空间已被使用538.75MB,与第3步求差值得出第6步新增UNDO表空间503.00MB
7、执行INSERT INTO HIS_RECIPE_TEST表4532279条记录。
8、查询UNDO查询新增UNDO表空间18MB
9、将100万数据分成1000次删除记录,测试后发现UNDO表空间新增255MB空间
四、测试结果
测试完成后,得出如下结论:
1、占用UNDO表空间大小的DML操作:DELETE > UPDATE > INSERT
2、不管海量或分次DML语句操作数据,其占用的UNDO表空间大小相差不大。
3、频繁的大数据量DML操作数据,会造成UNDO表空间消耗极大,甚至不能满足ORACLE的所有活动事务。
五、补充(经历过)
UNDO表空间太小不能满足使用它的所有活动事务,那么会发生以下情况:
1、 如果撤销表空间用完85%,Oracle将发布一个自动表空间警告
2、 当撤销表空间用完97%时,Oracle将发布一个自动表空间严重警告
3、 所有DML语句将不允许,并且会接收到一个空间超出错误
4、 DDL语句允许继续执行
分析验证什么DML操作会生成最多和最少的 undo
最新推荐文章于 2024-03-07 00:21:24 发布