[转帖]释放大数据量的lob字段空间_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1996 | 回复: 0   主题: [转帖]释放大数据量的lob字段空间        上一篇   下一篇 
Jenspi
注册用户
等级:新兵
经验:72
发帖:3
精华:0
注册:2017-3-10
状态:离线
发送短消息息给Jenspi 加好友    发送短消息息给Jenspi 发消息
发表于: IP:您无权察看 2019-9-16 16:12:49 | [全部帖] [楼主帖] 楼主

SQL> create tablespace ts_lob datafile '/u01/app/oracle/oradata/DBdb/ts_lob.dbf' size 500m autoextend off;
Tablespace created.
--scott用户创建测试表lob1:
SQL> grant dba to scott;
Grant succeeded.
SQL> conn scott/tiger;
Connected.
SQL> create table lob1(line number,text clob) tablespace ts_lob;
Table created.
SQL> insert into lob1  select line,text from  dba_source;
637502 rows created.
SQL> insert into lob1 select * from lob1;
637502 rows created.
SQL> select count(*) from lob1;
COUNT(*)
----------
1275004
SQL> commit;
Commit complete.
--查询表大小(包含表和lob字段)
select (select nvl(sum(s.bytes/1024/1204), 0)                              -- the table segment size
from dba_segments s
where s.owner = upper('SCOTT')
and (s.segment_name = upper('LOB1'))) +
(select nvl(sum(s.bytes/1024/1024), 0)                              -- the lob segment size
from dba_segments s, dba_lobs l
where s.owner = upper('SCOTT')
and (l.segment_name = s.segment_name and
l.table_name = upper('LOB1') and
l.owner = upper('SCOTT'))) +
(select nvl(sum(s.bytes/1024/1024), 0)                              -- the lob index size
from dba_segments s, dba_indexes i
where s.owner = upper('SCOTT')
and (i.index_name = s.segment_name and
i.table_name = upper('LOB1') and index_type = 'LOB' and
i.owner = upper('SCOTT'))) "total_table_size_M"
FROM DUAL;
total_table_size_M
------------------
239.966154
--查询表大小(不包含lob字段)               
col SEGMENT_NAME for a30
col PARTITION_NAME for a30
SQL> select OWNER,SEGMENT_NAME,PARTITION_NAME,BYTES/1024/1024 M from dba_segments where segment_name='LOB1' and owner='SCOTT';
OWNER                          SEGMENT_NAME                   PARTITION_NAME                          M
------------------------------ ------------------------------ ------------------------------ ----------
SCOTT                          LOB1                                                                 208
--查询表大小(只包含lob字段)       
set lines 200 pages 999
col owner  for a15
col TABLE_NAME for a20
col COLUMN_NAME for a30
col SEGMENT_NAME for a30
select a.owner,
a.table_name,
a.column_name,
b.segment_name,
b.segment_type,
ROUND(b.BYTES / 1024 / 1024)
from dba_lobs a, dba_segments b
where a.segment_name = b.segment_name
and a.owner = 'SCOTT'
and a.table_name = 'LOB1'
union all
select a.owner,
a.table_name,
a.column_name,
b.segment_name,
b.segment_type,
ROUND(b.BYTES / 1024 / 1024)
from dba_lobs a, dba_segments b
where a.index_name = b.segment_name
and a.owner = 'SCOTT'
and a.table_name = 'LOB1';
OWNER           TABLE_NAME           COLUMN_NAME                    SEGMENT_NAME                   SEGMENT_TYPE       ROUND(B.BYTES/1024/1024)
--------------- -------------------- ------------------------------ ------------------------------ ------------------ ------------------------
SCOTT           LOB1                 TEXT                           SYS_LOB0000089969C00002$$      LOBSEGMENT                               63
SCOTT           LOB1                 TEXT                           SYS_IL0000089969C00002$$       LOBINDEX                                  0
--查询ts_lob表空间的表大小排行
SQL> select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments
where tablespace_name='TS_LOB' group by segment_name )
order by sx desc;
SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  208
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$            .0625
--查询lob字段SCOTT_LOB0000089963C00002$$ 、SCOTT_IL0000089963C00002$$:
SQL> col object_name for a30
SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME in('SYS_LOB0000089969C00002$$','SYS_IL0000089969C00002$$');
OWNER           OBJECT_NAME                    OBJECT_TYPE
--------------- ------------------------------ -------------------
SCOTT           SYS_IL0000089969C00002$$       INDEX
SCOTT           SYS_LOB0000089969C00002$$      LOB
SQL>  select OWNER,TABLE_NAME,COLUMN_NAME,SEGMENT_NAME,TABLESPACE_NAME,INDEX_NAME from dba_lobs where segment_name in('SYS_LOB0000089969C00002$$','SYS_IL0000089969C00002$$');
OWNER           TABLE_NAME           COLUMN_NAME                    SEGMENT_NAME                   TABLESPACE_NAME                INDEX_NAME
--------------- -------------------- ------------------------------ ------------------------------ ------------------------------ ------------------------------
SCOTT           LOB1                 TEXT                           SYS_LOB0000089969C00002$$      TS_LOB                         SYS_IL0000089969C00002$$
SQL>
SQL> select SEGMENT_NAME,bytes /1024/1024 sx from dba_segments where tablespace_name='TS_LOB' and SEGMENT_NAME in('SYS_LOB0000089969C00002$$','SYS_IL0000089969C00002$$');
SEGMENT_NAME                           SX
------------------------------ ----------
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$            .0625


