Greenplum特性摘要

Greenplum 特点概要

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

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

SQL 1992 一致性

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

  1. NATIONAL CHARACTERNCHAR)和 NATIONAL CHARACTER VARYINGNVARCHAR)。用户可以声明 NCHARNVARCHAR 类型,但是它们只是Greenplum数据库中 CHARVARCHAR 的同义词。
  2. CREATE ASSERTION 语句。
  3. INTERVAL 文字在Greenplum数据库中是支持的, 但是不符合标准。
  4. GET DIAGNOSTICS 语句。
  5. 对列 GRANT INSERTUPDATE 权限。在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 数据类型:BLOBCLOBNCLOB。但是,Grennplum数据库中该 BYTEATEXT 列可以存储大量的数据(数百兆字节)。
  2. MODULE(SQL 客户端模块)。
  3. CREATE PROCEDURESQL/PSM)。这可通过创建返回值为voidFUNCTION 在Greenplum数据库中进行操作,如下调用函数:
    SELECT myfuncargs);
    
  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. CHARACTER SET 选项,在 CHAR()VARCHAR() 列定义的时候。
  9. 指明 CHARACTERSOCTETSBYTES)关于 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 子句。该 SERIALBIGSERIAL 数据类型 INTBIGINT 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. 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. ORDER BY 子句在视图中或子查询中会被忽视,除非也使用了 LIMIT 子句。这是可选的,正如 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 8.3 的,并且带有一些新PostgreSQL版本的一些功能。要支Greenplum数据库持分布式的特点和常规的工作负载,一些SQL命令已经被添加和修改,但是仍然还有一些PostgreSQL的功能不支持。Greenplum还添加了PostgreSQL不支持的功能,例如物理数据分布,并行查询优化,外部表,负载管理的资源队列和增强的表分区。更多关于完整的SQL语法和引用,请参阅 SQL命令参考

表 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 FILESPACE YES Greenplum数据库并行表空间的功能 - 是 PostgreSQL 8.3不具有的。
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 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  
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数据库子句:

[ , PREFUNC = prefunc ]

限制:

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

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 8.3不具备。
CREATE FUNCTION YES 限制:

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

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

USING bitmap(位图索引)

限制:

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

CONCURRENTLY 关键词在 Greenplum 中不支持。

CREATE LANGUAGE YES  
CREATE OPERATOR YES 限制:

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

CREATE OPERATOR CLASS YES  
CREATE OPERATOR FAMILY YES  
CREATE PROTOCOL YES  
CREATE RESOURCE QUEUE YES Greenplum数据库工作负载管理功能 - PostgreSQL 8.3不具有。
CREATE ROLE YES Greenplum数据库子句:

RESOURCE QUEUE queue_name | none

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

The lastval and currval 函数不支持。

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

CREATE TABLE AS YES 参阅 CREATE TABLE
CREATE TABLESPACE NO Greenplum数据库子句:

FILESPACE filespace_name

CREATE TRIGGER NO  
CREATE TYPE YES 限制:

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

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

SCROLL

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

限制:

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

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

DELETE YES 不支持的子句/ 选项:

RETURNING

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 8.3不具有。
DROP FILESPACE YES Greenplum数据库并行表空间功能 - PostgreSQL 8.3不具有。
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 8.3不支持。
DROP ROLE YES  
DROP RULE YES  
DROP SCHEMA YES  
DROP SEQUENCE YES  
DROP TABLE YES  
DROP TABLESPACE NO  
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 不支持的子句/ 选项:

RETURNING

LISTEN NO  
LOAD YES  
LOCK YES  
MOVE YES 参见 FETCH
NOTIFY NO  
PREPARE YES  
PREPARE TRANSACTION NO  
REASSIGN OWNED YES  
REINDEX YES  
RELEASE SAVEPOINT YES  
RESET YES  
REVOKE YES  
ROLLBACK YES  
ROLLBACK PREPARED NO  
ROLLBACK TO SAVEPOINT YES  
SAVEPOINT YES  
SELECT YES 限制:

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

文本搜索(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  
SHOW YES  
START TRANSACTION YES  
TRUNCATE YES  
UNLISTEN NO  
UPDATE YES 不支持的子句:

RETURNING

限制:

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

VACUUM YES 限制:

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

VALUES YES