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表空间也会释放空间。

  • 相关阅读:
    ELK Kafka json to elk
    ElasticSearch 日期赋值
    ELK Nxlog->Kafka->ElasticSearch
    Windows 安装Kafka
    图论路径简单算法
    鉴以往而知未来
    细微之处显文化
    Alt+数字键所能打出的符号表
    《愚公移山》与愚公精神
    Wikipedia's World
  • 原文地址:https://www.cnblogs.com/zfox2017/p/6991514.html
Copyright © 2011-2022 走看看