GaussDB(DWS)支持SQL标准SQL92/SQL2003,与Teradata的SQL语法有一些差异,需要在业务迁移的过程中进行转换。
GaussDB(DWS)创建database时,需直接添加TD兼容模式属性,兼容性分析也是基于TD兼容模式下的最小化影响输出;
1 数据类型差异
由于国内(中文字符)环境使用Teradata数据库(下文简称TD)时,通过采用默认的Latin字符集用于存储GBK数据,而迁移至GaussDB(DWS)平台时,均建议采用规范的UTF8字符集,故字符型字段中若存在中文时,从TD迁移GaussDB(DWS)时,需要关注字符长度扩增问题,即基于中文一个字符在TD中占据2个字符长度,而迁移至GaussDB(DWS)平台时一个字符占据3个长度。
- 默认扩展:TD varchar(N) 迁移至 GaussDB(DWS)定义 varchar(2*N)
- 考虑到精细化落地时,通常PK/PI/PPI字符字段不含中文,可忽略Char类型可不需考虑长度变化,其主要应用于固定字符长度以及字段,而Varchar类型需默认
- 存在数据类型差异
Teradata |
GaussDB(DWS) |
Vargraphic |
VARCHAR |
Long Vargraphic |
VARCHAR |
Byte |
BYTEA |
Varbyte |
BYTEA |
ByteInt |
Tinyint |
Float |
REAL / Double Precision |
Blob |
BYTEA |
PERIOD |
tsrange |
2 表定义差异
迁移过程中,关注以下差异对照:
- 可变临时表Volatile;
- 是否允许重复记录Set/MultiSet;
- 行列存存储格式
- 大小写敏感NOT CASESPECIFIC/ CASESPECIFIC
- 字段字符集设置Character set Latin…
- 字段多值压缩属性compress …
- 字段数据格式化显式属性format …
- 字段标题属性设置Title ‘xxx’
- 分区定义设置Partition by …
- 可变临时表Volatile
Session级数据表,只存在于session级,当会话中断,数据丢失
- Teradata:
CREATE VOLATILE TABLE cities
(
name VARCHAR(80) cs,
name2 VARCHAR(80) NOT CS
);
- GaussDB(DWS):
CREATE Temp TABLE cities
(
name VARCHAR(80) ,
name2 VARCHAR(80)
);
- 是否允许重复记录Set/MultiSet
TD若不显式带Set/MultiSet属于,默认Set,不允许数据表存在重复记录;GaussDB(DWS)不存在Set属于表参数,即只支持MultiSet表,若需要过滤重复记录,需ETL过程清洗去重;
- Teradata:
CREATE set/Multiset TABLE cities
(
name VARCHAR(80) cs,
name2 VARCHAR(80) NOT CS
);
- GaussDB(DWS):
CREATE TABLE cities
(
name VARCHAR(80) ,
name2 VARCHAR(80)
);
- 行列存存储格式
数据仓库属于重分析型系统,迁移过程中,若原TD平台不存在大量频繁update操作、少量记录操作而非批量操作场景,则建议TD迁移GaussDB(DWS)时,将行存表迁移成GaussDB(DWS)平台的列存表,同时compress属性选择middle;
行存示例
- Teradata:(默认行存)
CREATE TABLE cities
(
name VARCHAR(80) cs,
name2 VARCHAR(80) NOT CS
)primary index(name);
- GaussDB(DWS):
CREATE TABLE cities
(
name VARCHAR(80) ,
name2 VARCHAR(80)
)with (orientation=row)
Distribute by hash(name);
列存示例
- Teradata:
CREATE TABLE cities
(
name VARCHAR(80) cs,
name2 VARCHAR(80) NOT CS
)primary by column;
- GaussDB(DWS):
CREATE TABLE cities
(
name VARCHAR(80) ,
name2 VARCHAR(80)
)with (orientation=column)
Distribute by hash(name);
- 大小写敏感NOT CASESPECIFIC/ CASESPECIFIC
GaussDB(DWS)不支持大小写敏感定义,即默认是字符敏感“CASESPECIFIC”;
- Teradata:
CREATE MULTISET VOLATILE TABLE cities
(
name VARCHAR(80) NOT CASESPECIFIC,
name2 VARCHAR(80) CASESPECIFIC
);
- GaussDB(DWS):
CREATE Temp TABLE cities
(
name VARCHAR(80) ,
name2 VARCHAR(80)
);
- 字段字符集设置Character set Latin…
GaussDB(DWS)不支持表级字符集,在数据库创建时显示指定字符集,且不能事后变更数据库字符集属性,若修改需重新搬迁数据;
- Teradata:
CREATE MULTISET VOLATILE TABLE cities
(
name VARCHAR(80) Character set Latin,
name2 VARCHAR(80) Character set Unicode
);
- GaussDB(DWS):
CREATE Temp TABLE cities
(
name VARCHAR(80) ,
name2 VARCHAR(80)
);
- 字段多值压缩属性compress …
GaussDB(DWS)不支持类似TD的MVC多值压缩属性,存在表级数据块压缩属性;
- Teradata:
CREATE MULTISET VOLATILE TABLE cities
(
name VARCHAR(80) compress(‘Shen zhen’,’Xi an’),
name2 VARCHAR(80) compress
);
- GaussDB(DWS):
CREATE Temp TABLE cities
(
name VARCHAR(80) ,
name2 VARCHAR(80)
);
- 字段数据格式化显式属性format …
TD平台format属于不影响数据存储,只影响用户取用数据时展示样式;GaussDB(DWS)不支持format定义,若需数据格式化,可通过to_char函数实现;
TD所有类型数据值可设置format,通过用户只会在日期时间类型上显式设置;
- Teradata:
CREATE MULTISET VOLATILE TABLE cities
(
name VARCHAR(80),
mnt_dt date format ‘YYYY-MM-DD’
);
- GaussDB(DWS):
CREATE Temp TABLE cities
(
name VARCHAR(80) ,
mnt_dt date
);
- 字段标题属性设置Title ‘xxx’
TD平台字段除了和GaussDB(DWS)一样有Comment增加字段描述信息,还可通过表字段Title定义字段的标题;GaussDB(DWS)不支持Title定义,若需要等价于增加Comment信息即可;
- Teradata:
CREATE MULTISET VOLATILE TABLE cities
(
name VARCHAR(80) title ‘城市名称’,
mnt_dt date
);
- GaussDB(DWS):
CREATE Temp TABLE cities
(
name VARCHAR(80) ,
mnt_dt date
);
--only using comment instead.
comment on column cities.name is '城市';
- 分区定义设置Partition by …
TD平台支持范围range和值case分区,并支持动态定义分区(current_date,但较少人使用);GaussDB(DWS)暂时只支持range,即主要通过less than方式实现分区;
同时,由于两个平台存储差异性,不建议GaussDB(DWS)像TD一样创建过多分区,即GaussDB(DWS)根据数据访问频度,近期数据创建细粒度分区,提高访问速度,较少访问数据尽量合并分区(如下示例)。根据系统规模,通常单DN小于500MB的数据表可以不考虑创建分区表。
- Teradata:
CREATE MULTISET VOLATILE TABLE cities
(
name VARCHAR(80) title ‘城市名称’,
mnt_dt date
)
Partition by (range_n(
Mnt_dt between date’0001-01-01’ and date’0001-01-04’
each interval ‘1’ day,
date ‘0000-01-05’ and date ‘2009-12-31’,
date ‘2010-01-01’ and date ‘2050-12-31’ each interval ‘1’ day,
date ‘2051-01-01’ and date’9999-12-31’
,no range));
- GaussDB(DWS):
CREATE Temp TABLE cities
(
name VARCHAR(80) ,
mnt_dt date
)
partition by range(mnt_dt)
(
PARTITION I00 VALUES LESS THAN (date '0001-01-04'),
PARTITION I01 VALUES LESS THAN (date '2009-12-31'),
PARTITION Y20 VALUES LESS THAN (date '2021-01-01'),
PARTITION M01 VALUES LESS THAN (date '2021-02-01'),
PARTITION M02 VALUES LESS THAN (date '2021-03-01'),
PARTITION D01 VALUES LESS THAN (date '2021-03-02'),
PARTITION D02 VALUES LESS THAN (date '2021-03-03'),
***
PARTITION D31 VALUES LESS THAN (date '2021-04-01'),
PARTITION I99 VALUES LESS THAN (MAXVALUE)
);
3 视图定义差异
- 视图迁移差异
限于TD平台锁机制差异性,其视图中往往会增加“Locking table xxxx for access”用于并发访问,迁移GaussDB(DWS)平台时,直接移除即可实现访问;
- Teradata:
replace view v_cities as
locking table cities for access
select * from cities;
- GaussDB(DWS):
Create or replace view v_cities as
select * from cities;
其它类型对象待续……