Greenplum6 版本介绍

一、新特性

PostgreSQL内核新特性

Greenplum 6结合了许多从PostgreSQL8.4到9.4的新特性

区间数据类型处理

PostgreSQL 8.4依照SQL标准,增强了解析INTERVAL文本。这个改变了对于INTERVAL标记的查询在 5.x和6.x里的输出。

$ psql
psql (8.3.23)
Type "help" for help.

gpadmin=# select INTERVAL '1' YEAR;
 interval
----------
 00:00:00
(1 row)
```
``` sql
$ psql
psql (9.2beta2)
Type "help" for help.

gpadmin=# select INTERVAL '1' YEAR;
 interval
----------
 1 year
(1 row)

新增的PostgresSQL特性

Greenplum 6.0包含了如下来自PostgreSQL的特性

  1. 支持unnest() 数组函数,可以将数组转换成行的集合(PostgreSQL 8.4引入)
  2. 支持用户自定义的I/O conversion casts. (PostgreSQL 8.4引入)
  3. 支持列级别的权限(PostgreSQL 8.4引入)
  4. 增加了pg_db_role_setting系统表,为特定数据库和角色组合的配置提供了支持(PostgreSQL 9.0引入)
  5. pg_class系统表里的relkind列的值已改成与PostgreSQL 9.3的条目相同
  6. 支持GIN索引方法(PostgreSQL 8.3引入)
  7. 支持jsonb数据类型(PostgreSQL 9.4引入)
  8. DELETE,INSERT和UPDATE语句支持WITH子句,即CTE (common table expression) (PostgreSQL 9.1引入)。对于WITH子句,RECURSIVE关键字还处于试验阶段
  9. 列(column)级别支持指定排序规则和字符集的Collation(PostgreSQL 9.1引入)

Zstandard压缩算法

Greenplum 6.0增加了数据库某些操作和AO表存储的zstd (Zstandard)压缩。

放宽指定分布列的规则

在之前的版本,如果在建表的时候同时指定了分布列和唯一索引,则分布列必须和唯一索引列相同,或者是唯一索引列集的左前缀。Greenplum 6.x里取消了该限制,分布列可以是索引列的任何子集。

这个改变同时影响了Greenplum 6.x选择默认分布键的规则。如果gp_create_table_random_default_distribution是关闭的(默认值),并且建表时未指定DISTRIBUTED BY子句,Greenplum会根据如下规则选择分布键:

  1. 如果使用了LIKE或INHERITS,则依照源表或父表的分布列
  2. 如果指定了主键或唯一(UNIQUE)索引约束,选择键集合的最大子集作为分布列
  3. 如果既未指定约束,也未使用LIKE或INHERITS,则选择第一个合适的列作为分布键(几何数据列和用户自定义数据列不能作为分布键)

复制表

CREATE TABLE支持DISTRIBUTED REPLICATED分布策略。在该分布策略下,Greenplum会将表的所有数据分发到所有节点上。

PL/pgSQL过程语言增强

PL/pgSQL在Greenplum 6.0里包括了如下新特性:

  1. 为用户抛出的错误附加DETAIL和HINT文本。你还可以在用户返回的错误里指定SQLSTATE和SQLERRMSG(PostgreSQL 8.4引入)
  2. RETURN QUERY EXECUTE语句,可以让一个查询动态执行(PostgreSQL 8.4引入)
  3. 通过CASE语句来设置条件执行(PostgreSQL 8.4引入)

全局死锁检测

之前的Greenplum通过对表加写锁来避免执行UPDATE和DELETE时出现全局死锁。这个方法虽然避免了全局死锁,但是并发更新的性能很差。Greenplum 6里引入了全局死锁检测。该检测进程收集并分析集群中的锁等待信息,如果发现了死锁则杀死造成死锁的进程并报错。

全局死锁检测仅仅放开了Heap表的并发限制。

该特性默认是关闭的, 可以通过设置GUC gp_enable_global_deadlock_detector打开。

其他新增特性

  1. 修改AO表的appendonly选项为appendoptimized
  2. 新增gp_resgroup_status_per_host和gp_resgroup_status_per_segment的gp_toolkit 视图来展示resource group中CPU和memory在每个节点或每个segment上的使用情况

