说到HWM,让笔者简略引见一下Oracle的逻辑回忆应付。,Oracle在逻辑回忆中被划分为4个年级:表茫然的,段,区域和块。 

(1)块:回忆单元的最小上浆,规范块大块如今是8K。,Oracle每个I/O处理或负责也由块处理或负责。,执意,当Oracle从标明文件读取标明时,读取达到一种度个块,线不多。 

(2)区域:由装上尾巴使结婚的块结婚,这也Oracle茫然的散布的基本单位。,比如,比如,当笔者确立或使安全单独表PMU用户时,率先,Oracle会给异样表分派单独茫然的,向PMU用户陆续拔出标明,原始区域不包括拔出的标明。,Oracle在单独单元中传播,执意,有达到一种度区域被重行分派给PMU用户。,块不多。 

(3)由装上尾巴区域结婚。,大抵,确立或使安全不赞成时(表),运用钥匙),单独段将被分派给异样不赞成,因而在一种意义上,段是一种典型的标明,如确立或使安全。 TABLE PM_USER,本条是标明段。,实现 INDEX ON PM_USER(NAME),Oracle还为异样运用钥匙分派单独段,但这是运用钥匙分配。查询分配正中鹄的通讯可以是PA。 SELECT * FROM
用户段获取,

(4)表茫然的:包括段,区及块.表茫然的的标明体格检查上贮存在其名列前茅的标明文件中.单独标明库无论如何规定单独表茫然的.

OK,笔者如今回到HWM产生,这样,是什么高水位捣碎呢?这就跟ORACLE的段茫然的应付互相牵连了.

(一)ORACLE用HWM来明确单独段中运用的块和未运用的块.

比如,比如,当笔者确立或使安全单独表:,Oracle为异样不赞成分派单独段。,倘若笔者不拔出任何的记载,无论如何标明单独区域。,优先区域的第单独块高气压段(段)。 海德),少量地通讯回忆在段的头部中。,基中HWM的通讯就回忆在此.此刻,因优先区域正中鹄的第单独块用于回忆少量地通讯,侮辱缺勤回忆实践记载,但它也被运用。,此刻HWM是定居第2个块.当笔者不时拔出标明到PM_USER后,第单独块缺勤放下新拔出的标明。,此刻,Oracle回忆高水位前述事项的块来回忆新的标明。,同时,HWM自己也向上移.执意,当笔者拔出标明时,HWM会往不时上移,很,在HWM在水下的,意义是用过的块,HWM美元过剩额的就表示已分派但从未运用过的块.

(二)HWM在拔出标明时,当持续存在茫然的不可且茫然的膨大时,它向上挪动。,可是怎样,当标明被迅速离开时,它不会的往下的挪动。

就像贮液器的水位,当水上涨时,水位向上挪动。,当水汇成时,难以置信的水位的指定而尚未上任的依然变明朗。
让笔者思索单独部件,作为一种版式,在海外都是耍花招,如图 1 所示。在正常的处理或负责过程中,有些线路已被迅速离开,如图 2 所示。如今有丰盛的的茫然的放肆。:(I) 在表的陀螺与持续存在块中间,于是 (ii) 方格内,也少量地不迅速离开的行。

图1:分派给手术台的块。用灰的正方形表示垂线

ORACLE 缺勤公映的新影片茫然的供对立面不赞成运用。,有单独简略的记述:因茫然的是为新拔出的行保存的,调停持续存在线路的开展。难以置信的拥有茫然的称为难以置信的运用指定而尚未上任的。 (HWM),如图 2 所示。

(三)HWM的通讯回忆在段头正忙于.

HWM自己的通讯是贮存在段头.在段茫然的是手工应付方法时,ORACLE是经过FREELIST(单独单向链表)来应付段内的茫然的分派.在段茫然的是不假思索的应付方法时(ASSM),Oracle经过位图应付该段正中鹄的茫然的分派。

(四)ORACLE的全表扫描是读取高水位捣碎(HWM)以下的缠住块.

因而成绩就呈现了。当用户收回完整的的表扫描时,,ORACLE 缠住的工夫都必需从段扫描到 HWM,倘若它缺勤找到任何的东西。此作业传播了全表扫描的工夫。。

(五)拔出有径直地方法的垂线时 — 比如,经过径直地重读(运用) APPEND 迅速的或经过 SQL*LOADER 径直地方法 — 标明块径直地储蓄 HWM 美元过剩额。这是在它下面放肆茫然的。

让笔者来辨析这两个成绩。,后者正确的放肆茫然的。,但前者不独仅是放肆茫然的,这将出示令人伤心或痛苦的的机能成绩。让笔者风景一眼FOL。

