【问题标题】:What is the data length of CLOB in oracle?oracle中CLOB的数据长度是多少?
【发布时间】:2020-06-08 19:48:55
【问题描述】:
能否请您告诉我Employee表中“CLOB”数据类型的第二个column_id的数据长度是多少?我看到一些博客说最大数据长度是:(4GB -1)*(数据库块大小)。
我是这个数据设计的新手。
表:员工
**Column_Name ----- Data_Type ------- Nullable ---- Column_Id**
Emp_ID NUMBER No 1
Emp_details CLOB NO 2
请帮帮我。
【问题讨论】:
标签:
oracle
clob
datalength
【解决方案1】:
要获取给定行中给定列的 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
;
【解决方案2】:
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)。