0

您能否让我知道 Employee 表中“CLOB”数据类型的第二个 column_id 的数据长度是多少?我看到一些博客说最大数据长度是:(4GB -1)*(数据库块大小)。

我是这个数据设计的新手。

表:员工

**Column_Name ----- Data_Type ------- Nullable ---- Column_Id**
Emp_ID              NUMBER             No            1
Emp_details         CLOB               NO            2

请帮我。

4

2 回答 2

2

要获取给定行中给定列的 CLOB 大小,请使用 DBMS_LOB.GETLENGTH 函数:

select dbms_lob.getlength(emp_details) from employee from emp_id=1;

要获取在表空间中分配的给定表中给定列的 CLOB 大小,您需要识别实现 LOB 的两个段。

您可以将这两个大小与以下查询进行比较:

select v1.col_size, v2.seg_size from
  (select sum(dbms_lob.getlength(emp_details)) as col_size from employee) v1,
  (select sum(bytes) as seg_size from user_segments where segment_name in
   (
    (select segment_name from user_lobs where table_name='EMPLOYEE' and column_name='EMP_DETAILS')
     union
    (select index_name from user_lobs where table_name='EMPLOYEE' and column_name='EMP_DETAILS')
   )
  ) v2
 ;
于 2020-06-08T21:03:08.913 回答
0

LOB 不存储在表中,而是使用 LOB 索引存储在称为 LOB 段的专用结构中。正如@pifor 解释的那样,您可以在字典视图中检查这些结构user_lobs

LOB 段使用通常为 8192 字节的块(检查 user_lobs 中的表空间),因此为单个 LOB 分配的最小大小为 8K。对于 10.000 字节,您需要两个 8K 块,依此类推。

请注意,如果您的数据库设置为 Unicode(就像大多数现代 Oracle 数据库一样),CLOB 的大小大约是预期的 2 倍,因为它们以 16 位编码存储。

如果您压缩 LOB,情况会好一些,但您的 Oracle 许可证需要涵盖“高级压缩”。

对于非常小的 LOB(小于 ca 4000 字节),您可以避免 8K 开销并将它们存储在所有其他列都为 ( enable storage in row) 的表中。

于 2020-06-12T20:38:35.027 回答