(a)率先设置校验一带,优先步是为手工操作应付的表茫然的确立或使安全段茫然的。

CREATE TABLESPACE “RAINNY” 
LOGGING 
DATAFILE ”D:” SIZE 5M 
不假思索的传播 
ON NEXT 10米 MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL 
SEGMENT SPACE MANAGEMENT MANUAL;

(b)确立或使安全表格,当心,异样表的秒个担任外场员被蓄意设置为字母(100)。,在拔出1000万个记载后从事制造此表,茫然的十足大。

CREATE TABLE TEST_TAB(C1 数字(10),C2 字母(100) TABLESPACE RAINNY;

拔出记载

DECLARE
I 数字(10);

BEGIN
FOR I IN 1..10000000 LOOP
INSERT INTO TEST_TAB 价值观(I),”TESTSTRING”);
END LOOP;
COMMIT;

END;

/

(C)笔者来考察一下。,检查号召的块数和查询后所破费的工夫。


SQL> SET TIMING ON

SQL> SET AUTOTRACE TRACEONLY

SQL> SELECT COUNT(*) FROM TEST_TAB;

ELAPSED: 00:01:03.05

EXECUTION PLAN

———————————————————-

0 SELECT STATEMENT OPTIMIZER=CHOOSE (COST=15056 CARD=1)

1 0 SORT (凑合)

2 1 TABLE ACCESS (载满) OF ”TEST_TAB” (COST=15056 CARD=10000

000)

STATISTICS

———————————————————-

0      RECURSIVE CALLS

0      DB BLOCK GETS

156310 CONSISTENT GETS

154239 PHYSICAL READS

0      REDO SIZE

379    BYTES SENT VIA SQL*NET TO CLIENT

503    BYTES RECEIVED VIA SQL*NET FROM CLIENT

2      SQL*NET 过往里程 TO/FROM CLIENT

0      SORTS (回忆)

0      SORTS (磁盘)

1      ROWS PROCESSED


让笔者看一眼下面的实行突出。,SQL的总工夫是1分钟和3秒。全扫描塑造(FTS)是U,逻辑读156310块,体格检查读取154239块。 
让笔者辨析一下表格。 

BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=> 校验, 
表名 ”TEST_TAB”,
PARTNAME=> 零)

/

撞见该块眼前在本表中运用。 156532,未运用的块(EvyType块)为:0,行的总额是(数字行):1000。 0000 

(d)接下来笔者经过迅速离开迅速离开此形状的记载。,后来地看选择 COUNT(*) FROM TestJeta选择卡所花的工夫 

DELETE FROM TEST_TAB; 
COMMIT;

SQL> SELECT COUNT(*) FROM TEST_TAB; 

ELAPSED: 00:01: 

EXECUTION PLAN 
———————————————————- 
0 SELECT STATEMENT OPTIMIZER=CHOOSE (COST=15056 CARD=1)

1 0 SORT (凑合) 
2 1 TABLE ACCESS (载满) OF ”TEST_TAB” (COST=15056 CARD=1)

STATISTICS 
———————————————————- 
0      RECURSIVE CALLS 
0      DB BLOCK GETS 
156310 CONSISTENT GETS 
155565 PHYSICAL READS 
0      REDO SIZE 
378    BYTES SENT VIA SQL*NET TO CLIENT 
503    BYTES RECEIVED VIA SQL*NET FROM CLIENT 
2      SQL*NET 过往里程 TO/FROM CLIENT 
0      SORTS (回忆) 
0      SORTS (磁盘) 
1      ROWS PROCESSED

全部风景,迅速离开表随后,此表中缺勤记载。,为什么选择 COUNT(*) FROM TestYa TAB花工夫为1分4秒。, 这比记载要长相当。,为什么会很?人民看着它,逻辑读取156310 BLOCK,前一千万行记载相位差绝佳地,甲骨文怎么会这样蠢?

笔者迅速离开表随后再次辨析表,看一眼产生了是什么 
这时, StestyTabl表一般运用的块是 156532,未运用的块(EvyType块)为:0,行(数字行)的总额已跌倒:0 

为什么表如今的块或156532的总量?

成绩的原点就取决于ORACLE的HWM.执意,在新记载的时辰,HWM会渐渐往上移,但迅速离开记载后,HWM却不会的往下移,执意,迅速离开一千万个记载后,此表的HWM完整地没挪动,它依然在这么的地位,因而,HWM以下的块数异样也俱的.ORACLE的全表扫描是读取ORACLE高水位捣碎下的缠住BLOCK,执意,可是HWM下的BLOCK如今实践有缺勤存款标明,甲骨文逐个地里德,很,全部可想而知,迅速离开表后,Oracle读了很多空块,这花了很多工夫。

