Greenplum 特点概要

    Parent topic: Greenplum数据库参考指南

    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结构尚未在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 的特性在Greenplum数据库中不支持:

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

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

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

    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中的一种解决方案。

    以下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的特性在Greenplum数据库中不支持:

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

      1. 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语法和参考,请参阅。

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