Oracle—deallocate unused释放高水位空间(二)
admin
2023-04-26 07:23:24
0

deallocate unused :仅适用于释放HWM高水位以上的空间,而无法释放高水位以下的空间;比如对表预分配的空间


使用说明和方法,官方文档有说明,如下:

Use the deallocate_unused_clause to explicitly deallocate unused space at the end of

a database object segment and make the space available for other segments in the

tablespace.

You can deallocate unused space using the following statements:

■ ALTER CLUSTER (see ALTER CLUSTER on page 10-5)

■ ALTER INDEX: to deallocate unused space from the index, an index partition, or an

index subpartition (see ALTER INDEX on page 10-78)

■ ALTER MATERIALIZED VIEW: to deallocate unused space from the overflow segment

of an index-organized materialized view (see ALTER MATERIALIZED VIEW on

page 11-3)

■ ALTER TABLE: to deallocate unused space from the table, a table partition, a table

subpartition, the mapping table of an index-organized table, the overflow segment

of an index-organized table, or a LOB storage segment (see ALTER TABLE on

page 12-2)


一、测试环境:

 Oracle11.2.0.4

 使用admin用户在test表空间新建一张测试分区表,并提前对子分区预分配一些空间,然后插入少量的数据,最后使用:alter  table .....deallocate unused;来释放未使用的空间


二、开始测试

①:查看测试环境表空间使用情况:

SQL> set linesize 2500
SQL> set pagesize 300
SQL> select a.tablespace_name "表空间名称",100 - round((nvl(b.bytes_free, 0) / a.bytes_alloc) * 100, 2) "占用率(%)",round(a.bytes_alloc / 1024 / 1024, 2) "容量(M)",round(nvl(b.bytes_free, 0) / 1024 / 1024, 2) "空闲(M)",round((a.bytes_alloc - nvl(b.bytes_free, 0)) / 1024 / 1024, 2) "使用(M)",to_char(sysdate, 'yyyy-mm-dd hh34:mi:ss') "采样时间" from (select f.tablespace_name,sum(f.bytes) bytes_alloc,sum(decode(f.autoextensible, 'YES', f.maxbytes, 'NO', f.bytes)) maxbytes from dba_data_files f group by tablespace_name) a,(select f.tablespace_name, sum(f.bytes) bytes_free from dba_free_space f group by tablespace_name) b where a.tablespace_name = b.tablespace_name order by 2 desc;
???????????????                ?????????(%)  ??????(M)  ??????(M)  ??????(M) ????????????
------------------------------ ------------ ---------- ---------- ---------- -------------------
SYSAUX                                94.41        510       28.5      481.5 2017-08-07 17:01:20
SYSTEM                                93.24        800      54.06     745.94 2017-08-07 17:01:20
USERS                                 26.25          5       3.69       1.31 2017-08-07 17:01:20
UNDOTBS1                              17.97        470     385.56      84.44 2017-08-07 17:01:20
TEST                                    .05      20480      20470         10 2017-08-07 17:01:20
SQL> show user
USER is "ADMIN"     ----测试用的用户

②:创建测试分区表:test_emp  

SQL> create table test_emp (TMP_UPSTATE_CASEKEY char(14),TMP_NUM_STATUS_ID number(38),updated_date date)
  2  partition by range(TMP_NUM_STATUS_ID)
  3          (partition pt_1 values less than(1000000) ) nologging; 
Table created.

③:给pt_1分区表预分配10G的空间:

SQL> alter table test_EMP  modify PARTITION pt_1 ALLOCATE EXTENT (size 10240m);
Table altered.

④:收集该分区表的统计信息,并查看该表的block块占用情况