二、改进的特性

  1. PL/Java和PL/R过程语言包在第一版的Beta发布里不支持
  2. gpaddmirrors工具不包含在第一版的Beta发布
  3. gpbakcup和gprestore不再集成在Greenplum 6内部,而是成为一个独立发布更新的工具
  4. Greenplum 6里使用了一种叫Jump Hash的算法来计算数据的哈希分布。这个算法可以做到在增加新节点重新分布数据时,只需移动哈希到新节点的数据。哈希性能上与之前发布的版本相差不多,但是能做到快速扩容。因为新哈希算法更消耗CPU,所以COPY工具在CPU资源紧张的机器上运行性能会下降
  5. 旧的哈希方法已经不是默认的哈希方法,只有在从Greenplum 6.0之前的老版本升级的时候才会使用。如果全部使用旧的或者新的哈希算法的表分布规则是相同的,如果混合使用了新旧两种哈希算法的表,做查询时就会需要做Redistribute Motions。系统参数gp_use_legacy_hashops可以控制建立列分布表时使用传统的哈希算法还是新的哈希算法。系统表gp_distribution_policy包含了Greenplum表和跨节点分布策略的更多信息,增加了表示分布哈希函数中操作符类的列
  6. 对于使用IS NULL的语句,可以像通过分布列过滤到指定节点的语句一样,做直接分发
  7. 在系统表pg_proc中, proiswin列被重新命名成proiswindow并调整了在表中的位置以做到与PostgreSQL8.4一致
  8. 对于使用了SELECT DISTINCT和UNION/INTERSECT/EXCEPT的语句,不再保证结果是排序后的。之前这些语句通过排序来移除重复的数据。如今参考了PostgreSQL8.4的特性,通过哈希来实现。这种方法保证不了结果是排序过的。如果在使用这类语句时想要得到排序后的结果,请使用显式的ORDER BY。值得注意的是SELECT DISTINCT ON没有使用哈希,和过去的行为一样。
  9. 系统表pg_database中的datconfig列被移除,转而使用系统表pg_db_role_setting来记录每个数据库和每个角色的配置(PostgreSQL9.0引入)
  10. 系统表pg_authid中的rolconfig列被移除,转而使用系统表pg_db_role_setting来记录每个数据库和每个角色的配置(PostgreSQL9.0引入)
  11. 在创建或修改含有分布列的表时,可以指定哈希分布算法
  12. 删除了ALTER OPERATOR FAMILY和CREATE OPERATOR CLASS DDL (PostgreSQL 8.4引入)的RECHECK选项。目前在运行阶段自动判断一个索引操作符是否有损,需要时自动再次检查数据是否满足条件.
  13. Operator相关的系统表被修改,以便支持操作符的不同类别,相容性和类型
  14. Greenplum 6.0的事务隔离级别,在合并PostgreSQL9.1引入可串行化的快照隔离级别(SSI)后,与PostgreSQL保持了一致。这个新隔离级别SSI,通过监控正在运行的事务和回滚可能产生串行化异常的事务,来提供真正的可串行化。现有的快照隔离级别(SI)只能保证事务运行在一个单独一致的快照上,不保证按不同顺序并发执行多个事务时结果的一致性。Greenplum 6.0可以在类似BEGIN和SET TRANSACTION的语句里增加REPEATABLE READ关键字。一个可串行化的事务在PostgreSQL 9.1或更新的版本里使用新的SSI模式。在Greenplum 6.0里一个可串行化隔离级别的事务将退化成可重复读隔离级别,使用SI模式。下表显示了SQL标准的隔离级别在Greenplum 6.0和PostgreSQL9.1里的兼容性。

15. CREATE TABLESPACE语句发生了改变

  • 该语句不再需要一个使用gpfilespace创建好的表空间
  • FILESPACE子句被删除
  • 增加了WITH子句,可以为一个特定的节点指定表空间位置

16. ALTER SEQUENCE语句增加了子句START [WITH] {start}和OWNER TO {new_owner}(PostgreSQL 8.4引入)。START子句可以设置用在ALTER SEQUENCE RESTART命令里的开始值,但是不会改变当前序列的值。OWNER TO子句可以改变序列的owner

17. ALTER TABLE语句增加了SET WITH OIDS子句可以为表增加一个oid系统列(PostgreSQL 8.4引入),但是这种方法不推荐使用

18. CREATE DATABASE语句增加了新参数LC_COLLATE和LC_CTYPE,用来指定新数据库的collate和字符集的排序

19. CREATE FUNCTION语句增加了新关键词WINDOW,用来表明该函数是窗口,而不是普通的函数(PostgreSQL 8.4引入)

20. CREATE INDEX语句中的index名字变为可选。Greenplum 会根据表名和索引列生成默认的索引名称

21. Create protocol需要超级用户权限,详情请看 CREATE PROTOCOL说明.

22. CREATE TYPE语句增加了子句LIKE=type,可以从一个已经存在的类型中复制新类型的描述,包括INTERNALLENGTH, PASSEDBYVALUE, ALIGNMENT和STORAGE(PostgreSQL 8.4引入)

23. GRANT语句增加了新语法,可以授权truncate,外部数据包装和服务(FDW)(PostgreSQL 8.4引入)

24. LOCK语句增加了ONLY关键字,可以只锁该表而不锁继承该表的子表

25. 在事务外部使用LOCK表语句时会报错,在之前的版本中,该语句可以在事务外部成功执行,虽然只有在事务内部运行时才会真正有效