一、先试着删除lob字段:

SQL>  alter table scott.lob1 drop (text);
Table altered.
SQL> select SEGMENT_NAME,bytes /1024/1024 sx from dba_segments where tablespace_name='TS_LOB' and SEGMENT_NAME in('SYS_LOB0000089969C00002$$','SYS_IL0000089969C00002$$');
no rows selected
SQL> select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;
SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  208


发现删除lob字段可以释放表空间。

--再次添加LOB字段:
SQL> alter  table scott.lob1 add (text clob);
Table altered.
SQL>  select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;
SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  208
SYS_LOB0000089969C00002$$           .0625
SYS_IL0000089969C00002$$            .0625


二、再次插入数据:

SQL> insert into scott.lob1 select LINE,text from dba_source;
637502 rows created.
SQL> insert into scott.lob1 select LINE,text from dba_source;
637502 rows created.
SQL> commit;
Commit complete.
SQL>  select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;
SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  208
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$            .0625
--接着试着truncate表LOB1
SQL> truncate table scott.lob1;
Table truncated.
SQL>  select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;
SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                .0625
SYS_LOB0000089969C00002$$           .0625
SYS_IL0000089969C00002$$            .0625


truncate表也可以释放lob字段数据;

三、再次插入数据:

SQL> insert into scott.lob1 select LINE,text from dba_source;
637502 rows created.
SQL> insert into scott.lob1 select LINE,text from dba_source;
637502 rows created.
SQL> commit;
Commit complete.
SQL>
SQL>  select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;
SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  184
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$            .0625


使用delete方式删除数据,实际上物理块还是被占用,高水位没有下降。

SQL> delete scott.lob1;
1275004 rows deleted.
SQL>
SQL> select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;
SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                  184
SYS_LOB0000089969C00002$$              63
SYS_IL0000089969C00002$$              .75
SQL> select count(*) from scott.lob1;
COUNT(*)
----------
0
SQL> truncate table scott.lob1;
Table truncated.
SQL> select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx from dba_segments where tablespace_name='TS_LOB' group by segment_name ) order by sx desc;
SEGMENT_NAME                           SX
------------------------------ ----------
LOB1                                .0625
SYS_LOB0000089969C00002$$           .0625
SYS_IL0000089969C00002$$            .0625


结论:在删除lob字段的大数据量时,可以采用重建表(CTAS)、删除lob字段再重建alter table table_name drop (column)、导出导入(只导出元数据)、或者直接truncate全表删除全表(包括lob)降低高水位。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论