返回顶部
首页 > 资讯 > 数据库 >SQL中如何释放大数据量的lob字段空间
  • 751
分享到

SQL中如何释放大数据量的lob字段空间

2024-04-02 19:04:59 751人浏览 安东尼
摘要

sql中如何释放大数据量的lob字段空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 SQL> creat

sql中如何释放大数据量的lob字段空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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)降低高水位。 

看完上述内容,你们掌握SQL中如何释放大数据量的lob字段空间的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: SQL中如何释放大数据量的lob字段空间

本文链接: https://lsjlt.com/news/67693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SQL中如何释放大数据量的lob字段空间
    SQL中如何释放大数据量的lob字段空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 SQL> creat...
    99+
    2024-04-02
  • Oracle数据库高水位释放——LOB字段空间释放
    在Oracle数据库中表随着数据增长,所占磁盘容量也会增长,当表中数据不再需要时,对表进行delete操作,表中代表所占空间的标志-高水位,不会随着数据删除而下降,高水位没有变化,即使删除了数据库,表所占...
    99+
    2024-04-02
  • MySQL如何解决delete大量数据后空间不释放的问题
    本篇内容主要讲解“MySQL如何解决delete大量数据后空间不释放的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL如何解决delete...
    99+
    2024-04-02
  • MySQL如何清理数据并释放磁盘空间
    在我们的生产环境中有一张表:courier_consume_fail_message,是存放消息消费失败的数据的,设计之初,这张表的数据量评估在万级别以下,因此没有建立索引。 但目前发现,该表的数据量已经达到百万级别,原因产生了大量的重试消...
    99+
    2023-10-27
    mysql 数据库 后端
  • es删除数据后空间不释放如何解决
    解决这个问题有多种方法,其中一种方法是使用数据库的压缩功能来释放被删除数据所占用的空间。另外,可以定期对数据库进行备份和恢复操作,这...
    99+
    2024-04-09
    es
  • sql如何查看表中字段数据类型
    要查看表中字段数据类型,可以使用SQL的DESCRIBE或者SHOW命令。例如,可以使用以下命令查看表中所有字段的数据类型: DES...
    99+
    2024-04-09
    sql
  • sql如何查询两个时间段之间的数据
    SQL查询两个时间段之间的数据可以使用`BETWEEN`关键字。以下是一个示例查询语句:```sqlSELECT * FRO...
    99+
    2023-09-13
    sql
  • sql如何去掉数据字段中特定的内容
    要去掉数据字段中特定的内容,可以使用SQL中的REPLACE函数来替换特定内容为空字符串。以下是一个示例: 假设有一张表tbl_us...
    99+
    2024-04-02
  • 数据库中如何查询表空间大小
    这篇文章主要为大家展示了“数据库中如何查询表空间大小”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“数据库中如何查询表空间大小”这篇文章吧。 ...
    99+
    2024-04-02
  • 如何从空的 interface{} 类型访问 JSON 数据中的字段?
    大家好,我们又见面了啊~本文《如何从空的 interface{} 类型访问 JSON 数据中的字段?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Go...
    99+
    2024-04-05
  • SQL 如何在时间序列中根据字段变化分组
    将排序(一般按时间排)后的数据按某字段变化分组统计,也就是分组字段值与上一行的值比较,如果相同则分到与上一行同组,不同时则创建一个新组。 这个问题用SQL来做很难! SQL的集合是无序的,早期SQL没有相邻行引用的方法。SQL2003标...
    99+
    2018-04-15
    SQL 如何在时间序列中根据字段变化分组
  • Oracle中如何使用CLOB大数据字段类型
    这篇文章将为大家详细讲解有关Oracle中如何使用CLOB大数据字段类型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、Oracle中的varchar2类...
    99+
    2024-04-02
  • sql如何去掉某个字段重复的数据
    要去掉某个字段重复的数据,可以利用SQL的DISTINCT关键字来实现。具体的SQL语句如下: SELECT DISTINC...
    99+
    2024-04-27
    sql
  • oracle如何查出某个字段带空格的数据
    这篇文章主要为大家展示了“oracle如何查出某个字段带空格的数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“oracle如何查出某个字段带空格的数据”这篇文...
    99+
    2024-04-02
  • 如何查询过去一段时间内某条sql使用的临时表空间大小
    小编给大家分享一下如何查询过去一段时间内某条sql使用的临时表空间大小,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!查询过去一段时间内使用的temp表空间大小需要查询V$ACTIVE_SE...
    99+
    2024-04-02
  • 如何释放阿里云数据库中的文件
    # 在使用阿里云数据库时,有时候会遇到需要释放数据库中一些不再使用的文件的情况。本文将介绍如何在阿里云数据库中释放文件的方法和步骤。步骤一:备份文件在释放文件之前,首先需要备份文件,以免误操作导致数据丢失。可以使用阿里云数据库提供的备份功能...
    99+
    2024-01-17
    阿里 数据库中 文件
  • 如何解决LINUX中文件已删除但空间不释放的问题
    这篇文章主要介绍“如何解决LINUX中文件已删除但空间不释放的问题”,在日常操作中,相信很多人在如何解决LINUX中文件已删除但空间不释放的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决LINUX...
    99+
    2023-06-13
  • Mysql中如何批量替换某个字段的部分数据
    这期内容当中小编将会给大家带来有关Mysql中如何批量替换某个字段的部分数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.修改字段里的所有含有指定字符串的文字UPDA...
    99+
    2024-04-02
  • 数据库中如何查看各个表所用空间大小
    这篇文章将为大家详细讲解有关数据库中如何查看各个表所用空间大小,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 CREATE PROCEDUR...
    99+
    2024-04-02
  • 数据库中如何创建非默认块大小表空间
    这篇文章主要介绍数据库中如何创建非默认块大小表空间,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! SQL> create tablespace t...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作