Greenplum 特点概要

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

上级话题: 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 ABOLUTE,和 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 函数不能在段上执行,因此限于将文字值作为其参数值传递。

  6. 触发器是不支持的,因为他么通常依赖于 VOLATILE 函数的使用。
  7. 引用完整性约束(外键)不会再Greenplum数据库中实施。用户可以声明外键,但是这些信息保存在系统目录中。
  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. 对列 GRANT INSERT 或 UPDATE 权限。在Greenplum数据库中权限只能赋予在表上。
  6. GLOBAL TEMPORARY TABLEs 和 LOCAL TEMPORARY TABLEs. Greenplum TEMPORARY TABLEs 不符合SQL标准,但是很多商业数据库以同样的方式实现了临时表。Greenplum 临时表和Terdata中的 VOLATILE TABLEs 一样。
  7. UNIQUE 断言。
  8. 引用完整性检查的 MATCH PARTIAL (很可能不会在Greenplum数据库中实现)。

SQL 1999 一致性

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

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

    1. SELECT myfuncargs);
  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. CHARACTER SET 选项,在 CHAR() 或 VARCHAR() 列定义的时候。
  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. 显式表 结构。

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 使用序列的语法是非标准的。例如,nextval(’seq’) 在 Greenplum 中使用来替代标准的 NEXT VALUE FOR seq。
  6. GENERATED ALWAYS AS 列。视图可以用来解决。
  7. SELECT语句上的示例子句(TABLESAMPLE)。该 random() 函数可以用解决从表中获取随机样本的方法。
  8. partitioned join tables结构(连接中的 PARTITION BY )。
  9. GRANT SELECT 对列授权。Greenplum数据库中权限只能赋予表。视图可以用来解决。
  10. 对 CREATE TABLE x (LIKE(y)) 语句,Greenplum 不支持 [INCLUDING|EXCLUDING][DEFAULTS|CONSTRAINTS|INDEXES] 语句。
  11. 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. 该 ORDER BY 子句在视图中或子查询中会被忽视,除非也使用了 LIMIT 子句。这是可选的,正如 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 8.3 的,并且带有一些新PostgreSQL版本的一些功能。要支Greenplum数据库持分布式的特点和常规的工作负载,一些SQL命令已经被添加和修改,但是仍然还有一些PostgreSQL的功能不支持。Greenplum还添加了PostgreSQL不支持的功能,例如物理数据分布,并行查询优化,外部表,负载管理的资源队列和增强的表分区。更多关于完整的SQL语法和引用,请参阅 SQL命令参考

表 1.Greenplum数据库中支持的SQL
SQL 命令Greenplum 的支持修改,限制,例外
ALTER AGGREGATEYES 
ALTER CONVERSIONYES 
ALTER DATABASEYES 
ALTER DOMAINYES 
ALTER EXTENSIONYES改变了Greenplum数据库扩展的定义 - 基于 PostgreSQL 9.6。
ALTER FILESPACEYESGreenplum数据库并行表空间的功能 - 是 PostgreSQL 8.3不具有的。
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 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 TYPEYES 
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数据库子句:

[ , PREFUNC = prefunc ]

限制:

用来实现聚集函数的函数必须是 IMMUTABLE 函数。

CREATE CASTYES 
CREATE CONSTRAINT TRIGGERNO 
CREATE CONVERSIONYES 
CREATE DATABASEYES 
CREATE DOMAINYES 
CREATE EXTENSIONYES加载一个新的扩展到Greenplum数据库 - 基于 PostgreSQL 9.6。
CREATE EXTERNAL TABLEYESGreenplum数据库并行 ETL 特点 - PostgreSQL 8.3不具备。
CREATE FUNCTIONYES限制:

Functions 被定义成 STABLE 或者 VOLATILE 仅可以运行在Greenplum主机中数据库中。 STABLEVOLATILE 函数不能再段级别的语句中执行。

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

USING bitmap(位图索引)

限制:

UNIQUE 索引仅当它包含所有分布键的列值或者是其超集才被允许。在分区表中,唯一索引仅在单独的分区中才支持,并不能夸分区存在。

CONCURRENTLY 关键词在 Greenplum 中不支持。

CREATE LANGUAGEYES 
CREATE OPERATORYES限制:

用来实现操作符的函数必须是 IMMUTABLE 函数。

CREATE OPERATOR CLASSYES 
CREATE OPERATOR FAMILYYES 
CREATE PROTOCOLYES 
CREATE RESOURCE QUEUEYESGreenplum数据库工作负载管理功能 - PostgreSQL 8.3不具有。
CREATE ROLEYESGreenplum数据库子句:

RESOURCE QUEUE queue_name | none

CREATE RULEYES 
CREATE SCHEMAYES 
CREATE SEQUENCEYES限制:

The lastval and currval 函数不支持。

The 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 (appendonly=true      [,compresslevel=value,blocksize=value] )

CREATE TABLE ASYES参阅 CREATE TABLE
CREATE TABLESPACENOGreenplum数据库子句:

FILESPACE filespace_name

CREATE TRIGGERNO 
CREATE TYPEYES限制:

用来实现基础类型的函数必须是 IMMUTABLE 函数。

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

SCROLL

FOR UPDATE [ OF column [, …] ]

限制:

游标不可以后滚动,支持前滚动。

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

DELETEYES不支持的子句/ 选项:

RETURNING

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 8.3不具有。
DROP FILESPACEYESGreenplum数据库并行表空间功能 - PostgreSQL 8.3不具有。
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 8.3不支持。
DROP ROLEYES 
DROP RULEYES 
DROP SCHEMAYES 
DROP SEQUENCEYES 
DROP TABLEYES 
DROP TABLESPACENO 
DROP TRIGGERNO 
DROP TYPEYES 
DROP USERYESDROP ROLE 的别名。
DROP VIEWYES 
ENDYES 
EXECUTEYES 
EXPLAINYES 
FETCHYES不支持的子句/ 选项:

LAST

PRIOR

BACKWARD

BACKWARD ALL

限制:

不能非顺序的提取行;不支持向后扫描。

GRANTYES 
INSERTYES不支持的子句/ 选项:

RETURNING

LISTENNO 
LOADYES 
LOCKYES 
MOVEYES参见 FETCH
NOTIFYNO 
PREPAREYES 
PREPARE TRANSACTIONNO 
REASSIGN OWNEDYES 
REINDEXYES 
RELEASE SAVEPOINTYES 
RESETYES 
REVOKEYES 
ROLLBACKYES 
ROLLBACK PREPAREDNO 
ROLLBACK TO SAVEPOINTYES 
SAVEPOINTYES 
SELECTYES限制:

限制使用 VOLATILESTABLE 函数在 FROMWHERE 子句中

文本搜索(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 
SHOWYES 
START TRANSACTIONYES 
TRUNCATEYES 
UNLISTENNO 
UPDATEYES不支持的子句:

RETURNING

限制:

SET 对于 Greenplum 分布键列是不允许的。

VACUUMYES限制:

VACUUM FULL 在Greenplum数据库中不推荐。

VALUESYES