delete truncate 释放数据空间?

简介:   WB空间大小分析   --表分析 select T.segment_name,T.tablespace_name,T.


 

WB空间大小分析

 

--表分析

select T.segment_name,T.tablespace_name,T.BYTES/1024/1024/1024 from User_Segments T WHERE T.segment_type='TABLE'  ORDER BY T.BYTES DESC;



REWB

SYSTEM

110.6982421875G

USWB

TBS_USWB

80.0625G

RWB

SYSTEM

74.140625G

 

--索引分析

select T.segment_name,T2.TABLE_NAME,T.tablespace_name,T.BYTES/1024/1024/1024||'G' from User_Segments T,USER_INDEXES T2 WHERE T.segment_type='INDEX' AND T.segment_name=T2.INDEX_NAME  ORDER BY T.BYTES DESC;

 

PRI_ID

REWB

SYSTEM

49.1611328125G

IND_REWB_RKSJ

REWB

SYSTEM

13.791015625G

RWB_ID

RWB

SYSTEM

13.115234375G

I_USWB11_ENTERDB_TIME_BARID

USWB

TBS_USWB_INDEX

10.8125G

I_USERINFO11_ID_NUM

USWB

TBS_USWB_INDEX

8.9921875G

INDEX_RWB_RYRKSJ

RWB

SYSTEM

7.740234375G





 

 

考虑到索引对数据抽取的必要性,建议不对主键,时间戳索引进行修改或者删除

 

 

查看undo表空间情况

表空间             空间大小(M)   使用空间大小(M)   

TBS_USWB

92000

11776000

81984.56

89.11

10015.44

TBS_USWB_INDEX

51060

6535680

44555.5

87.26

6504.5

SYSAUX

520

66560

449.25

86.39

70.75

SYSTEM

320404

41011712

275688.19

86.04

44715.81

USERS

1729

221312

701.06

40.55

1027.94

UNDOTBS1

11235

1438080

30.31

0.27

11204.69

 

 

 

两种删除方式

 

1delete

 

 

测试用例

insert into usWB 

select * from USWB@dbl_jwb t where rownum < 100001;

commit;


--查看数据大小

select T.segment_name,T.BYTES/1024/1024/1024||'G' from user_segments t where t.segment_name='USWB';

USWB

.033203125G


--查看undo大小

SELECT SUM(T.BYTES)/10245/1024/1024||'G' FROM DBA_SEGMENTS T WHERE T.tablespace_name LIKE 'UNDOTBS1%'

 

.008217423133235724743777452415812591508G

 

 

--执行删除数据

DELETE FROM USWB;

COMMIT;

SELECT * FROM USWB;

数据为空


--查看数据空间大小

select T.segment_name,T.BYTES/1024/1024/1024||'G' from user_segments t where t.segment_name='USWB';

USWB

.033203125G


发现delete对于数据空间未释放


--查看undo情况

SELECT SUM(T.BYTES)/10245/1024/1024||'G' FROM DBA_SEGMENTS T WHERE T.tablespace_name LIKE 'UNDOTBS1%'

.019418008784773060029282576866764275256G


UNDO使用率

select (0.019418008784773060029282576866764275256-0.008217423133235724743777452415812591508)/0.033203125 from dual;

0.337335285505124


大约估计删除数据需要本身空间的1/3左右,甚至更大。。。


执行

alter table usWB enable row movement;

alter table usWB shrink space;


注释:shrink space支持自动段空间管理(ASSM),就可以使用这个特性缩小段


select T.segment_name,T.BYTES/1024/1024/1024||'G' from user_segments t where t.segment_name='USWB';


USWB

.00006103515625G


可以发现释放空间了


这样查看表空间是否为自动段空间管理


表空间                 管理方式

SYSTEM

MANUAL(手动的)

UNDOTBS1

MANUAL

SYSAUX

AUTO(自动的)

TEMP

MANUAL

USERS

