LOB类型
| 类型 | 
存储对象 | 
| BLOB | 
存储二进制数据 | 
| CLOB | 
存储字符数据,使用UTF-8编码 | 
LOB存储方式
| 数据长度 | 
存储类型 | 
存放位置 | 
| <= 4KB | 
LOB_INLINE | 
以dp文件存储 | 
| > 4KB | 
LOB_LOCATOR | 
hdfs指定位置 | 
说明
存储类型为LOB_LOCATOR时,不代表dp为空,dp文件存放的lob索引文件名偏移量等信息;
先读取dp中lob索引文件的信息,根据信息再从索引文件中获取lob数据文件的文件名偏移量等信息,最后根据索引信息获取lob具体数据
 
LOB_LOCATOR存储位置
- 正常情况:
 
1
   | /xcloud_name/cluster_name.data/db_name/schema_name/table_id/session_id/LOB/lob_file_name
   | 
 
- LLVM计算:
 
1
   | /xcloud_name/cluster_name.data/SYS.TEMP/db_name/schema_name/session_id/LOB/lob_file_name
   | 
 
注意
Writer会根据数据长度设置Lob存储类型读取lob数据时,需要根据存储类型区分读取方式,LOB_INLINE直接从lob中读取,LOB_LOCATOR使用Reader读取
 
1
   | static const int32_t LOB_INLINE_SIZE = 4 * 1024;
   | 
 
LOB文件命名
普通文件
1
   | lob.[trans_id].[unique_id].[hostname]_[pid].index
   | 
 
1
   | lob.[trans_id].[unique_id].[hostname]_[pid]
   | 
 
llvm计算文件
1
   | lob.llvm.[unique_id].[hostname]_[pid].index
   | 
 
1
   | lob.llvm.[unique_id].[hostname]_[pid]
   | 
 
说明
索引文件和数据文件成对出现,索引文件的文件名仅比数据文件的文件名多.index后缀
 
相关配置参数
| 参数名 | 
说明 | 
参数类型 | 
默认值 | 
参数值范围 | 
| compaction_lob_file_valid_threshold | 
每个lob数据文件中允许无效的lob个数占总lob个数的比例小于该比例. | 
double | 
0.5 | 
(0, 1] | 
| compaction_lob_tiny_file_num_threshold | 
compaction时,LOB微小文件必须进行compaction的数据阈值.微小文件的数量超过该值时,也必须进行compaction. | 
int32 | 
50 | 
[1, 100] | 
| compaction_lob_tiny_file_size_threshold | 
lob compaction的时候,LOB文件大小小于该临界值的文件认为是小文件. | 
int64 | 
1073741824 | 
[128MB, 4GB] | 
| lob_index_cache_num | 
LOB Writer中的索引Cache的数量.用于写入LOB数据. | 
int32 | 
1024 | 
[128, 4096] | 
| lob_insert_cache_size | 
内部表加载时,用于拷贝LOB数据的缓存大小. | 
int32 | 
1048576 | 
[1MB, 2GB) | 
| max_lob_size | 
LOB类型支持最大数据长度. | 
int64 | 
4294967296 | 
[16MB, 8GB] | 
| lob_compression_type | 
LOB数据文件中的压缩类型.uncompressed: 表示不压缩;lz4: 表示lz4. | 
string | 
uncompressed | 
uncompresse,lz4 | 
| 参数名 | 
说明 | 
参数类型 | 
默认值 | 
参数值范围 | 
| lob_delete_factor | 
每个lob数据文件中允许无效的lob个数占总lob个数的比例小于该比例. | 
double | 
0.5 | 
(0, 1] | 
| lob_compaction_small_files_cnt | 
LOB小文件的数量达到该临界值的时候,也需要进行compaction. | 
int32 | 
50 | 
[1, 100] | 
| lob_compaction_small_file_size | 
lob compaction的时候,LOB文件大小小于该临界值的文件认为是小文件. | 
int64 | 
1073741824 | 
[128MB, 4GB]  | 
| lob_writer_cache_index_cnt | 
每一个lob Writer缓存的lob索引的数量. | 
int32 | 
1024 | 
[128, 4096] | 
| lob_copy_data_length | 
local insert时候,拷贝数据需要的缓存长度. | 
int32 | 
1048576 | 
[1MB, 2GB) | 
| lob_max_data_size | 
lob类型支持最大数据长度为4G. | 
int64 | 
4294967296 | 
[16MB, 8GB] | 
| lob_compressionType | 
lob数据压缩方式,默认0:表示不压缩,1:表示lz4. | 
int32 | 
0 | 
{0, 1} | 
 
LOB文件大小
单个lob文件最大1TB
lob触发compaction的两种机制
- update操作,lob文件中无效lob比例 >= 
lob_delete_factor 
- lob小文件数量 >= 
lob_compaction_small_files_cnt 
说明
- update操作才会产生无效数据,delete不会
 
- LOCATOR存储的lob,若update后的数据长度小于4KB,是不会进行compaction的,此时lob属于INLINE存储,原lob仅增加delete标记
 
 
使用为NULL的LOB
lob为null,其成员函数几乎都不可使用,强制使用会访问空指针(m_lobInfo = null),导致崩溃,可使用XCLob::IsNull()方法判断lob是否为null
 
export clob
支持导出真实数据,如果数据太长,依然用<CLOB>替代真实数据,长度限制查看配置,导出和导入用的同一套配置参数csv_file_with_clob_max_buffer_size和csv_file_max_buffer_size
blob加载多媒体文件
通过csv文件进行加载,csv文件中写入多媒体文件的路径
示例:存在/home/gaoyuanfeng/3.0/blob_insert.csv该路径的csv文件,文件内容如下
1 2
   | "/home/gaoyuanfeng/3.0/picture2.png" "/home/gaoyuanfeng/3.0/picture2.png"
   | 
 
inset使用/*+LOB_FROM_EXTFILE*/hit进行加载
1 2
   | CREATE TABLE BLOB_TEST(picture BLOB); INSERT INTO  BLOB_TEST '/home/gaoyuanfeng/3.0/blob_insert.csv' SEPARATOR ';' DELIMITER '"';
   |