让笔者看一眼迅速离开表茫然的的实践运用。

SQL> EXEC SHOW_SPACE(”TEST_TAB”,校验);

TOTAL BLOCKS……………………….164352 总共164352件
TOTAL BYTES………………………..1346371584
UNUSED BLOCKS………………………7168 不运用7168件,执意在HWM下面的块数
UNUSED BYTES……………………….58720256
LAST USED EXT FILEID………………..9
LAST USED EXT BLOCKID……………….158856— BLOCK ID 它被编号为标明文件。,表示足够维持运用的扣押的第单独块的数量。
LAST USED BLOCK…………………….1024 在足够维持运用的度上 中一股了1024块

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED

总共164352件,以及长 HEADER,运用164351个块的实践总额。,从未运用过7168件。LAST USED 块代表足够维持单独度 运用正中鹄的块, 结婚足够维持 USED EXT BLOCK ID可以计算 HWM 地位 :


LAST USED EXT BLOCK ID + LAST USED BLOCK -1 = HWM 它名列前茅的标明文件的块号

代入买到: 158856+1024-1=159879,异样执意HWM缠住的BLOCK编号

HWM名列前茅的块:TOTAL BLOCKS- UNUSED BLOCKS=164352-7168=157184,执意,HWM在第157184个块,其块ID是159879

(e)结下,让笔者做更多的试验

优先步:实行变换 TABLE TEST_TAB DEALLOCATE UNUSED;

让笔者看一眼段茫然的的运用。

SQL> EXEC SHOW_SPACE(”TEST_TAB”,校验);

TOTAL BLOCKS……………………….157184
TOTAL BYTES………………………..1287651328
UNUSED BLOCKS………………………0
UNUSED BYTES……………………….0
LAST USED EXT FILEID………………..9
LAST USED EXT BLOCKID……………….158856
LAST USED BLOCK…………………….1024

在这相当上,笔者将代替前述的表达。,算出HWM的地位: 157184-0=157184 HWM名列前茅的BLOCK ID是158856+1024-1=159879,缺勤新的转换,执意,变换的实行。 TABLE TEST_TAB DEALLOCATE 未运用后,段高水位指定而尚未上任的的地位缺勤陈,但看一眼缺勤用过 块变为0,块总额增加到157184个。,这公开宣称,DEALLOCATE
UNUSED为公映的新影片HWM下面的未运用茫然的,可是怎样并不会的公映的新影片HWM下面的释放茫然的,也不会的挪动HWM的地位. 

秒步:让笔者看一眼修正的实行。 TABLE TEST_TAB 挪动柱茫然的的运用 

SQL> EXEC SHOW_SPACE(”TEST_TAB”,校验);

TOTAL BLOCKS……………………….8

TOTAL BYTES………………………..65536

UNUSED BLOCKS………………………5

UNUSED BYTES……………………….40960

LAST USED EXT FILEID………………..9

LAST USED EXT BLOCKID……………….2632

LAST USED BLOCK…………………….3


此刻,运用的块总额已更反倒8个。, 笔者将交换下面的表达,算出HWM的地位: 8-5=3 HWM名列前茅的BLOCK ID是2632+3-1=2634,

OK,笔者撞见,此刻HWM的地位先前产生转换,如今HWM的地位是在第3个BLOCK,其块 身份证号码是2634,缠住标明文件的ID为9(这不会的变换),标明文件或原始标明文件,只公映的新影片原始释放茫然的),足够维持单独块的总量也变为3。,这宣讲先前运用了3个块。,HWM执意在足够维持单独运用的块上,那是第三个方格。你能够觉得临时的。,茫然的公映的新影片后的记述,未运用的块也5个啊?执意HWM美元过剩额不动的有5个已分派但从未运用的块.答案就跟HWM挪动的支配使担忧.当笔者在拔出标明时,ORACLE率先在HWM在水下的块正忙于使适应释放茫然的(经过释放列表FREELIST),设想释放作家缺勤非工作时间块,甲骨文开端扩张,而HWM也跟着往上移,每5个方格挪动一次。让笔者看一眼Oracle的下订单 

The high water mark is: 
-Recorded in the segment header block 
-Set to the beginning of the segment on the creation 
-Incremented in five-block increments as rows are inserted 
-Reset by the truncate command 
-Never reset by the delete command 
-Space above the high-water-mark can be reclaimed at the table level by using the following command: 
ALTER TABLE DEALLOCATE UNUSED… 

