zoukankan      html  css  js  c++  java
  • oracle Lob对象空间回收测试

    备注:转自网络

    SQL> create table t(time date,text clob);
    SQL> begin
    for i in 1 .. 10000 loop
    insert into t values(sysdate,rpad('a', 4000, 'a'));
    commit;
    end loop;
    end;
    /

    SQL> select count(*) from t; --10000

    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 83886080
    SQL> select sum(dbms_lob.getlength(text)) as bytes from t; --40000000
    SQL> delete from t;
    SQL> commit;
    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 83886080
    SQL> select sum(dbms_lob.getlength(text)) as bytes from t; --输出为null
    可以看见删掉以后,空间没有释放,再次想表中插入10000跳记录。

    SQL> begin
    for i in 1 .. 10000 loop
    insert into t values(sysdate,rpad('a', 4000, 'a'));
    commit;
    end loop;
    end;
    /

    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 167772160

    SQL> select sum(dbms_lob.getlength(text)) as bytes from t; --40000000
    SQL> delete from t;
    SQL> commit;

    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 167772160
    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    SQL> select sum(dbms_lob.getlength(text)) as bytes from t; --输出为null
    ----------空间依然没有释放,下面释放空间。
    SQL> alter table t modify lob (text) (shrink space);
    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 65536
    SQL> select sum(dbms_lob.getlength(text)) as bytes from t; --输出为null

    SQL> begin
    for i in 1 .. 10000 loop
    insert into t values(sysdate,rpad('a', 4000, 'a'));
    commit;
    end loop;
    end;
    /

    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 83886080
    SQL> truncate table t;
    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 65536
    可以看见truncate会释放空间。


    SQL> begin
    for i in 1 .. 10000 loop
    insert into t values(sysdate,rpad('a', 4000, 'a'));
    commit;
    end loop;
    end;
    /

    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 83886080
    SQL> delete from t;
    SQL> commit;
    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 83886080
    SQL> alter table t move lob(text) store as(tablespace tab1);
    SQL> select table_name, column_name, segment_name, a.bytes from dba_segments a join dba_lobs b using (owner, segment_name) where b.table_name = 'T';
    TABLE_NAME COLUMN_NAME SEGMENT_NAME BYTES
    ------------------------------ -------------------- ------------------------------ ----------
    T TEXT SYS_LOB0000102100C00002$$ 65536
    move表空间也会释放空间。

  • 相关阅读:
    从壹开始前后端分离[.NetCore ] 38 ║自动初始化数据库(不定期更新)
    从壹开始前后端分离[.NetCore] 37 ║JWT实现权限与接口的动态分配——复杂策略授权
    从壹开始微服务 [ DDD ] 之十二 ║ 核心篇【下】:事件驱动EDA 详解
    从壹开始微服务 [ DDD ] 之八 ║剪不断理还乱的 值对象和Dto
    从壹开始微服务 [ DDD ] 之七 ║项目第一次实现 & CQRS初探
    CentOS7下的CDH 6.2.0 安装过程
    php获取客户端IP地址的方法
    IntelliJIdea 2016.2 使用 tomcat 8.5 调试spring的web项目时,bean被实例化两次导致timer和thread被启动了两遍的问题的解决
    Linux 系统 TCP优化
    Fedora 25-64位操作系统中安装配置Hyperledger Fabric过程
  • 原文地址:https://www.cnblogs.com/zfox2017/p/6991514.html
Copyright © 2011-2022 走看看