SELECT BYTES/ (1024*1024*1024) GB
FROM DBA_SEGMENTS D
JOIN DBA_LOBS L ON L.SEGMENT_NAME = D.SEGMENT_NAME
WHERE D.OWNER = 'SCHEMA_NAME' AND SEGMENT_NAME = 'MY_LOB'
国标 |
---|
100 |
实际 LOB 对象大小 = 100 GB,但将 LOB 移动到另一个表空间时,它占用的空间超过 100 GB。
Oracle 版本 19c。
如何找到精确移动大小的LOB对象?
几种可能性
1 - 您没有考虑 LOB 索引段(尽管这些索引段通常相对于 LOB 段本身很小)
2 - 您正在将 lob 内容的总和与预期的段大小进行比较。根据您的字符集,这可能会超出 2 倍,例如
SQL> select * from dba_segments
2 where tablespace_name = 'LARGETS';
no rows selected
SQL> select * from dba_segments
2 where tablespace_name = 'LARGETS';
no rows selected
SQL>
SQL> create table t
2 ( x int, c clob ) tablespace largets;
Table created.
SQL>
SQL> insert into t
2 select rownum, rpad('x',32000,'x')
3 from dual
4 connect by level <= 1024*1024*1024/32000;
33554 rows created.
SQL> commit;
Commit complete.
SQL> select sum(dbms_lob.getlength(c))
2 from t;
SUM(DBMS_LOB.GETLENGTH(C))
--------------------------
1073728000
SQL> select segment_name
2 from user_lobs
3 where table_name = 'T';
SEGMENT_NAME
------------------------------
SYS_LOB0000177878C00002$$
SQL> select bytes/ (1024*1024) gb
2 from dba_segments d
3 where segment_name = 'SYS_LOB0000177878C00002$$';
GB
----------
2240.25
SQL> select segment_name, bytes
2 from dba_segments
3 where tablespace_name = 'LARGETS';
SEGMENT_NAME BYTES
------------------------------ ----------
T 2097152
SYS_IL0000177878C00002$$ 65536
SYS_LOB0000177878C00002$$ 2349072384
多字节字符集数据库中的 LOBS 以 UCS2 格式存储,因此每个字符 2 个字节。