AUTO

EXAMPLE

AUTO

TS_ZYK_TEMP

MANUAL

TS_ZYK_DATA

AUTO

TBS_USERINFO

AUTO

TBS_USWB_INDEX

AUTO

 

 

 

那么另外两张表删除数据无法无法降低空间

 

-- Create table

create table REWB_OLD

(

    id     VARCHAR2(40) not null,

  rksj   DATE default sysdate


)

tablespace SYSTEM

  pctfree 10

  initrans 1

  maxtrans 255

  storage

  (

    initial 64K

    minextents 1

    maxextents unlimited

  );

 

--查看数据占用空间

SELECT T.segment_name,T.BYTES/1024/1024/1024||'G',SYSDATE DQSJ FROM USER_SEGMENTS T WHERE T.segment_name ='REWB_OLD';

 

REWB_OLD

.00006103515625G

2015-8-25 10:05:02

 

 

--插入数据

INSERT INTO REWB_OLD

  select * from REWB@DBL_JWB t WHERE ROWNUM < 100001;

COMMIT;

 

SELECT T.segment_name,T.BYTES/1024/1024/1024||'G',SYSDATE DQSJ FROM USER_SEGMENTS T WHERE T.segment_name ='REWB_OLD';

 

REWB_OLD

.015625G

2015-8-25 10:07:15

 

 

delete from REWB_OLD;

commit;


2.156s删除成功


SELECT T.segment_name,T.BYTES/1024/1024/1024||'G',SYSDATE DQSJ FROM USER_SEGMENTS T WHERE T.segment_name ='REWB_OLD';


REWB_OLD

.015625G

2015-8-25 10:09:35

 

 

DELETE不会改变表的高水位标记,数据块还被占用着

 

 

SELECT T.segment_name,T.BYTES/1024/1024/1024||'G',SYSDATE DQSJ FROM USER_SEGMENTS T WHERE T.segment_name ='REWB_OLD';

 

 

 

查看之前的操作

 

INSERT INTO REWB_NEW SELECT * FROM REWB_OLD;

COMMIT;

 

 

INSERT INTO REWB_BAK

 select * from REWB@DBL_JWB t WHERE ROWNUM < 200001;

COMMIT;


发生在删除数据之前,保证数据备份成功


SELECT T.segment_name,T.BYTES/1024/1024/1024||'G',SYSDATE DQSJ FROM USER_SEGMENTS T WHERE T.segment_name ='REWB_BAK';

REWB_BAK

.029296875G

2015-8-25 10:25:36



SELECT T.segment_name,T.BYTES/1024/1024/1024||'G',SYSDATE DQSJ FROM USER_SEGMENTS T WHERE T.segment_name ='REWB_OLD';


REWB_OLD

.015625G

2015-8-25 10:26:21


重新插入不同的数据,发现数据占用空间还是0.015625g,说明delete释放掉存储空间可以被重新使用





DELETE释放的存储空间一定会被利用吗?


-- Create table

create table REWB_0825

(

  id     VARCHAR2(40) not null,

  rksj   DATE default sysdate

)

tablespace SYSTEM

  pctfree 10

  pctused 40

  initrans 1

  maxtrans 255

  storage

  (

    initial 64K

    minextents 1

    maxextents unlimited

  );

 

 

INSERT INTO REWB_0825

SELECT * FROM REWB_NEW T WHERE ROWNUM <301;

COMMIT;

 

select dbms_rowid.rowid_block_number(rowid) rn, COUNT(1)

  from REWB_0825 t

 GROUP BY dbms_rowid.rowid_block_number(rowid)

 

3752316

51

3752314

54

3752318

54

3752319

38

3752315

52

3752317

51

 

 

DELETE  from REWB_0825 t WHERE ROWNUM < 101;

COMMIT;



select dbms_rowid.rowid_block_number(rowid) rn, COUNT(1)

  from REWB_0825 t

 GROUP BY dbms_rowid.rowid_block_number(rowid)


