We stuck on a BLOB column segment. It took me a couple hours to find the solution.
Here is the solution demo.
Create a table with BLOB column,
drop table t2 purge; CREATE TABLE t2 ( n1 NUMBER(10), d1 date, b1 BLOB, CONSTRAINT t2_PK PRIMARY KEY (n1) USING INDEX TABLESPACE index_auto ) TABLESPACE data_auto;Displays the large objects (LOBs) contained in tables
select b.TABLE_NAME, b.COLUMN_NAME, b.SEGMENT_NAME, b.TABLESPACE_NAME, b.INDEX_NAME from user_lobs b; SELECT SEGMENT_NAME, segment_type, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS FROM user_SEGMENTS WHERE segment_type like '%LOB%' ORDER BY SEGMENT_NAME; SELECT b.TABLE_NAME, b.COLUMN_NAME, b.SEGMENT_NAME, b.TABLESPACE_NAME, b.INDEX_NAME ,s.bytes, s.blocks, s.extents FROM user_lobs b, user_segments s WHERE b.table_name = 'T2' and b.column_name = 'B1' and s.segment_type like 'LOB%' and s.segment_name = b.segment_name;
Test Shrink a BASICFILE LOB segment only
truncate table t2; declare l_blob blob; l_size number := 32700; begin for i in 1 .. 15 loop insert into t2(n1,b1) values (i, empty_blob() ) returning b1 into l_blob; dbms_lob.writeappend( l_blob, l_size, utl_raw.cast_to_raw(rpad('*',l_size,'*'))); end loop; commit; end; / delete t2; commit; SELECT b.TABLE_NAME, b.COLUMN_NAME, b.SEGMENT_NAME, b.TABLESPACE_NAME, b.INDEX_NAME ,s.bytes, s.blocks, s.extents FROM user_lobs b, user_segments s WHERE b.table_name = 'T2' and b.column_name = 'B1' and s.segment_type like 'LOB%' and s.segment_name = b.segment_name; BYTES BLOCKS EXTENTS ---------- ---------- ---------- 720896 88 11 ALTER TABLE t2 MODIFY LOB (b1) (SHRINK SPACE); SELECT b.TABLE_NAME, b.COLUMN_NAME, b.SEGMENT_NAME, b.TABLESPACE_NAME, b.INDEX_NAME ,s.bytes, s.blocks, s.extents FROM user_lobs b, user_segments s WHERE b.table_name = 'T2' and b.column_name = 'B1' and s.segment_type like 'LOB%' and s.segment_name = b.segment_name; BYTES BLOCKS EXTENTS ---------- ---------- ---------- 65536 8 1
Note
Shrink command will generate about same size of redo/archive logs as LOB storage space size.Reference.
Shrink a table and all of its dependent segments (including BASICFILE LOB segments):
ALTER TABLE t2 ENABLE ROW MOVEMENT; ALTER TABLE t2 SHRINK SPACE CASCADE;
Shrink a BASICFILE LOB segment only:
ALTER TABLE t2 MODIFY LOB (b1) (SHRINK SPACE);
No comments:
Post a Comment