Greenplum 特点概要

该部分提供了Greenplum数据库的系统要求和功能集合的高级概述。它包含以下主题:

Parent topic: Greenplum数据库参考指南

Greenplum SQL标准一致性

SQL语言于1986年被美国国家标准学会(ANSI)第一次作为SQL正式标准化。 SQL标准的后续版本已由ANSI和国际标准化组织(ISO)标准发布:SQL 1989,SQL 1992,SQL 1999,SQL 2003,SQL 2006,和最后的 SQL 2008,它就是当前的SQL标准。 该标准的正式名称为 ISO/IEC 9075-14:2008。 一般来说,每个更新的版本都增加了更多的内容,虽然偶尔也有一些内容被启用或者删除。

重要的是要注意,没有完全遵从SQL标准的商业数据库系统。 Greenplum数据库几乎完全符合SQL 1992的标准,多数功能来源于SQL 1999。 几个来源于SQL 2003的功能也被实现了(最著名的是 SQL OLAP 功能)。

该部分针对Greenplum数据库和SQL标准相关的重要一致性的问题。 有关对最新的SQL标准的支持功能列表,请参阅SQL 2008可选特性兼容性

核心SQL一致性

在构建并行,无共享架构的数据库系统和查询优化器的过程中,某些常见的SQL结构尚未在Greenplum数据库中实现。 不支持以下的SQL结构:

  1. 有些设置在EXISTS或NOT EXISTS子句中返回子查询,Greenplum的并行优化器不能将之重写为到连接之中。
  2. 向后回滚游标,包括FETCH PRIOR,FETCH FIRST,FETCH ABSOLUTE,和FETCH RELATIVE操作的使用。
  3. 在CREATE TABLE语句上(哈希分布表):UNIQUE或PRIMARY KEY子句必须包括分布键列的所有值,或者是其超集。 因为这个限制,在CREATE TABLE的语句中,仅允许一个UNIQUE子句或者PRIMARY KEY子句。 UNIQUE或PRIMARY KEY子句不允许出现在随机分布的表中。
  4. CREATE UNIQUE INDEX语句不包含分布键的列的所有值或者为其超集。 CREATE UNIQUE INDEX不允许使用在随机分布的表上。

    注意UNIQUE INDEXES(但是不是UNIQUE CONSTRAINTS)在分布表的单个部分上执行,它们保证每个部分或者子部分内的键值的唯一性。

  5. VOLATILE或STABLE函数不能在segment上执行,因此通常仅限于传递文字值作为其参数的参数。

  6. 触发器是不支持的,因为他么通常依赖于VOLATILE函数的使用。
  7. 引用完整性约束(外键)不会再Greenplum数据库中实施。 用户可以声明外键,但是这些信息保存在系统catalog中。
  8. 序列操纵函数CURRVAL和LASTVAL。

SQL 1992 一致性

以下 SQL 1992 的特性在Greenplum数据库中不支持:

  1. NATIONAL CHARACTER(NCHAR)和NATIONAL CHARACTER VARYING (NVARCHAR)。 用户可以声明NCHAR和NVARCHAR类型,但是它们只是Greenplum数据库中CHAR和VARCHAR的同义词。
  2. CREATE ASSERTION语句。
  3. INTERVAL文字在Greenplum数据库中是支持的,但是不符合标准。
  4. GET DIAGNOSTICS语句。
  5. GLOBAL TEMPORARY TABLE和LOCAL TEMPORARY TABLE。 Greenplum TEMPORARY TABLE不符合SQL标准,但许多商业数据库系统以相同的方式实现了临时表。 Greenplum临时表与Teradata中的VOLATILE TABLE相同。
  6. UNIQUE断言。
  7. 引用完整性检查的MATCH PARTIAL(很可能不会在Greenplum数据库中实现)。

SQL 1999 一致性

