详解TDSQL PG版Oracle兼容性实践
V1.0版本
创新达人
2024-04-17
1.摘要
TDSQL PG版分布式关系型数据库,是一款同时面向在线事务交易和MPP实时数据分析的高性能HTAP数据库系统。面对应用业务产生的不定性数据爆炸需求,不管是高并发交易还是海量实时数据分析,TDSQL PG版都能够轻松处理。目前TDSQL PG版已经在金融、保险、通信、税务、政务等多个行业的核心交易系统上线运行。
2.TDSQL PG版介绍
自2008年诞生,TDSQL PG版已有13年的发展历史,产品全面兼容PostgreSQL,高度兼容Oracle语法,采用无共享架构,在提供大型数据仓库处理能力的同时还能完整支持分布式事务。
此外,TDSQL PG版的三权(安全、审计、管理)分立安全体系也充分满足企业对数据安全的需求。
2.1.TDSQL PG版具有六个方面的产品特性
2.1.1.访问接口丰富
支持C/C++、jdbc/odbc、python等各种常用语言接口。
关系型数据库系统有哪些2.1.2.扩展性良好
支持用户自定义存储过程、函数操作符。
2.1.3.MLS安全保护能力
使用三权分立安全体系,支持数据透明脱敏加密。
2.1.4.高效HTAP能力
支持千万级TPS事务处理,全并行分布计算框架可高效完成OLAP计算。
2.1.5.强大数据治理能力
支持高效在线扩缩容、用户无感知数据rebalance和冷热数据分级存储,节省用户成本。
2.1.6.数据库特性丰富。
支持各种窗口分析函数,高度兼容Oracle常用函数和语法。
TDSQ PG版的应用场景满足以下业务特征,即:数据量上OLTP场景超过1T或OLAP场景超过5T;并发连接数超过2000,峰值业务100w/s;需要在线水平扩展能力,需要兼顾OLTP以及OLAP的HTAP场景,还需要严格的分布式事务保证。在满足这些业务特征的情况下,TDSQL PG版将会是合适的选择。此外,TDSQL PG版也适用于地理信息系统、实时高并发系统以及数据库国产化等场景。
3.语法差异对比
3.1.数据类型
Oracle中的许多数据类型都可以与TDSQL PG版相互对应。比如Oracle中的number数据类型,
对应到TDSQL PG版里,可以用smallint、integer、bigint、numeric(p,s)等多种数据类型进行类比替换。但受底层存储的影响,smallint、integer、bigint的算术运算效率比numberic高,因此要视业务需要转换成对应的smallint、integer、bigint,如若无法转换时才转换成numeric(p,s)。又例如Oracle中的float对应TDSQL PG版中的double precision,Oracle中的binary_float对应TDSQL-PG中的real,Oracle中的binary_double 对应TDSQL PG版中的double precision等,这些都是两者可对应的数据类型。
此外Oracle中也有部分特有的数据库类型如rowid,PostgreSQL中并没有,但TDSQL PG版对此做了兼容,添加了这种数据类型。又如urowid ID在Oracle中是可变长的字符存储,TDSQL PG版中则可以用varchar进行替换。
long、clob、blob等都是PostgreSQL中没有的数据类型。针对这些类型,TDSQL PG版做了大量兼容。如果用户需要在应用层用JDBC进行连接,JDBC驱动也需要同步进行兼容改造。Oracle中的date类型也和PostgreSQL不同,Oracle中可以精确到时分秒,而在PostgreSQL中只有年月日。为了兼容这一数据类型,TDSQL PG版在Oracle兼容开关打开的情况下底层用户定义时写Date类型,但下方会转成Timestamp(0),可以直接精确到秒级。(Oracle兼容开关打开就是Oracle模式,不打开就是PG模式)。
3.2.存储过程语法差异
Oracle创建存储过程的语法与PostgreSQL有很大差异。比如用户在Oracle中创建存储过程,如果不需要输入参数、输出参数,则无需括号,但在PostgreSQL中则必须写括号,TDSQL PG版对此进行兼容,业务人员可根据需求选择写或不写。在函数中,Oracle是从is开始,PostgreSQL是从as开始,TDSQL PG版两者都支持。PostgreSQL中,函数存储过程body使用$$进行封装,Oracle则不需要,TDSQL PG版两者都支持。Oracle支持“end存储过程名称”结束,PostgreSQL则不支持,对此TDSQL PG版做了兼容。存储过程中,Oracle使用“/”来结尾,表示该函数存储过程创建完成,但在PostgreSQL中则采用language plpgsql,对此TDSQL PG版也做了兼容,用户可以用“/”进行结尾。
在变量声明过程中,PostgreSQL需要指定Declare声明一个变量,但Oracle不需要,TDSQL PG版则完全兼容。存储过程中的输入、输出参数,Oracle支持IN、OUT和INOUT三种类型,但PostgreSQL不支持OUT,TDSQL PG版对此做了兼容,完整支持IN、OUT和INOUT三种类型。在调用方面,Oracle存储过程的调用支持三种形式:call后加存储过程名称、exec后加存储过程名称、直接调用存储过程名称,而PostgreSQL中只能使用call进行调用,TDSQL PG版对此进行兼容改造,支持三种形式。