南大通用数据迁移之GaussDB_To_GBase8a(三)迁移SQL差异

原文链接:https://www.gbase.cn/community/post/3869

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



1.大小写敏感差异

GaussDB中SQL语法关于双引号的规则:不带双引号的标识强制转换成小写,而双引号保护字母不进行大小写转换,并且允许在标识符中使用空白。在双引号中,成对的双引号在结果名字中分析成一个双引号。比如,FOO"BAR"BAZ解析成fooBARbaz;而"Aweird""name"解析成A weird"name。
GBase 8a在默认情况下是大小写敏感的。

2.业务隔离对象差异

GaussDB 200中可以使用Database和Schema实现业务的隔离,区别在于Database的隔离更加彻底,各个Database之间共享资源极少,可实现连接隔离、权限隔离等,Database之间无法直接互访。Schema隔离的方式共用资源较多,可以通过grant与revoke语法便捷地控制不同用户对各Schema及其下属对象的权限。 跨Schema访问语法:Schema.table
GBase 8a使用Database实现业务隔离,支持Database之间互相访问,跨库访问语法:数据库名.表名。

3.编码差异

        数据库编码查看
        GaussDB建议创建Database的时候使用UTF-8编码,可以通过查看字符集编码(ENCODING)和兼容性 (DBCOMPATIBILITY)两个配置项来确定。GaussDB 200支持Teradata和Oracle两种兼容模式,不同兼容模式下的语法行为可能有一些差异。
        GaussDB 200支持GBK、UTF-8和Latin1编码格式,设置字符集有两种方式:
        1)在安装数据库时指定初始化参数-E; 
        2)通过SQL语句创建数据库时指定ENCODING参数,如:CREATE DATABASE mydb WITH ENCODING 'GBK' 
        GaussDB数据库的默认存储编码集(server_encoding)可以通过“show server_encoding”命令查看。GaussDB不指定编码时,默认使用模版数据库的编码。模板数据库template0和template1的编码默认与操作系统环境相关。template1不允许修改字符编码,如果要变更编码,需要使用template0创建数据库。 
        GBase 8a默认是UTF8编码,不支持创建库的时候指定编码。可以执行下面的sql查看:

Show variables like ‘%character%’;

迁移时先检查确认GaussDB数据库编码和GBase 8a的编码。从GaussDB中导出数据时请指定GBase 8a的数据库编码。
        迁移数据时导出文件编码的指定
GaussDB导出数据一般使用外表导出,支持导出过程中转换编码。如果GaussDB与GBase 8a字符集不一致,在创建外表时请指定ENCODING为GBase 8a的编码。GBase 8a的加载不支持转换编码,所以加载的数据文件需要预先统一编码跟GBase 8a一致才能正确加载。
 

CREATE FOREIGN TABLE product_info_ext
(
... 
) 
SERVER gsmpp_server 
OPTIONS(
LOCATION 'gsfs://192.168.0.90:5000/*',
FORMAT 'CSV' ,
DELIMITER ',',
ENCODING 'utf8',
HEADER 'false',
FILL_MISSING_FIELDS 'true',
IGNORE_EXTRA_DATA 'true'
)
READ ONLY
LOG INTO product_info_err 
PER NODE REJECT LIMIT 'unlimited';

encoding 参数说明:
指定数据文件的编码格式名称,即需要以何编码格式对数据文件进行解析和 校验/输出文件为何种编码格式。缺省值为当前数据库的默认客户端编码格式,即client_encoding。 

4.开发注意事项

        GBase 8a不支持级联,迁移时sql带级联相关的部分删除。
        GBase 8a 不支持事务,迁移时事务的语句需要删除,包括JDBC等接口应用也需要检查是否有打开事务的sql,如果有需要删除。
        在JDBC向GaussDB 200申请连接的代码中,需要显式打开autocommit开关。 GBase 8a默认是autocommit模式,不能设置为非autocommit。
        GBase 8a 不支持WITH TABLE AS
        GaussDB中超过3张表或视图进行关联(特别是full join)时,建议使用WITH TABLE AS语句创建中间临时表的方式增加SQL语句的可读性。 迁移时需要删除,可以在GBase 8a中单独建立临时表替换。
        GaussDB中在where子句里,过滤条件有序可以提升性能,把选择读较小(筛选出的记录数较少)的条件排在前面。 GBase 8a中不需要,sql执行时会自动优化。
        在GBase 8a和GaussDB中OR的场景都很难优化,都是建议如果在过滤条件只有OR表达式的情况下,可以将OR表达式转化为UNION ALL以提升性能。如: 

