`
PolyAngel
  • 浏览: 112469 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

ORACLE水位线

 
阅读更多

  在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高水位线进行了详细的总结

    高水位线详解

    在 Oracle 数据的存储中,可以把存储空间想象为一个水库,数据想象为水 库中的水。水库中的水的位置有一条线叫做水位线,在 Oracle 中,这条线被称为`高水位线(High-warter mark, HWM)

    浅谈ORACLE高水位线的解决方法.pdf

    浅谈ORACLE高水位线的解决方法.pdf

    Oracle 12c体系结构学习实验笔记

    Oracle 12c实验-段和高水位线.pdf Oracle 12c实验-管理表空间.pdf Oracle 12c实验-管理归档重做日志.pdf Oracle 12c实验-管理控制文件.pdf Oracle 12c实验-管理数据文件和临时文件.pdf Oracle 12c实验-管理重做日志....

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    3.1.4 全扫描与高水位线 60 3.2 索引扫描访问方法 65 3.2.1 索引结构 66 3.2.2 索引扫描类型 68 3.2.3 索引唯一扫描 71 3.2.4 索引范围扫描 72 3.2.5 索引全扫描 74 3.2.6 索引跳跃扫描 77 3.2.7 索引快速...

    Oracle Freelist和HWM原理及性能优化

    本文以FreeList为线索对Oracle的存储管理的原理进行较深入的探讨,涉及Oracle段区块管理的原理,FreeList算法等

    Oracle表碎片整理操作步骤详解

    高水位线(HWL)下的许多数据块都是无数据的,但全表扫描的时候要扫描到高水位线的数据块,也就是说oracle要做许多的无用功!因此oracle提供了shrink space碎片整理功能。对于索引,可以采取rebuild online的方式...

    Oracle全表扫描及其执行计划

    全表扫描是Oracle访问数据库表是较为常见的访问方式之一。很多朋友一看到SQL语句执行计划中的全表扫描,要考虑对其进行...  扫描所有的数据块包括高水位线以内的数据块,即使是空数据块在没有被释放的情形下也会被扫

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    10.2.3 高水位线 340 10.2.4 freelists 342 10.2.5 PCTFREE和PCTUSED 345 10.2.6 LOGGING和NOLOGGING 348 10.2.7 INITRANS和MAXTRANS 349 10.3 堆组织表 349 10.4 索引组织表 352 10.5 索引聚簇表 368 10.6 ...

    Oracle编程艺术

    第 1章 开发成功的Oracle应用程序...................................................... 61 1.1 我的方法................................................................................ 63 3 / 976 1.2 ...

Global site tag (gtag.js) - Google Analytics