以下SQL 1999的功能在Greenplum数据库中不支持:

  1. Large Object数据类型:BLOB, CLOB, NCLOB。 但是,Grennplum数据库中该BYTEA和TEXT列可以存储大量的数据(数百兆字节)。
  2. MODULE(SQL 客户端模块)。
  3. CREATE PROCEDURE (SQL/PSM)。 这可通过创建返回值为void的FUNCTION在Greenplum数据库中进行操作,如下调用函数:

    1. SELECT myfunc(args);
  4. 该PostgreSQL/Greenplum函数定义语言(PL/PGSQL)是Oracle的PL/SQL的子集,而不是和SQL/PSM函数定义语言的兼容。 Greenplum数据库还支持使用Python,Perl,Java和R定义函数。

  5. BIT和BIT VARYING数据类型(故意忽略)。 这些在SQL 2003中被弃用,并且在SQL 2008中被替代。
  6. Greenplum支持63个字符长的标识符。 该SQL标准要求支持达到128个字符长的标识符。
  7. 准备好的事务(PREPARE TRANSACTION,COMMIT PREPARED,ROLLBACK PREPARED)。 这也意味着Greenplum不支持XA事务(数据库事务和外部事务2个阶段的提交的协调)。
  8. CHAR()或VARCHAR()列定义的CHARACTER SET选项。
  9. 指明CHARACTERS或OCTETS(BYTES)关于CHAR()或VARCHAR()列的长度。 例如,VARCHAR(15 CHARACTERS)或VARCHAR(15 OCTETS)或VARCHAR(15 BYTES)。
  10. CURRENT_SCHEMA函数。
  11. CREATE DISTINCT TYPE语句。 CREATE DOMAIN可以用作Greenplum中的一种解决方案。
  12. explicit table构造。

SQL 2003 一致性

以下SQL 2003的功能在Greenplum数据库中不支持:

  1. MERGE语句。
  2. IDENTITY列和相关的GENERATED ALWAYS/GENERATED BY DEFAULT子句。 该SERIAL或BIGSERIAL数据类型与INT或BIGINT GENERATED BY DEFAULT AS IDENTITY非常相似。
  3. 数据类型的MULTISET修饰符。
  4. ROW数据类型。
  5. Greenplum使用序列的语法是非标准的。 例如,在Greenplum中使用nextval(‘seq’)来替代标准的NEXT VALUE FOR seq。
  6. GENERATED ALWAYS AS列。 视图可以用作解决方法。
  7. SELECT语句上的示例子句(TABLESAMPLE)。 该random()函数可以用解决从表中获取随机样本的方法。
  8. partitioned join tables结构(连接中的PARTITION BY)。
  9. 对CREATE TABLE x (LIKE(y))语句,Greenplum不支持[INCLUDING|EXCLUDING][DEFAULTS|CONSTRAINTS|INDEXES]语句。
  10. Greenplum数组数据类型几乎符合SQL标准,但是有一些例外。 通常,用户不应该遇到使用它们的问题。

SQL 2008 一致性

以下SQL 2008的特性在Greenplum数据库中不支持:

  1. BINARY和VARBINARY数据类型。 在Greenplum数据库中,BYTEA可以用来替代VARBINARY。
  2. FETCH FIRST或FETCH NEXT子句对SELECT,例如:

    1. SELECT id, name FROM tab1 ORDER BY id OFFSET 20 ROWS FETCH
    2. NEXT 10 ROWS ONLY;

    Greenplum有LIMIT和LIMIT OFFSET子句可以用来替代。

  3. 除非还使用LIMIT子句,否则在视图和子查询中将忽略ORDER BY子句。 这是有意的,因为Greenplum优化器无法确定何时避免排序是安全的,从而对此类ORDER BY子句造成意外的性能影响。 要解决这个问题,用户可以指定一个非常大的LIMIT。 例如:SELECT * FROM mytable ORDER BY 1 LIMIT 9999999999

  4. row subquery结构是不支持的。
  5. TRUNCATE TABLE不接受CONTINUE IDENTITY和RESTART IDENTITY子句。

Greenplum和PostgreSQL兼容性

Greenplum数据库基于PostgreSQL 9.4。 为了支持Greenplum数据库系统的分布式特性和典型工作负载,添加或修改了一些SQL命令,并且有一些不受支持的PostgreSQL功能。 Greenplum还添加了PostgreSQL中没有的功能,例如物理数据分发,并行查询优化,外部表,资源队列和增强的表分区。 有关完整的SQL语法和参考,请参阅SQL Command Reference

Note: Greenplum数据库不支持PostgreSQL大对象工具,用于流式传输存储在大型对象结构中的用户数据。