SELECT * FROM scdc.pub_menu 
WHERE (cdp= 300 AND inline=301) OR (cdp= 301 AND inline=302) OR (cdp= 302 ANDinline=301);

转换为: 

SELECT * FROM scdc.pub_menu 
WHERE (cdp= 300 AND inline=301) 
union all 
SELECT * FROM scdc.pub_menu 
WHERE (cdp= 301 AND inline=302) 
union all 
SELECT * FROM tablename 
WHERE (cdp= 302 AND inline=301)

        应用连接注意事项
应用如果迁移到GBase 8a后有格式显示发生变化,可以查看GaussDB中下面的设置项,根据这些设置项调整GBase 8a的应用接口。
        第三方工具通过JDBC连接GaussDB 200时,JDBC向GaussDB 200发起连接请求,会默认添加以下配置参数: 

params = { 
{ "user", user }, 
{ "database", database }, 
{ "client_encoding", "UTF8" }, 
{ "DateStyle", "ISO" }, 
{ "extra_float_digits", "2" }, 
{ "TimeZone", createPostgresTimeZone() }, 
};


        这些参数可能会导致JDBC客户端的行为与gsql客户端的行为不一致,例如,Date 数据显示方式、浮点数精度表示、timezone显示。 如果实际期望和这些配置不符,建议在java连接设置代码中显式设定这些参数。 

5.索引差异

        GBase 8a有智能索引,该索引自动在所有列上建立,不用人工维护。除了智能索引外支持人工建立和维护的只有hash索引。
        GaussDB中一般都人工创建了Partial Cluster Key(局部聚簇,简称PCK),PCK是列存表的一种局部聚簇技术,在原理上类似GBase 8a的智能索引,但是一张表上只能建立一个PCK,一个PCK可以包含多列,GaussDB一般不建议超过2列。
        GaussDB支持的索引类型较多,迁移时为了性能,索引建议全部删除。迁移至GBase 8a中后再根据需要创建hash索引。

6.NULL的应用差异

        GaussDB和GBase 8a的NULL值的比较都是只能使用IS NULL或者IS NOT NULL的方式判断,其他任何形式的逻辑判断都返回NULL。例如:NULL<>NULL、NULL=NULL和NULL<>1返回结果都是NULL,而不是期望的布尔值。 
相同的行为:
1)需要统计表中所有记录数时,不要使用count(col)来替代count(*)。count(*)会统计NULL值(真实行数),而count(col)不会统计。 
2)执行sum(col)时,当所有记录都为NULL时,最终将返回NULL;当不全为NULL时,“值为NULL”的记录行将被计数为0。
3)count(distinct col)用来计算该列不重复的非NULL的数量,NULL将不被计数。 
4)排序默认都是按照ASC & NULL LAST进行排序。使用ORDER BY子句进行排序时,可以显式指定排序方式(ASC/DESC),NULL的排序方式(NULL FIRST/NULL LAST)。 
不同的行为:
1)GaussDB中count(多个字段)时,多个字段名必须用圆括号括起来。例如,count( (col1,col2,col3) )。注意:通过多字段统计行数时,即使所选字段都为NULL,该行也被计数,效果与count(*)一致。同时也支持count(distinct (col1,col2,...))用来统计多列的唯一值数量。
      GBase 8a 不支持count(多个字段)和count(distinct (col1,col2,...))语法。
注:GaussDB 200支持Teradata和Oracle两种兼容模式,分别兼容Teradata语法和Oracle语法,不同兼容模式下的语法行为可能有一些差异,在ORACLE兼容模式下,在导入数据时,空字符串会自动转化为NULL。如果需要保留空字符串需要新建兼容性为TD的数据库。


原文链接:https://www.gbase.cn/community/post/3869

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


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容