南大通用GBase 8s大对象类型clob和text的比较说明

222 阅读5分钟

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在数据库的世界里,数据存储和管理是一项复杂而精细的工作。尤其是当我们涉及到大对象数据时,选择合适的字段类型对于性能和效率至关重要。本文我们将探讨数据库中的大对象字段类型——TEXT、CLOB、BYTE和BLOB,了解它们的特点、使用场景以及如何在实际应用中发挥它们的最大效用。

大对象字段类型的分类

  • 大对象字段类型是为了存储超过32KB以上的数据而使用的字段类型。 

  • 数据在32KB到2GB之间,推荐使用简单大对象字段类型。   

  • 数据在2GB到4TB之间,推荐使用智能大字段类型   。

  • 数据小于32KB的可以使用varchar类型,这个类型可以存储32KB以下的数据 。

由于三种字段类型的存储方式、检索方式都不一样,所以希望尽可能按照数据应用的大小选择应使用的类型,从而保证性能。

简单大对象text和byte

大字段数据分为两种:文本类型数据和二进制数据

  • 文本类型数据: TEXT,适用于32KB到2GB的文本类型数据。TEXT 数据类型存储任何文本数据。TEXT 列通常存储备忘录、手册章节、商业文档、程序源文件和其他文本类信息。   
  • 二进制数据: BYTE,适用于32KB到2GB的二进制类型数据,存储音视频类型数据。

智能大对象clob和blob

智能大对象类型是在简单大对象类型之上做的延伸,是针对超过简单大对象类型存储上限的数据而延伸出来的字段类型,即超过2GB大小数据的数据而使用的字段类型。

  • 文本类型数据: text可存储2GB以下的数据,超过这个大小则使用clob字段类型。   
  • 二进制类型数据: byte可存储2GB以下的⼆进制数据,超过这个大小则使用blob类型数据。

简单对象和智能大对象在数据库端使用的比较

1、text和byte字段类型在数据库工具使用的缺点

text和byte字段类型无法使用insert语句在数据库工具中插入,需要使用load的方式。   
text和byte在数据库端无法使用insert。

> create table test(id text,name byte);
Table created.
Elapsed time: 0.001 sec
> insert into test values('a','1');
617: A blob data type must be supplied within this context.
Error in line 1
Near character position 28

使用load语法插入简单大字段类型数据。

[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ cat test
a|a1
b|b1
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ dbaccess test 
Your evaluation license will expire on 2025-09-18 00:00:00
Database selected.
> load from 'test' delimiter '|' insert into test;
2 row(s) loaded.
Elapsed time: 0.002 sec
> select * from test;
id
a
name  <BYTE value>
id
b
name  <BYTE value>
2 row(s) retrieved.

load是从文件中加载数据,上述是从test文件中加载两行text和byte类型数据。

语法说明
load  from '文件路径和文件'  delimiter '分隔符,默认是|' insert into 表名;

2、智能对象在数据库端的使用

blob和clob字段类型可以更换模式的情况下可以使用insert语句插⼊。

gbase8s在3.3.0之后数据库分为了两种模式,一种是默认的gbase模式,还有一种是oracle模式,而blob和clob在oracle模式的情况下可以在数据库端使用insert插入。

调整数据库模式可以使用insert插入。

> create table test1(id clob,name blob);
Table created.
Elapsed time: 0.002 sec
> set environment sqlmode 'oracle';
Environment set.
Elapsed time: 0.002 sec
> insert into test1 values('c','c1');
1 row(s) inserted.
Elapsed time: 0.008 sec
>

简单对象和智能大对象在程序中的对比

1、简单对象在程序中的使用

简单大对象在数据库端无法使用insert插入,但是可以在程序中使用insert的方式式进行插入:text字段类型批量推荐方法如下:使用mybatis提供的ExecutorType.BATCH去实现批量插入。   
部分代码如下:

InputStream inputStream = Resources.getResourceAsStream(resource);
sf = new SqlSessionFactoryBuilder().build(inputStream);
sqlsession = sf.openSession(ExecutorType.BATCH,false);
TableOneMapper tableOneMapper = sqlsession.getMapper(TableOneMapper.clas
s);
List<TableTwo> list =new ArrayList<>();
for (int i=1;i<= 20000;i++){
   list.add(new TableTwo(i, UUID.randomUUID().toString(),UUID.randomUUID
().toString()));
}
long timeStamp1 = System.currentTimeMillis();
System.out.println("begin_time: "+timeStamp1);
list.stream().forEach(tableTwo -> tableOneMapper.instTab3(tableTwo));
long timeStamp2 = System.currentTimeMillis();
System.out.println("end_time: "+timeStamp2);
System.out.println(timeStamp2-timeStamp1);
sqlsession.commit();
sqlsession.close();----Mapper
如下
<insert id="instTab3" >
       insert into tabletwo values(
#{tableTwo.c1},#{tableTwo.c2},#{tableTwo.c3}
       );
</insert>

处理逻辑就是不使用集合作为参数传递给foreach去拼接sql, 而是将单个对象传递给mapper接口,这样处理大大减少了客户端与数据库的通信次数,极大增加效率。

2、智能对象在程序中的使用

一般方法使用智能大对象,先从缓冲中找到存储数据真实位置的文件描述符,再通过文件描述符去找到真实数据的位置,但是clob和blob字段类型的获取在大批量获取的时候,多并发获取文件描述符的时候会出现检索冲突或者返回结果为NULL的情况。

   
推荐方法:

如果数据真的超过2GB:

  • 针对mybatis框架,由于默认情况下是通过获取描述符的方式去获取数据的,所以可以通过改变获取方式从而跳过文件描述符,如取消mybatis框架中的GET CLOB协议。

  • 使用getstring的方式获取数据。  

数据没有超过2GB

  • 字符文本类型数据使用text类型。   
  • 二进制类型使用byte类型。   

总之,大对象字段类型的选择和管理是数据库设计中的一个重要方面。通过了解TEXT、CLOB、BYTE和BLOB的特点和使用场景,我们可以更好地优化数据库性能,提高数据处理的效率。在实际应用中,我们应该根据数据的大小和特性,选择最合适的字段类型,以确保数据的高效存储和快速检索。

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。