26. SELECT和VALUES语句支持SQL 2008标准的OFFSET和FETCH语法(PostgreSQL 8.4引入)。这个语法提供了一种新的可以限制结果集的方法

27. SELECT语句中可以没有FROM子句,但是Greenplum不允许没有FROM子句的SELECT语句引用数据库表。

28. TRUNCATE语句增加了ONLY关键字(PostgreSQL 8.4引入),可以只truncate该表而不影响继承于它的子表

29. createdb工具增加了新的参数,-l (–locale), –lc-collate和–lc-ctype,可以为数据库指定locale和字符集(PostgreSQL 8.4引入)

30. pg_dump, pg_dumpall和pg_restore工具增加了新的参数–role,可以在连接数据库后设置ROLE,再执行dump或restore操作(PostgreSQL 8.4引入)

31. pg_dump和pg_dumpall工具增加了新参数–lock-wait-timeout(PostgreSQL 8.4引入)。可以设置拿不到读锁的等待时间,超时后失败,而不是一直等下去。单位是毫秒

32. pg_dump和pg_dumpall删除了-d和-D参数,相对应的长参数–inserts和–column-inserts仍然保留。增加了新参数–binary-upgrade,该参数被原地升级工具使用

33. pg_dump, pg_dumpall和pg_restore增加了-w参数,免输入密码

34. gpexpand删除了-D参数,扩容相关的表将被创建到postgres数据库里,不需要单独指定

35. gpstate增加了新参数-x,可以展示扩容过程的详细状态。在扩容中,-s或不加任何参数也会提示扩容在进行,但不会显示详细信息

36. pg_restore增加了新参数-j (–number-of-jobs),这个参数通过设置并行作业的数量来减少恢复大数据库的时间

37. vacuumdb工具新增-F (–freeze) 选项来冻结数据行的事务信息.

38. ALTER DATABASE增加了SET TABLESPACE子句,来设置默认的表空间

39. CREATE DATABASE增加了COLLATE和CTYPE选项来设置数据库的collation排序和字符集

40. 系统参数gp_workfile_compress_algorithm改名为gp_workfile_compression.当被启用时,使用Zstandard压缩算法

41. Oracle Compatibility Functions已作为一个基于PostgreSQL orafce项目(https://github.com/orafce/orafce)的扩展,可以在Greenplum里使用。用户可以通过CREATE EXTENSION orafce而不是运行脚本来创建。该扩展基于orafce3.7。

42. 支持citext数据类型的列作为分布键

43. 提供了一个统一的安装包,可以下载和安装客户端和加载工具。之前它们是分别提供的不同包

三、淘汰的特性

已被淘汰的功能

  1. 不再使用gptransfer,改用gpcopy
  2. gp_fault_strategy系统表不再使用,使用gp_segment_configuration来判断mirror是否开启
  3. 不再使用gpcrondump, gpdbrestore, and gpmfr管理工具,改用gpbackup和gprestore来备份和恢复数据库
  4. 不再支持Veritas NetBackup
  5. Greenplum 6的备份不再支持忽略文件系统缓存的直接I/O文件访问
  6. 不再支持gphdfs访问Hadoop系统的外部表协议,改为使用Greenplum Platform Extension Framework (PXF)访问Hadoop系统。
  7. 删除了如下配置参数
    • gp_analyze_relative_error
    • gp_backup_directIO
    • gp_backup_directIO_read_chunk_mb
    • gp_connections_per_thread
    • gp_enable_sequential_window_plans
    • gp_idf_deduplicate
    • gp_snmp_community
    • gp_snmp_monitor_address
    • gp_snmp_use_inform_or_trap
    • gp_workfile_checksumming
  8. 不再支持在特定事件发生时触发SNMP警报、或向系统管理员发邮件的触发机制
  9. 删除了gpfilespace工具,CREATE TABLESPACE过程不再需要该工具事先创建的表空间
  10. Greenplum-Kafka组件不再支持Kafka Avro数据格式的LZMA/XZ压缩,继续支持libz和snappy压缩

四、不推荐使用的功能

  1. 配置参数gp_ignore_error_table会在下次大版本发布删除,不推荐继续使用。可以将该值设置成True来避免运行带有执行CREATE EXTERNAL TABLE或COPY命令并且包含Greenplum 4.3.x中的INTO ERROR TABLE子句的应用时报错。当这个参数被移除后,Greenplum在执行包含INTO ERROR TABLE子句的CREATE EXTERNAL TABLE或COPY命令时将会返回错误。
  2. 不推荐使用在CREATE OPERATOR中把 => 当成一个操作符名称
  3. Greenplum外部表C API不赞成使用。推荐使用新的Foreign Data Wrapper API

关注微信公众号

VMware 中国研发中心