3752316

51

3752318

54

3752319

38

3752315

6

3752317

51



INSERT INTO REWB_0825

SELECT * FROM REWB_NEW T WHERE ROWNUM <11;

COMMIT;


select dbms_rowid.rowid_block_number(rowid) rn, COUNT(1)

  from REWB_0825 t

 GROUP BY dbms_rowid.rowid_block_number(rowid)


3752316

51

3752318

54

3752319

48

3752315

6

3752317

51


 

发现3752314未被使用,插入大量数据查看是否出现3752314

 

 

INSERT INTO REWB_0825

SELECT * FROM REWB_NEW T WHERE ROWNUM <10001;

COMMIT;


select dbms_rowid.rowid_block_number(rowid) rn, COUNT(1)

  from REWB_0825 t

 GROUP BY dbms_rowid.rowid_block_number(rowid)


3752314

51

3752315

52

3752316

51

3752317

51

3752318

54

3752319

54

3752320

54

3752321

51

3752322

54

3752323

57

3752324

53

3752325

54

3752326

53

3752327

51

3752328

51

3756041

51

3756042

51

3756043

51

3756044

51

3756045

51

3756046

57

3756047

57

3756048

51

3756049

50

3756050

50

3756051

50

3756052

50

3756053

52

3756054

55

3756055

52

3756056

51


发现3752314确实出现了

 

那么何时使用被删除数据的空间呢?

 

Oracle编程艺术第十章节中介绍中pctfree pctused 

 

在手动管理控制中

 

pctfree :保留多少空间完成更新

pctused:不自由的块到多少才自动加入到freelist


有画图软件就好了


1、insert的数据在90%左右的是,此块脱离freelist,不在进行数据移入


2、delete这块数据,遗留这些数据占这块数据块的40%,就可以加入到freelist,重新加入数据


结论:如果删除数据,可以使用delete,但是不会释放数据所占空间

 

 

2truncate

 

Truncate删除时,本身表不被(insert(插入),update(更新),delete(删除))使用,

考虑到WB库时时在插入,且truncate 数据空间较高,truncate时间较长,不利于数据同步

 

之前一次对技侦数据truncate ,数据量为60g,truncate 时间为70min,

 

无法对其进行有效测试。

 

 
个人感觉:数据删除时,可以使用delete,如果释放数据空间的话,建议truncate

 

 

 

 

 

 

 

 

 

 

 

 

 

目录
相关文章
|
5月前
|
关系型数据库 MySQL
MySQL delete后怎么释放表空间
MySQL delete后怎么释放表空间
139 0
|
10月前
|
SQL 存储 安全
truncate和delete的区别
truncate和delete的区别
110 0
|
10月前
|
存储 索引
清空表时优先使用truncate
清空表时优先使用truncate
|
存储 索引
十、清空表时优先使用truncate
十、清空表时优先使用truncate
85 0
|
SQL 存储 tengine
为什么 MySQL 执行完 Delete 操作之后,空间没有释放?
为什么 MySQL 执行完 Delete 操作之后,空间没有释放?
368 0
为什么 MySQL 执行完 Delete 操作之后,空间没有释放?
说说delete与truncate的区别?
说说delete与truncate的区别?
86 0
|
SQL Oracle 关系型数据库
[20180228]11g删除表空间的恢复2.txt
[20180228]11g删除表空间的恢复2.txt --//以前曾经做过利用传输表空间恢复数据库,连接如下: http://blog.itpub.net/267265/viewspace-2141174/ http://blog.
1103 0
|
SQL Oracle 关系型数据库
[20180222]11g删除表空间的恢复.txt
[20180222]11g删除表空间的恢复.txt --//以前曾经做过利用传输表空间恢复数据库,连接如下: http://blog.itpub.net/267265/viewspace-2141174/ http://blog.
1090 0

热门文章

最新文章