在数据库管理中,数据导入通常是一个耗时的过程,特别是在处理大量数据时。南大通用GBase 8s数据库提供的表类型——Raw表为数据导入和批量更新提供了优化方案。本文将详细介绍Raw表的概念、优点、使用限制以及实际应用示例,帮助您在数据管理中实现更高效的操作。

Raw表的定义

Raw表,即裸表(raw table)是非日志记录的永久表,类似于非日志记录数据库中的表。支持但不记录裸表中行内的更新、插入和删除操作。可在裸表中定义索引,但是不能在裸表中定义唯一约束、主键约束或引用约束。

Raw表的优点

表DML操作不记录日志,提高数据操作速度。

Raw表的限制

1、不支持(主键、唯一、引用)约束,但支持非空约束;
2、在集群主节点上可用;
3、在集群备节点上不可访问;
4、将裸表改成标准表,需要0级备份;

Raw表的其他注意事项

1、对表的DDL操作(如建索引,修改字段)仍然记录日志;
2、可以创建索引,包含唯一索引;

Raw表使用技巧

如果需要导入的数据过多,可以使用raw表来提升速度。

下面以一个存储过程插入100000条表数据举例:

注:数据库使用版本GBase 8s V8.8_3.5.1

先导入环境变量,可查看每条sql的执行时间

export DBACCESS_SHOW_TIME=1

dbaccess执行以下SQL命令:

drop database if exists test;  
create database test with log;  
set environment sqlmode 'oracle';  
set serveroutput on;  
  
create table test(id int,col1 int);  
  
create or replace procedure insert_test(v_number int) is  
begin  
    for i in 1..v_number loop  
        insert into test values(i, i);  
    end loop;  
end;  
/  
  
call insert_test(100000);  
select count(*) from test;  
  
truncate table test;  
select count(*) from test; 
 
alter table test type(raw);  
call insert_test(100000);  
select count(*) from test;

输出结果如下:

> drop database if exists test;
Database dropped.
Elapsed time: 0.016 sec

> create database test with log;
Database created.
Elapsed time: 0.357 sec

> set environment sqlmode 'oracle';
Environment set.
Elapsed time: 0.001 sec

> set serveroutput on;
set serveroutput succeed.
Elapsed time: 0.001 sec

> create table test(id int,col1 int);
Table created.
Elapsed time: 0.003 sec

> create or replace procedure insert_test(v_number int) is
begin
for i in 1..v_number loop
insert into test values(i, i);
end loop;
end;
> /
Routine created.

> call insert_test(100000);
Routine executed.
Elapsed time: 19.166 sec

> select count(*) from test;
       (COUNT(*)) 
           100000
1 row(s) retrieved.
Elapsed time: 0.002 sec

> truncate table test;
Table truncated.
Elapsed time: 0.002 sec

> select count(*) from test;
       (COUNT(*)) 
               0
1 row(s) retrieved.
Elapsed time: 0.002 sec

> alter table test type(raw);
Table altered.
Elapsed time: 0.002 sec

> call insert_test(100000);
Routine executed.
Elapsed time: 0.509 sec

> select count(*) from test;
       (COUNT(*)) 
           100000
1 row(s) retrieved.
Elapsed time: 0.002 sec

可以看出,普通表使用19秒,而raw表仅使用0.5秒。

而后将raw表改为标准表:

alter table test type(standard);

0级备份:

ontape -s -L 0

通过本文的介绍和示例,我们可以看到GBase 8s的Raw表在处理大量数据导入时的优势。它不仅能够提高数据操作的速度,还能在适当的场景下提供灵活的数据管理方案。希望本文能够帮助您更好地利用GBase 8s的Raw表特性,优化您的数据库性能。