Table 1. Greenplum数据库中的SQL支持
SQL命令Greenplum是否支持修改,限制,例外
ALTER AGGREGATEYES 
ALTER CONVERSIONYES 
ALTER DATABASEYES 
ALTER DOMAINYES 
ALTER EXTENSIONYES更改Greenplum数据库扩展的定义 - 基于PostgreSQL 9.6。
ALTER FUNCTIONYES 
ALTER GROUPYESALTER ROLE的别名
ALTER INDEXYES 
ALTER LANGUAGEYES 
ALTER OPERATORYES 
ALTER OPERATOR CLASSYES 
ALTER OPERATOR FAMILYYES 
ALTER PROTOCOLYES 
ALTER RESOURCE QUEUEYESGreenplum数据库资源管理特性 - 不在PostgreSQL中。
ALTER ROLEYESGreenplum数据库子句:

RESOURCE QUEUE queue_name | none

ALTER SCHEMAYES 
ALTER SEQUENCEYES 
ALTER SYSTEMNO 
ALTER TABLEYES不支持的子句/选项:

CLUSTER ON

ENABLE/DISABLE TRIGGER

Greenplum数据库子句:

ADD | DROP | RENAME | SPLIT | EXCHANGE PARTITION | SET SUBPARTITION TEMPLATE | SET WITH (REORGANIZE=true | false) | SET DISTRIBUTED BY

ALTER TABLESPACEYES 
ALTER TRIGGERNO 
ALTER TYPEYESGreenplum数据库子句:

SET DEFAULT ENCODING

ALTER USERYESALTER ROLE的别名
ALTER VIEWYES 
ANALYZEYES 
BEGINYES 
CHECKPOINTYES 
CLOSEYES 
CLUSTERYES 
COMMENTYES 
COMMITYES 
COMMIT PREPAREDNO 
COPYYES修改的子句:

ESCAPE [ AS ] ‘escape‘ | ‘OFF’

Greenplum数据库子句:

[LOG ERRORS] SEGMENT REJECT LIMIT count [ROWS|PERCENT]

CREATE AGGREGATEYES不支持的子句/选项:

[ , SORTOP = sort_operator ]

Greenplum数据库子句:

[ , COMBINEFUNC = combinefunc ]

限制:

The functions used to implement the aggregate must be IMMUTABLE functions.

CREATE CASTYES 
CREATE CONSTRAINT TRIGGERNO 
CREATE CONVERSIONYES 
CREATE DATABASEYES 
CREATE DOMAINYES 
CREATE EXTENSIONYES将新扩展加载到Greenplum数据库 - 基于PostgreSQL 9.6。
CREATE EXTERNAL TABLEYESGreenplum数据库并行ETL特性 - 不在PostgreSQL 9.4中。
CREATE FUNCTIONYES限制:

定义为STABLEVOLATILE的函数可以在Greenplum数据库中执行,只要它们仅在master上执行即可。 STABLEVOLATILE函数不能在segment级别执行的语句中使用。

CREATE GROUPYESCREATE ROLE的别名
CREATE INDEXYESGreenplum数据库子句:

USING bitmap (bitmap indexes)

限制:

仅当UNIQUE索引包含Greenplum分发键列的所有(或超集)时,才允许使用。 在分区表上,仅在单个分区内支持唯一索引 - 而不是跨所有分区。

Greenplum不支持CONCURRENTLY关键字。

CREATE LANGUAGEYES 
CREATE MATERIALIZED VIEWNOGreenplum数据库不支持物化视图(PostgreSQL扩展)。
CREATE OPERATORYES限制:

用于实现运算符的函数必须是IMMUTABLE函数。

CREATE OPERATOR CLASSYES 
CREATE OPERATOR FAMILYYES 
CREATE PROTOCOLYES 
CREATE RESOURCE QUEUEYESGreenplum数据库资源管理功能 - 不在PostgreSQL 9.4中。
CREATE ROLEYESGreenplum数据库子句:

RESOURCE QUEUE queue_name | none

CREATE RULEYES 
CREATE SCHEMAYES 
CREATE SEQUENCEYES限制:

不支持lastval()currval()函数。

setval()函数仅在不对分布式数据进行操作的查询中允许。

CREATE TABLEYES不支持的子句/选项:

[GLOBAL | LOCAL]

REFERENCES

FOREIGN KEY

[DEFERRABLE | NOT DEFERRABLE]

限制子句:

UNIQUEPRIMARY KEY约束仅允许在哈希分布式表(DISTRIBUTED BY)上使用, 并且约束列必须与表的分发键列相同或超集,并且必须包括分区键的所有分发键列。

Greenplum数据库子句:

