【数仓迁移】TD迁移GaussDB(DWS)之DDL迁移对照

GaussDB(DWS)支持SQL标准SQL92/SQL2003,与TeradataSQL语法有一些差异,需要在业务迁移的过程中进行转换。

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)不支持类似TDMVC多值压缩属性,存在表级数据块压缩属性;

  • 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;

 

其它类型对象待续……

(完)