SQL>  exec dbms_stats.gather_table_stats(ownname =>'ADMIN',tabname =>'TEST_EMP',cascade=>TRUE);
PL/SQL procedure successfully completed.
SQL>  select B.SEGMENT_NAME, B.blocks,B.blocks * 8096 / 1024 / 1024, A.BLOCKS,A.blocks * 8096 / 1024 / 1024, A.EMPTY_BLOCKS from user_tables a, USER_SEGMENTS B WHERE TABLE_NAME = 'TEST_EMP' AND A.TABLE_NAME = B.SEGMENT_NAME; 
SEGMENT_NAME                                                                          BLOCKS B.BLOCKS*8096/1024/1024     BLOCKS A.BLOCKS*8096/1024/1024 EMPTY_BLOCKS
--------------------------------------------------------------------------------- ---------- ----------------------- ---------- ----------------------- ------------
TEST_EMP                                                                             1315840              10159.5313          0                       0            0
SQL> SELECT segment_name, SUM(bytes) / 1024 / 1024 Mbytes  FROM dba_segments WHERE    PARTITION_NAME = 'PT_1' GROUP BY segment_name;
SEGMENT_NAME                                                                          MBYTES
--------------------------------------------------------------------------------- ----------
TEST_EMP                                                                               10288
BIN$VibHVCPfDL/gU8gCqMDDfw==$0                                                             8

---从上面可以看出,test_emp分区表的大小是10G,而占用的blocks有1315840个;



⑤:向分区表插入一些数据,并查看该表的大小

SQL> create or replace procedure proc_casekey_upstate
  2  as
  3    casekey char(14);
  4  begin
  5    for i in 1..10000 loop
  6      casekey := 'TMP'||lpad(i,7,0);   
  7      insert into test_emp values(casekey, 1, sysdate);
  8    end loop;
  9    commit;
 10  end;
 11  /
Procedure created.
SQL> exec proc_casekey_upstate;    ---执行存储过程插入数据
PL/SQL procedure successfully completed.
SQL> exec dbms_stats.gather_table_stats(ownname =>'ADMIN',tabname =>'TEST_EMP',cascade=>TRUE);   ---收集该表的统计信息
PL/SQL procedure successfully completed.
SQL> select B.SEGMENT_NAME, B.blocks,B.blocks * 8096 / 1024 / 1024, A.BLOCKS,A.blocks * 8096 / 1024 / 1024, A.EMPTY_BLOCKS from user_tables a, USER_SEGMENTS B WHERE TABLE_NAME = 'TEST_EMP' AND A.TABLE_NAME = B.SEGMENT_NAME; 
SEGMENT_NAME                                                                          BLOCKS B.BLOCKS*8096/1024/1024     BLOCKS A.BLOCKS*8096/1024/1024 EMPTY_BLOCKS
--------------------------------------------------------------------------------- ---------- ----------------------- ---------- ----------------------- ------------
TEST_EMP                                                                             1315840              10159.5313         46              .355163574            0
SQL> SELECT segment_name, SUM(bytes) / 1024 / 1024 Mbytes  FROM dba_segments WHERE    PARTITION_NAME = 'PT_1' GROUP BY segment_name;
SEGMENT_NAME                                                                          MBYTES
--------------------------------------------------------------------------------- ----------
TEST_EMP                                                                               10288
BIN$VibHVCPfDL/gU8gCqMDDfw==$0                                                             8


--注意:从上面可以看出,该表的大小是10G,但是该表占用blocks只有46个,显然 有很多空间没有被使用,


⑥:释放未被使用的空间(我对该操作过了10046事件,在实际操作中只需执行:alter table test_emp modify partition pt_1 deallocate unused; )

SQL> alter session set tracefile_identifier='10046';
SQL> alter session set events '10046 trace name context forever,level 12';   ---开启10046事件
Session altered.
SQL> 
SQL>  alter table test_emp modify partition pt_1 deallocate unused;   ---执行该命令释放子分区未被使用的空间;
 
