通过最近一段时间看书,对数据库垃圾数据这块不太明白,请大家帮看看下面几个问题
1、关于 ORACLE的垃圾数据都怎么产生的啊?比如说DELETE、未COMMIT的数据,还有那些?
2、这些垃圾数据的都会导致高水位线的升高吗?
3、对不同的垃圾数据是怎么处理的啊?有自动清洗机制吗?
1、关于 ORACLE的垃圾数据都怎么产生的啊?比如说DELETE、未COMMIT的数据,还有那些?
2、这些垃圾数据的都会导致高水位线的升高吗?
3、对不同的垃圾数据是怎么处理的啊?有自动清洗机制吗?
在ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫描将始终读取一个段(extent)中所有低于高水位线标记的块。如果在执行删除操作后不降低高水位线标记,则将导致查询语句的性能低下。
下面的方法都可以降低高水位线标记。
1. 执行表重建指令 alter table table_name move;
在线转移表空间ALTER TABLE ... MOVE TABLESPACE ..
当你创建了一个对象如表以后,不管你有没有插入数据,它都会占用一些块,ORACLE也会给它分配必要的空间.同样,用ALTER TABLE MOVE释放自由空间后,还是保留了一些空间给这个表.
ALTER TABLE ... MOVE 后面不跟参数也行,不跟参数表还是在原来的表空间,Move后记住重建索引. 如果以后还要继续向这个表增加数据,没有必要move, 只是释放出来的空间,只能这个表用,其他的表或者segment无法使用该空间。
2. 执行alter table table_name shrink space;
注意,此命令为Oracle 10g新增功能,再执行该指令之前必须允许行移动 alter table table_name enable row movement;
3. 复制要保留的数据到临时表t,drop原表,然后rename临时表t为原表
4. 用逻辑导入导出: Emp/Imp
5. Alter table table_name deallocate unused
注:这证明,DEALLOCATE UNUSED为释放HWM上面的未使用空间,但是并不会释放HWM下面的自由空间,也不会移动HWM的位置.
6. 尽量使用truncate.
下面的方法都可以降低高水位线标记。
1. 执行表重建指令 alter table table_name move;
在线转移表空间ALTER TABLE ... MOVE TABLESPACE ..
当你创建了一个对象如表以后,不管你有没有插入数据,它都会占用一些块,ORACLE也会给它分配必要的空间.同样,用ALTER TABLE MOVE释放自由空间后,还是保留了一些空间给这个表.
ALTER TABLE ... MOVE 后面不跟参数也行,不跟参数表还是在原来的表空间,Move后记住重建索引. 如果以后还要继续向这个表增加数据,没有必要move, 只是释放出来的空间,只能这个表用,其他的表或者segment无法使用该空间。
2. 执行alter table table_name shrink space;
注意,此命令为Oracle 10g新增功能,再执行该指令之前必须允许行移动 alter table table_name enable row movement;
3. 复制要保留的数据到临时表t,drop原表,然后rename临时表t为原表
4. 用逻辑导入导出: Emp/Imp
5. Alter table table_name deallocate unused
注:这证明,DEALLOCATE UNUSED为释放HWM上面的未使用空间,但是并不会释放HWM下面的自由空间,也不会移动HWM的位置.
6. 尽量使用truncate.
楼上很好的回答了怎么降低高水位的问题,DELETE肯定是造成水位上升的,我想问的重点是ORACLE有没有除了INSERT回滚、DELETE造成ORACLE垃圾数据导致高水位上升外,向未COMMIT,但是也没有回滚的数据,或还有别的情况造成的垃圾怎么处理的,是否与高水位有关系。希望大家帮看下我想问的问题。谢谢
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27784382/viewspace-743066/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27784382/viewspace-743066/