让笔者再看一遍:选择 COUNT(*) FROM TestJeta选择卡所花的工夫 

SQL> SELECT COUNT(*) FROM TEST_TAB; 

ELAPSED: 00:00: 

EXECUTION PLAN 
———————————————————-

0 SELECT STATEMENT OPTIMIZER=CHOOSE 
1 0 SORT (凑合) 
2 1 TABLE ACCESS (载满) OF ”TEST_TAB”

STATISTICS 
———————————————————- 
0     RECURSIVE CALLS 
0     DB BLOCK GETS

3     CONSISTENT GETS 
0     PHYSICAL READS 
0     REDO SIZE 
378   BYTES SENT VIA SQL*NET TO CLIENT 
503   BYTES RECEIVED VIA SQL*NET FROM CLIENT 
2     SQL*NET 过往里程 TO/FROM CLIENT 
0     SORTS (回忆) 
0     SORTS (磁盘) 
1     ROWS PROCESSED 

很快,不到一秒钟。

足够维持笔者对表格停止了辨析。, 此刻,该表一般运用的块是 0,未运用的块(EvyType块)为:0,行的总额是(数字行):0。 
笔者也可以撞见,辨析表和SHOW_SPACE显示的标明颇多种多样的.这样哪个是准的呢?真这两个都是准的,计算方法颇多种多样的。实际上,当确立或使安全像表俱的不赞成时,可是你可能的选择拔出标明,它职业了少量地方格。,Oracle也会给它不可避免的的茫然的。,运用变换 TABLE 公映的新影片释放茫然的后公映的新影片释放茫然的,或许为异样手术台留出少量地茫然的。 
足够维持,让笔者再次实行限制命令,限制表,看环节茫然的的运用 

TRUNCATE TABLE TEST_TAB; 

SQL> EXEC SHOW_SPACE(”TEST_TAB”,校验); 

TOTAL BLOCKS……………………….8 
TOTAL BYTES………………………..65536 
UNUSED BLOCKS………………………5 
UNUSED BYTES……………………….40960 
LAST USED EXT FILEID………………..9 
LAST USED EXT BLOCKID……………….2632 
LAST USED BLOCK…………………….3 

PL/SQL PROCEDURE SUCCESSFULLY COMPLETED 

SQL> 

笔者撞见限制和挪动后缺勤转换。 

为了,足够维持证实我的视点,我再把表扔了。,后来地结构表格,在拔出任何的标明在前方检查此刻间。,Oracle真的为异样不赞成分派了不可避免的的茫然的吗? 

DROP TABLE TEST_TAB; 

