Greenplum 特点概要

Greenplum 特点概要

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

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

  5. VOLATILESTABLE函数不能在segment上执行,因此通常仅限于传递文字值作为其参数的参数。
  6. 触发器是不支持的,因为他么通常依赖于VOLATILE函数的使用。
  7. 引用完整性约束(外键)不会再Greenplum数据库中实施。 用户可以声明外键,但是这些信息保存在系统catalog中。
  8. 序列操纵函数CURRVALLASTVAL

SQL 1992 一致性

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

  1. NATIONAL CHARACTERNCHAR)和NATIONAL CHARACTER VARYING (NVARCHAR)。 用户可以声明NCHARNVARCHAR类型,但是它们只是Greenplum数据库中CHARVARCHAR的同义词。
  2. CREATE ASSERTION语句。
  3. INTERVAL文字在Greenplum数据库中是支持的,但是不符合标准。
  4. GET DIAGNOSTICS语句。
  5. GLOBAL TEMPORARY TABLELOCAL 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数据库中该BYTEATEXT列可以存储大量的数据(数百兆字节)。
  2. MODULE(SQL 客户端模块)。
  3. CREATE PROCEDURE (SQL/PSM)。 这可通过创建返回值为voidFUNCTION在Greenplum数据库中进行操作,如下调用函数:
    SELECT myfunc(args);
  4. 该PostgreSQL/Greenplum函数定义语言(PL/PGSQL)是Oracle的PL/SQL的子集,而不是和SQL/PSM函数定义语言的兼容。 Greenplum数据库还支持使用Python,Perl,Java和R定义函数。
  5. BITBIT VARYING数据类型(故意忽略)。 这些在SQL 2003中被弃用,并且在SQL 2008中被替代。
  6. Greenplum支持63个字符长的标识符。 该SQL标准要求支持达到128个字符长的标识符。
  7. 准备好的事务(PREPARE TRANSACTIONCOMMIT PREPAREDROLLBACK PREPARED)。 这也意味着Greenplum不支持XA事务(数据库事务和外部事务2个阶段的提交的协调)。
  8. CHAR()VARCHAR()列定义的CHARACTER SET选项。
  9. 指明CHARACTERSOCTETS(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子句。 该SERIALBIGSERIAL数据类型与INTBIGINT 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. BINARYVARBINARY数据类型。 在Greenplum数据库中,BYTEA可以用来替代VARBINARY
  2. FETCH FIRSTFETCH NEXT子句对SELECT,例如:
    SELECT id, name FROM tab1 ORDER BY id OFFSET 20 ROWS FETCH
    NEXT 10 ROWS ONLY; 

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

  3. 除非还使用LIMIT子句,否则在视图和子查询中将忽略ORDER BY子句。 这是有意的,因为Greenplum优化器无法确定何时避免排序是安全的,从而对此类ORDER BY子句造成意外的性能影响。 要解决这个问题,用户可以指定一个非常大的LIMIT。 例如:SELECT * FROM mytable ORDER BY 1 LIMIT 9999999999
  4. row subquery结构是不支持的。
  5. TRUNCATE TABLE不接受CONTINUE IDENTITYRESTART 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 AGGREGATE YES  
ALTER CONVERSION YES  
ALTER DATABASE YES  
ALTER DOMAIN YES  
ALTER EXTENSION YES 更改Greenplum数据库扩展的定义 - 基于PostgreSQL 9.6。
ALTER FUNCTION YES  
ALTER GROUP YES ALTER ROLE的别名
ALTER INDEX YES  
ALTER LANGUAGE YES  
ALTER OPERATOR YES  
ALTER OPERATOR CLASS YES  
ALTER OPERATOR FAMILY YES  
ALTER PROTOCOL YES  
ALTER RESOURCE QUEUE YES Greenplum数据库资源管理特性 - 不在PostgreSQL中。
ALTER ROLE YES Greenplum数据库子句:

RESOURCE QUEUE queue_name | none

ALTER SCHEMA YES  
ALTER SEQUENCE YES  
ALTER SYSTEM NO  
ALTER TABLE YES 不支持的子句/选项:

CLUSTER ON

ENABLE/DISABLE TRIGGER

Greenplum数据库子句:

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

ALTER TABLESPACE YES  
ALTER TRIGGER NO  
ALTER TYPE YES Greenplum数据库子句:

SET DEFAULT ENCODING

ALTER USER YES ALTER ROLE的别名
ALTER VIEW YES  
ANALYZE YES  
BEGIN YES  
CHECKPOINT YES  
CLOSE YES  
CLUSTER YES  
COMMENT YES  
COMMIT YES  
COMMIT PREPARED NO  
COPY YES 修改的子句:

ESCAPE [ AS ] 'escape' | 'OFF'

Greenplum数据库子句:

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

CREATE AGGREGATE YES 不支持的子句/选项:

[ , SORTOP = sort_operator ]

Greenplum数据库子句:

[ , COMBINEFUNC = combinefunc ]

限制:

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

CREATE CAST YES  
CREATE CONSTRAINT TRIGGER NO  
CREATE CONVERSION YES  
CREATE DATABASE YES  
CREATE DOMAIN YES  
CREATE EXTENSION YES 将新扩展加载到Greenplum数据库 - 基于PostgreSQL 9.6。
CREATE EXTERNAL TABLE YES Greenplum数据库并行ETL特性 - 不在PostgreSQL 9.4中。
CREATE FUNCTION YES 限制:

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

CREATE GROUP YES CREATE ROLE的别名
CREATE INDEX YES Greenplum数据库子句:

USING bitmap (bitmap indexes)

限制:

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

Greenplum不支持CONCURRENTLY关键字。

CREATE LANGUAGE YES  
CREATE MATERIALIZED VIEW NO Greenplum数据库不支持物化视图(PostgreSQL扩展)。
CREATE OPERATOR YES 限制:

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

CREATE OPERATOR CLASS YES  
CREATE OPERATOR FAMILY YES  
CREATE PROTOCOL YES  
CREATE RESOURCE QUEUE YES Greenplum数据库资源管理功能 - 不在PostgreSQL 9.4中。
CREATE ROLE YES Greenplum数据库子句:

RESOURCE QUEUE queue_name | none

CREATE RULE YES  
CREATE SCHEMA YES  
CREATE SEQUENCE YES 限制:

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

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

CREATE TABLE YES 不支持的子句/选项:

[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 AS YES 参考CREATE TABLE
CREATE TABLESPACE YES Greenplum数据库子句:

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

WITH (contentID_1='/path/to/dir1...)

CREATE TRIGGER NO  
CREATE TYPE YES Greenplum数据库子句:

COMPRESSTYPE | COMPRESSLEVEL | BLOCKSIZE

限制:

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

CREATE USER YES CREATE ROLE的别名
CREATE VIEW YES  
DEALLOCATE YES  
DECLARE YES 不支持的子句/选项:

SCROLL

FOR UPDATE [ OF column [, ...] ]

限制:

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

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

DELETE YES  
DISCARD YES  
DO YES PostgreSQL 9.0特性
DROP AGGREGATE YES  
DROP CAST YES  
DROP CONVERSION YES  
DROP DATABASE YES  
DROP DOMAIN YES  
DROP EXTENSION YES 从Greenplum数据库中删除扩展 - 基于PostgreSQL 9.6。
DROP EXTERNAL TABLE YES Greenplum数据库并行ETL功能 - 不在PostgreSQL 9.4中。
DROP FUNCTION YES  
DROP GROUP YES DROP ROLE的别名
DROP INDEX YES  
DROP LANGUAGE YES  
DROP OPERATOR YES  
DROP OPERATOR CLASS YES  
DROP OPERATOR FAMILY YES  
DROP OWNED NO  
DROP PROTOCOL YES  
DROP RESOURCE QUEUE YES Greenplum数据库资源管理功能 - 不在PostgreSQL 9.4中。
DROP ROLE YES  
DROP RULE YES  
DROP SCHEMA YES  
DROP SEQUENCE YES  
DROP TABLE YES  
DROP TABLESPACE YES  
DROP TRIGGER NO  
DROP TYPE YES  
DROP USER YES DROP ROLE的别名
DROP VIEW YES  
END YES  
EXECUTE YES  
EXPLAIN YES  
FETCH YES 不支持的子句/选项:

LAST

PRIOR

BACKWARD

BACKWARD ALL

限制:

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

GRANT YES  
INSERT YES  
LATERAL Join Type NO  
LISTEN NO  
LOAD YES  
LOCK YES  
MOVE YES 参考FETCH
NOTIFY NO  
PREPARE YES  
PREPARE TRANSACTION NO  
REASSIGN OWNED YES  
REFRESH MATERIALIZED VIEW NO Greenplum数据库不支持物化视图(PostgreSQL扩展)。
REINDEX YES  
RELEASE SAVEPOINT YES  
RESET YES  
REVOKE YES  
ROLLBACK YES  
ROLLBACK PREPARED NO  
ROLLBACK TO SAVEPOINT YES  
SAVEPOINT YES  
SELECT YES 限制:

FROMWHERE子句中有限使用VOLATILESTABLE函数

不支持文本搜索(Tsearch2

FETCH FIRSTFETCH NEXT子句不受支持

Greenplum数据库子句(OLAP):

[GROUP BY grouping_element [, ...]]

[WINDOW window_name AS (window_specification)]

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

SELECT INTO YES 参考SELECT
SET YES  
SET CONSTRAINTS NO 在PostgreSQL中,这仅适用于外键约束,这些约束目前未在Greenplum数据库中实施。
SET ROLE YES  
SET SESSION AUTHORIZATION YES 从PostgreSQL 8.1开始不推荐 - 请参阅SET ROLE
SET TRANSACTION YES 限制:

DEFERRABLE子句无效。

SET TRANSACTION SNAPSHOT命令不支持。

SHOW YES  
START TRANSACTION YES  
TRUNCATE YES  
UNLISTEN NO  
UPDATE YES 限制:

不允许SET为Greenplum分发键列。

VACUUM YES 限制:

Greenplum数据库不推荐使用VACUUM FULL

VALUES YES