移动 LOB 大小超过实际大小

问题描述 投票:0回答:1
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对象?

oracle database-administration oracle19c
1个回答
0
投票

几种可能性

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 个字节。

© www.soinside.com 2019 - 2024. All rights reserved.