CREATE TABLE TEST_TAB(C1 数字(10),C2 字母(100) TABLESPACE RAINNY; 

SQL> EXEC SHOW_SPACE(”TEST_TAB”,校验); 

TOTAL BLOCKS……………………….8 
TOTAL BYTES………………………..65536 
UNUSED BLOCKS………………………5 
UNUSED BYTES……………………….40960 
LAST USED EXT FILEID………………..9 
LAST USED EXT BLOCKID……………….2112 
LAST USED BLOCK…………………….3

全部看,倘若我缺勤拔出任何的参加社交聚会记载,Oracle为它分派了8个块。自然,这是表格的创办。 参量和MNEXTENS参量互相牵连:请参阅回忆PAR 

S TORAGE
(
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
); 

执意,确立或使安全不赞成随后,Oracle分派无论如何单独区域给它,初始上浆为64K,规范块的大块是8K。,就在8个方格。 

总结: 

在9I中: 

(1)设想绵密 你可以变换 TABLE TABLENAME DEALLOCATE UNUSED将HWM前述事项缠住没运用的茫然的公映的新影片
(2)设想绵密 >HWM 则公映的新影片MINEXTENTS 前述的茫然的。设想要公映的新影片HWM前述的茫然的则运用KEEP 0。
ALTER TABLE TABLESNAME DEALLOCATE UNUSED KEEP 0;
(3) TRUNCATE TABLE DROP 回忆(默许)命令可以形成最少的 下面的茫然的完整公映的新影片(回在海外理或负责系统)。,而且重新安置HWM。 
(4)设想仅是要挪动HWM,不愿把手术台关禁闭很长工夫,可以运用限制 TABLE REUSE STORAGE,仅将HWM重新安置。
(5)变换 TABLE MOVE会将HWM挪动,但有单独双表茫然的挪动,设想表上有运用钥匙,必要重构运用钥匙 
(6)DELETE表不会的重新安置HWM,也不会的公映的新影片释放的茫然的(执意DELETE空出狱的茫然的不料给不赞成自己未来的INSERT/UPDATE运用,不克不及用于对立面不赞成) 

甲骨文 10G: 

可以使运用变换 TABLE TEST_TAB SHRINK SPACE命令来联机挪动HWM, 
设想要同时紧缩表的运用钥匙,可以公映的新影片:变换 TABLE TEST_TAB SHRINK SPACE CASCADE
当心:当运用异样命令时,率先必要行自己谋生行。 有关运动的(详细容器)。
与使运用变换 TABLE MOVE 多种多样的的是,在实行此命令后,不必要再实行。。

Oracle 官气十足阐明 

Shrinking Database Segments Online
You use online segment shrink to reclaim fragmented free space below the high water mark in an Oracle Database 段。 The benefits of segment shrink are these:
* Compaction of data leads to better cache utilization, which in turn leads to better online transaction processing (OLTP) 机能。
* The compacted data requires fewer blocks to be scanned in full table scans, which in turns leads to better decision support system (DSS) 机能。
Segment shrink is an online, in-place 处理或负责。 DML operations and queries can be issued during the data movement phase of segment 缩水。 Concurrent DML operation are blocked for a short time at the end of the shrink operation, when the space is 破除分派。
Indexes are maintained during the shrink operation and remain usable after the operation is 结束。 Segment shrink does not require extra disk space to be 分派。
Segment shrink reclaims unused space both above and below the high water mark. In contrast, space deallocation reclaims unused space only above the high water mark. In shrink operations, by default, the database compacts the segment, adjusts the high water
mark, and releases the reclaimed 茫然的。
Segment shrink requires that rows be moved to new 地位。 Therefore, you must first enable row movement in the object you want to shrink and disable any rowid-based triggers defined on the object.
Shrink operations can be performed only on segments in locally managed tablespaces with automatic segment space management (ASSM) Within an ASSM tablespace, all segment types are eligible for online segment shrink except these:
* IOT mapping tables
* Tables with rowid based materialized views
* Tables with 本功用 indexes

处理或负责过程:

SQL> create table demo as select * from dba_source;

Table 确立或使安全。
Elapsed: 00:00:05.83

SQL> select count(*) from demo;

  COUNT(*)
———-
210992
Elapsed: 00:00:01.06

SQL> insert into demo select * from demo;
210992 rows 确立或使安全。
Elapsed: 00:00:59.83

SQL> commit;
Commit 结束。

买到40万张记载表,下面是表格的茫然的散布。

SQL> exec show_space(”demo”,不假思索的

PL/SQL procedure successfully 完整的的。
Elapsed: 00:00:00.07

SQL> set serveroutput on

SQL>  exec show_space(”demo”,不假思索的

Total Blocks……………………….9216
Total Bytes………………………..75497472
Unused Blocks………………………768
Unused Bytes……………………….6291456
Last Used Ext FileId………………..4
Last Used Ext BlockId……………….8328
Last Used Block…………………….256

总公共的9216个标明块。,HWM在9216-768=8448异样块.
也可以经过检查extents记录HWM=8*16+128*63+256=8192+256=8448

PL/SQL procedure successfully 完整的的。
Elapsed: 00:00:00.01

SQL> delete from demo where rownum<220000;

219999 rows 迅速离开。
Elapsed: 00:00:40.99

SQL> commit;

Commit 结束。
Elapsed: 00:00:00.01

SQL>  exec show_space(”demo”,不假思索的

Total Blocks……………………….9216
Total Bytes………………………..75497472
Unused Blocks………………………768
Unused Bytes……………………….6291456
Last Used Ext FileId………………..4
Last Used Ext BlockId……………….8328
Last Used Block…………………….256

PL/SQL procedure successfully 完整的的。

//迅速离开处理或负责后表的HWM缺勤转换,它依然在第八千四百四十八个方格。。
Elapsed: 00:00:

SQL> alter table demo shrink space;
alter table demo shrink space
*
ERROR at line 1:
ORA-10636: ROW MOVEMENT is not enabled

优先,使能 row 有关运动的契约
Elapsed: 00:00:00.09

SQL> alter table demo enable row movement;

Table 变换了的。
Elapsed: 00:00:00.10

SQL>  alter table demo shrink space;

Table 变换了的。
Elapsed: 00:01:35.51

SQL>  exec show_space(”demo”,不假思索的

Total Blocks……………………….3656
Total Bytes………………………..29949952
Unused Blocks………………………0
Unused Bytes……………………….0
Last Used Ext FileId………………..4
Last Used Ext BlockId……………….3720
Last Used Block…………………….72

PL/SQL procedure successfully 完整的的。
Elapsed: 00:00:00.02

//可以注意到HWM降到了3656异样块下面!