在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,
在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候
水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete
语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水
位线在日常的增删操作中只会上涨,不会下跌。
Oracle中Select语句的特性。Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库
中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一下,如果刚才是一张刚刚
建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。
而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候
的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于delete语句不影响高水位线,所以高水位线依然在一千
万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需
要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。所以
有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。
在ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫描将始终读取一个段(extent)中所有低于高水位线标记
的块。如果在执行删除操作后不降低高水位线标记,则将导致查询语句的性能低下。下面的方法都可以降低高水位线标记。
1.厉行表重建号召 alter table table_name move;
(在线迁移表空间ALTER TABLE 。。。 MOVE TABLESPACE 。。。
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
6.尽量truncate 吧
利用MOVE压缩表的高水位线
如果表的高水位线比较高,或者表经历了大数据量的产生操作,经常会使用ALTER TABLE MOVE的方法来减少表占用的空间。
案例介绍:两张表几乎一样大,而且都是空表。但是通过MOVE之后,得到的结果却完全不同。
查看表占用的实际空间。
SELECT SEGMENT_NAME, BYTES/1024/1024/1024 G
FROM USER_SEGMENTS
WHERE SEGMENT_NAME like 'table';
查看表占用的实际空间。
利用move减少表占用的空间并尝试减少水位线。
ALTER TABLE table1 MOVE;
ALTER TABLE table2 MOVE;
重新查看两个表的实际空间,会发现两个表的数据虽然都为0,但是占用的空间相差却比较多。
造成这个现象的原因是由于table1 表只包含的一个初始EXTENT,而这个EXTENT的大小是1G,而table2 则包含很多的64K大小的
EXTENT。
查看用户的建表语句:
SELECT DBMS_METADATA.GET_DDL('TABLE', TABLE_NAME)
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'SAS_RE_REQUEST_MESSAGE%';
会发现INITIAL 参数指定了初始的EXTENT,而table1 的这个EXTENT的大小是1G,而table2则包含很多的64K大小的EXTENT
也就是说MOVE操作会根据原表的INITIAL大小为新表建立第1个EXTENT。MOVE不会自动减少表的初始扩展的大小。
因此对于表T_BIG_TABLE这种情况,执行MOVE的时候应该指定新的存储参数:
SQL> ALTER TABLE T_BIG_TABLE MOVE STORAGE (INITIAL 1M);
oracle 如何查看表 高水位线:
select blocks, empty_blocks from dba_tables where table_name='xxx' and owner='xx';
blocks就是已经分配的空间即HWM,实际分配的空间,不是实际大小
分享到:
相关推荐
Oracle 高水位线 Oracle 高水位线(High Water Mark,HWM)是 Oracle 段中一个重要的概念,它标志着段中已经使用的数据块的上限。在 Oracle 中,每个段(包括表、索引等)都有一个高水位线,用于记录该段已经使用的...
在 Oracle 数据的存储中,可以把存储空间想象为一个水库,数据想象为水 库中的水。水库中的水的位置有一条线叫做水位线,在 Oracle 中,这条线被称为`高水位线(High-warter mark, HWM)
启用行移动后,当执行`ALTER TABLE SHRINK SPACE`时,Oracle会自动移动行到新的位置,从而重置高水位线。 - **收缩表空间**: ```sql ALTER TABLE table_name SHRINK SPACE; ``` 这条命令用于收缩表空间,即...
浅谈ORACLE高水位线的解决方法.pdf
Oracle 12c实验-段和高水位线.pdf Oracle 12c实验-管理表空间.pdf Oracle 12c实验-管理归档重做日志.pdf Oracle 12c实验-管理控制文件.pdf Oracle 12c实验-管理数据文件和临时文件.pdf Oracle 12c实验-管理重做日志....
Oracle的Freelist(自由列表)和HWM(高水位线)是数据库管理中的关键概念,它们直接影响到数据存储的效率和SQL查询性能。本文将深入解析这两个概念及其原理,并探讨相关的性能优化策略。 首先,Oracle的Freelist是...
Oracle 读取表中所有的行,扫描该表中高水位线(HWM, High Water Mark)以下的所有数据块。随着数据量的增加,高水位线会不断上涨,读取的数据块就会不断增加。在做 Delete 操作的时候,即使把表中的数据都删掉了,...
TRUNCATE不会触发删除触发器,不保留ROLLBACK段,且会重置表的高水位线(HWM),释放表空间。但需要注意的是,TRUNCATE不能用于有外键约束的父表,且一旦执行,数据将无法恢复。 在处理大数据量的表时,TRUNCATE...
- TRUNCATE命令快速且无法回滚,它重置高水位线和所有索引;DELETE命令慢一些,但支持回滚。TRUNCATE不触发DELETE触发器,也不能授予他人清空表的权限。 #### 第二章 ORACLE 卸载 本章节讲述了如何卸载Oracle...
表目录区存储了数据块中所包含的数据表的相关信息,如表ID、高水位线等。这些信息对于管理和检索数据至关重要。 ##### 3. 行目录区(Row Directory) 行目录区记录了数据块中每一行数据的具体位置信息,即每个数据...
在执行全表扫描时,Oracle会从表的头部读取数据直至高水位线(HWM),即使表中的数据已被删除也是如此。值得注意的是,`TRUNCATE`操作可以清除表的所有数据,并将HWM重置到表的头部,从而在下一次执行全表扫描时减少...
- **高水位线影响**:`TRUNCATE` 会重置表的高水位线 (High Water Mark, HWM),这会影响后续插入数据时的空间分配策略;而 `DELETE` 不会改变 HWM。 #### 2. Oracle常用函数 - **字符串处理函数**: - `LENGTH()`...
- 直接在表段的高水位线以上写入数据,不重用低水位线以下的空间。 - 示例命令: ``` insert /*+ append */ into t1 select * from t; commit; ``` #### 总结 通过对Oracle数据库中的大数据量操作采取上述...
此外,还可以查询数据库当前的高水位线(High Water Mark),即最大并发连接数: ```sql SQL> select * from v$license where name = 'sessions_highwater'; ``` #### 九、查询锁定对象 当多个事务试图访问同一...