DISTRIBUTED BY (column, [ … ] ) |

DISTRIBUTED RANDOMLY

PARTITION BY type (column [, …])    ( partition_specification, […] )

WITH (appendoptimized=true      [,compresslevel=value,blocksize=value] )

CREATE TABLE ASYES参考CREATE TABLE
CREATE TABLESPACEYESGreenplum数据库子句:

为特定的segment实例指定主机文件系统位置。

WITH (contentID_1=’/path/to/dir1…)

CREATE TRIGGERNO 
CREATE TYPEYESGreenplum数据库子句:

COMPRESSTYPE | COMPRESSLEVEL | BLOCKSIZE

限制:

用于实现新基类型的函数必须是IMMUTABLE函数。

CREATE USERYESCREATE ROLE的别名
CREATE VIEWYES 
DEALLOCATEYES 
DECLAREYES不支持的子句/选项:

SCROLL

FOR UPDATE [ OF column [, …] ]

限制:

游标不能向后滚动。支持向前滚动。

PL/pgSQL不支持可更新游标。

DELETEYES 
DISCARDYES 
DOYESPostgreSQL 9.0特性
DROP AGGREGATEYES 
DROP CASTYES 
DROP CONVERSIONYES 
DROP DATABASEYES 
DROP DOMAINYES 
DROP EXTENSIONYES从Greenplum数据库中删除扩展 - 基于PostgreSQL 9.6。
DROP EXTERNAL TABLEYESGreenplum数据库并行ETL功能 - 不在PostgreSQL 9.4中。
DROP FUNCTIONYES 
DROP GROUPYESDROP ROLE的别名
DROP INDEXYES 
DROP LANGUAGEYES 
DROP OPERATORYES 
DROP OPERATOR CLASSYES 
DROP OPERATOR FAMILYYES 
DROP OWNEDNO 
DROP PROTOCOLYES 
DROP RESOURCE QUEUEYESGreenplum数据库资源管理功能 - 不在PostgreSQL 9.4中。
DROP ROLEYES 
DROP RULEYES 
DROP SCHEMAYES 
DROP SEQUENCEYES 
DROP TABLEYES 
DROP TABLESPACEYES 
DROP TRIGGERNO 
DROP TYPEYES 
DROP USERYESDROP ROLE的别名
DROP VIEWYES 
ENDYES 
EXECUTEYES 
EXPLAINYES 
FETCHYES不支持的子句/选项:

LAST

PRIOR

BACKWARD

BACKWARD ALL

限制:

无法以非顺序方式获取行;不支持向后扫描。

GRANTYES 
INSERTYES 
LATERAL Join TypeNO 
LISTENNO 
LOADYES 
LOCKYES 
MOVEYES参考FETCH
NOTIFYNO 
PREPAREYES 
PREPARE TRANSACTIONNO 
REASSIGN OWNEDYES 
REFRESH MATERIALIZED VIEWNOGreenplum数据库不支持物化视图(PostgreSQL扩展)。
REINDEXYES 
RELEASE SAVEPOINTYES 
RESETYES 
REVOKEYES 
ROLLBACKYES 
ROLLBACK PREPAREDNO 
ROLLBACK TO SAVEPOINTYES 
SAVEPOINTYES 
SELECTYES限制:

FROMWHERE子句中有限使用VOLATILESTABLE函数

不支持文本搜索(Tsearch2

FETCH FIRSTFETCH NEXT子句不受支持

Greenplum数据库子句(OLAP):

[GROUP BY grouping_element [, …]]

[WINDOW window_name AS (window_specification)]

[FILTER (WHERE condition)]应用于SELECT列表中的聚合函数

SELECT INTOYES参考SELECT
SETYES 
SET CONSTRAINTSNO在PostgreSQL中,这仅适用于外键约束,这些约束目前未在Greenplum数据库中实施。
SET ROLEYES 
SET SESSION AUTHORIZATIONYES从PostgreSQL 8.1开始不推荐 - 请参阅SET ROLE
SET TRANSACTIONYES限制:

DEFERRABLE子句无效。

SET TRANSACTION SNAPSHOT命令不支持。

SHOWYES 
START TRANSACTIONYES 
TRUNCATEYES 
UNLISTENNO 
UPDATEYES限制:

不允许SET为Greenplum分发键列。

VACUUMYES限制:

Greenplum数据库不推荐使用VACUUM FULL

VALUESYES