感谢:
http://halisway.blogspot.com/2007/06/reclaiming-lob-space-in-oracle.html
http://stackoverflow.com/questions/18367444/how-to-drop-oracle-lob
LOB字段是单独存储的,而且用delete是无法回收lob占用的空间。
SQL> create table lob_test (id number, data blob);
Table created.
-- 向lob_test中导入数据
SQL> @lobload
PL/SQL procedure successfully completed.
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
LOB_TEST TABLE 131072
SYS_IL0000316067C00002$$ LOBINDEX 131072
SYS_LOB0000316067C00002$$ LOBSEGMENT 134217728
-- 现在可以看到LOB是单独存储的
SQL> delete from lob_test;
500 rows deleted.
SQL> commit;
Commit complete.
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
LOB_TEST TABLE 131072
SYS_IL0000316067C00002$$ LOBINDEX 327680
SYS_LOB0000316067C00002$$ LOBSEGMENT 134217728
-- delete后,lob占用的空间没有释放
-- 再次导入
SQL> @lobload
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
LOB_TEST TABLE 131072
SYS_IL0000316067C00002$$ LOBINDEX 393216
SYS_LOB0000316067C00002$$ LOBSEGMENT 260046848
-- lob对应的segment 继续增长
-- 再次删除
SQL> delete from lob_test;
500 rows deleted.
SQL> commit;
Commit complete.
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
LOB_TEST TABLE 131072
SYS_IL0000316067C00002$$ LOBINDEX 655360
SYS_LOB0000316067C00002$$ LOBSEGMENT 260046848
SQL> alter table lob_test modify lob(data) (shrink space);
Table altered.
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
LOB_TEST TABLE 131072
SYS_IL0000316067C00002$$ LOBINDEX 655360
SYS_LOB0000316067C00002$$ LOBSEGMENT 65536
SQL> alter table lob_test modify lob(data) (shrink space);
Table altered.
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
LOB_TEST TABLE 131072
SYS_IL0000316067C00002$$ LOBINDEX 655360
SYS_LOB0000316067C00002$$ LOBSEGMENT 65536
--使用alter后 lob占用的空间被回收。
注意一
:在drop表的时候,如果不加purge ,lob segment一样不会被删除
删除lob_test前:
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
LOB_TEST TABLE 131072
SYS_IL0000316067C00002$$ LOBINDEX 655360
SYS_LOB0000316067C00002$$ LOBSEGMENT 134217728
SQL> drop table lob_test;
Table dropped.
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
BIN$+oFtu0VUcIzgQH+HqwZhEw==$0 TABLE 131072
SYS_IL0000316067C00002$$ LOBINDEX 655360
SYS_LOB0000316067C00002$$ LOBSEGMENT 134217728
依然可以看到lob字段,证明不加purge是不法释放lob segment的
在回收站中,清理lob_test表
SQL> purge table lob_test;
Table purged.
SQL> select segment_name, segment_type, bytes from user_segments;
no rows selected
证明使用purge可以释放lob segment。
注意二:
一开始的建表语句是:
create table lob_test (id number, data blob);
如果,建表时指定lob的segment,在drop不加purge时,lob的segment可以直接被删除,放入回收站中。
create table lob_test22(id number, data blob)
lob (data) store as data_blob_segment;
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
LOB_TEST22 TABLE 131072
SYS_IL0000316073C00002$$ LOBINDEX 131072
DATA_BLOB_SEGMENT LOBSEGMENT 134217728
SQL> drop table lob_test22;
Table dropped.
SQL> select segment_name, segment_type, bytes from user_segments;
SEGMENT_NAME SEGMENT_TYPE BYTES
------------------------------ ------------------ ----------
BIN$+oFtu0VWcIzgQH+HqwZhEw==$0 TABLE 131072
SYS_IL0000316073C00002$$ LOBINDEX 131072
BIN$+oFtu0VVcIzgQH+HqwZhEw==$0 LOBSEGMENT 134217728
SQL> select object_name, ORIGINAL_NAME from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME
------------------------------ --------------------------------
SYS_IL0000316073C00002$$ SYS_IL0000316073C00002$$
BIN$+oFtu0VVcIzgQH+HqwZhEw==$0 DATA_BLOB_SEGMENT
BIN$+oFtu0VWcIzgQH+HqwZhEw==$0 LOB_TEST22
附:
-bash-3.2$ cat lobload.sql
DECLARE
src_file BFILE := bfilename('MY_DIR', 'data.dat');
dst_file BLOB;
lgh_file BINARY_INTEGER;
cur_id NUMBER(10);
BEGIN
FOR i IN 1..500
LOOP
if (mod (i,10) = 0) then
dbms_output.put_line(i);
end if;
INSERT INTO lob_test22(id,data) VALUES(lob_test_seq.nextval,empty_blob())
RETURNING id into cur_id;
commit;
-- lock record
SELECT data INTO dst_file FROM lob_test22 WHERE id=cur_id FOR UPDATE;
dbms_lob.fileopen(src_file, dbms_lob.file_readonly);
lgh_file := dbms_lob.getlength(src_file);
dbms_lob.loadfromfile(dst_file, src_file, lgh_file);
dbms_lob.fileclose(src_file);
END LOOP;
END;
/
--这里的MY_DIR 是指数据库中的directory。如果使用create directory my_dir as '/tmp'; 那么这里就要求必须使用大写的MY_DIR。
移动LOB字段的哦其他表空间:
ALTER TABLE CENTER_ADMIN.NWS_NEWS
MOVE LOB(ABSTRACT)
STORE AS (TABLESPACE lob_test);
相关推荐
- 空间回收:使用`DBMS_SPACE`或`DBMS_RECYCLEBIN`管理已删除LOB占用的空间。 6. **LOB与索引** 对LOB字段建立索引需要特别注意,因为它们的大小可能导致性能问题。可以选择使用位图索引或快速全扫描索引。 7. *...
段空间管理涉及对特定类型数据(如表、索引、LOB等)的空间分配和回收;而表空间管理则是在更高层面上进行,涉及整个数据库内不同表空间的分配和使用策略。 ### 二、TRUNCATE语句:快速释放空间 当需要释放Oracle...
这种方法直接减少了数据文件所占用的空间。 - **清空表:** 使用`TRUNCATE TABLE`命令可以快速清空表中的所有数据,但不会改变表本身的结构。这有助于回收已分配但未使用的空间。 - **删除段:** 在某些情况下,可能...
自由空间区域是未被占用的空间,用于未来的更新和插入操作。 初始化事务槽(INITRANS)指定了在创建表或索引时预先分配的事务槽数量,而最大事务槽(MAXTRANS)则定义了块中可以分配的最大事务槽数量。PCTFREE参数...
- 当数据被删除,其占用的空间不会立即回收,而是标记为“已删除”,形成所谓的“空洞”。边界标志法帮助跟踪这些空洞的范围,便于后续插入操作使用。 - 边界标志法还涉及到分配单元(Allocation Units),这是SQL...
反向键索引用于减少索引的空间占用,并且在某些情况下能提高性能。 ```sql create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k next 200k pctincrease 0 maxextents 50) tablespace...
虚拟列通过计算表达式来存储值,它们并不占用存储空间,因为不能显式写入虚拟列。此外,还需要考虑表的存储位置和是否使用并行创建表、NOLOGGING、表压缩等选项。 创建表之后,可以使用SQL语句或Oracle大容量装载...
如果存在未删除的临时表或者长时间运行的事务,它们占用的空间可能无法被收缩。确保所有临时对象已清除,且没有阻塞的事务。 5. **大对象(LOB)数据**: TEXT、IMAGE、NVARCHAR(MAX)、VARBINARY(MAX)等大对象...
你也可以使用v$sysstat数据通过查询v$system_event视图来检查资源消耗和资源回收。 V$SYSSTAT中的常用统计 V$SYSSTAT中包含多个统计项,这部分介绍了一些关键的v$sysstat统计项,在调优方面相当有用。下列按...
mssql 微软 只能能运行在windows平台,体积比较庞大,占用许多系统资源, 但使用很方便,支持命令和图形化管理,收费。 中型企业 Mysql 甲骨文 是个开源的数据库server,可运行在多种平台, 特点是响应速度特别快,...
2、查看表空间物理文件的名称及大小 select tablespace_name, file_id, file_name, round(bytes/(1024*1024),0) total_space from dba_data_files order by tablespace_name; 3、查看回滚段名称及大小 ...