Table altered.
SQL> alter session set events '10046 trace name context off';   ---关闭10046事件
Session altered.
SQL> select value from v$diag_info where name='Default Trace File';
VALUE
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/opt/oracle/diag/rdbms/dbs/dbs/trace/dbs_ora_3263_10046.trc


⑦:验证空间是否被释放:

SQL> select B.SEGMENT_NAME, B.blocks,B.blocks * 8096 / 1024 / 1024, A.BLOCKS,A.blocks * 8096 / 1024 / 1024, A.EMPTY_BLOCKS from user_tables a, USER_SEGMENTS B WHERE TABLE_NAME = 'TEST_EMP' AND A.TABLE_NAME = B.SEGMENT_NAME; 
SEGMENT_NAME                                                                          BLOCKS B.BLOCKS*8096/1024/1024     BLOCKS A.BLOCKS*8096/1024/1024 EMPTY_BLOCKS
--------------------------------------------------------------------------------- ---------- ----------------------- ---------- ----------------------- ------------
TEST_EMP                                                                                1024                 7.90625         46              .355163574            0

SQL> SELECT segment_name, SUM(bytes) / 1024 / 1024 Mbytes  FROM dba_segments WHERE    PARTITION_NAME = 'PT_1' GROUP BY segment_name;
SEGMENT_NAME                                                                          MBYTES
--------------------------------------------------------------------------------- ----------
TEST_EMP                                                                                  16
BIN$VibHVCPfDL/gU8gCqMDDfw==$0                                                             8
------------------------------ ------------ ---------- ---------- ---------- -------------------
SYSAUX                                94.44        510      28.38     481.63 2017-08-07 17:19:30
SYSTEM                                93.24        800      54.06     745.94 2017-08-07 17:19:30
USERS                                 26.25          5       3.69       1.31 2017-08-07 17:19:30
UNDOTBS1                               5.73        470     443.06      26.94 2017-08-07 17:19:30
TEST                                    .05      20480      20470         10 2017-08-07 17:19:30



从上面可以看出,该表的大小变成了16M,而blocks也有1024个;表未被使用的空间已经释放,而且表空间可用大小也已经变大:


相关内容

热门资讯

美媒:中美元首会晤或讨论AI护... 据凤凰卫视援引美国媒体报道,美方希望借中美领导人会晤的机会,开启有关人工智能安全与管控的对话,并推动...
卫生间水管布置图尺寸高度 卫生间的水管布置可能比较复杂一些,因为卫生间的管道比较多。比如有热水器的通水管道,有座便器的冲水管道...
电脑尺寸在哪里看 电脑尺寸在哪里看1、可以选择手工测量法来测量电脑尺寸,这时测量一下屏幕对角线,因为显示面积都会小于显...
电脑机箱尺寸标准 常规的机箱一般是立体式,或桌面式,再就是横式。电脑机箱尺寸,目前市面上根据不同的规格有不同的方案。 ...
斯塔默发声:不会辞职 【环球时报驻英国特约记者 纪双城 环球时报特约记者 甄翔 于文】执政党工党在英国地方选举中遭遇“历史...
抽油烟机管道有异味怎么办 抽油烟机是厨房中不可或缺的设备,它能有效地排出油烟,保证室内空气的清新。但是,长时间使用后,抽油烟机...
抽油烟机管道有油垢怎么办 抽油烟机管道是我们家庭生活中必不可少的设备,但长时间的使用会导致管道内部积累大量的油垢,如不及时清理...
沈伯洋与台北市长格局有落差,叶... 海峡导报综合报道 民进党将正式拍板征召民代沈伯洋出战台北市长,并发布采访通知,预计在13日下午举行台...
核查:上世纪已有多款汉坦疫苗上... 明查员 冯梦速览- 人类感染汉坦病毒已有数十年历史。朝鲜战争期间,联合国军就曾有过大规模感染。汉坦病...
如何从“一证在手”走向“一技傍... 教员在给学员讲解理论知识。 学员在进行无人机试飞训...