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结构:
- 有些设置在 EXISTS 或 NOT EXISTS 子句中返回子查询,Greenplum的并行优化器不能将之重写为到连接之中。
- 向后回滚游标,包括 FETCH PRIOR,FETCH FIRST,FETCH ABOLUTE,和 FETCH RELATIVE操作的使用。
- 在 CREATE TABLE 语句上(哈希分布表):UNIQUE 或 PRIMARY KEY 子句必须包括分布键列的所有值,或者是其超集。因为这个限制,在CREATE TABLE的语句中,仅允许一个 UNIQUE 子句或者 PRIMARY KEY 子句。UNIQUE 或 PRIMARY KEY 子句不允许出现在随机分布的表中。
CREATE UNIQUE INDEX 语句不包含分布键的列的所有值或者为其超集。CREATE UNIQUE INDEX不允许使用在随机分布的表上。
注意 UNIQUE INDEXES(但是不是 UNIQUE CONSTRAINTS)在分布表的单个部分上执行,它们保证每个部分或者字部分内的键值的唯一性。
VOLATILE 或 STABLE 函数不能在段上执行,因此限于将文字值作为其参数值传递。
- 触发器是不支持的,因为他么通常依赖于 VOLATILE 函数的使用。
- 引用完整性约束(外键)不会再Greenplum数据库中实施。用户可以声明外键,但是这些信息保存在系统目录中。
- 序列操纵函数 CURRVAL 和 LASTVAL。
SQL 1992 一致性
以下 SQL 1992 的功能在Greenplum数据库中不支持:
- NATIONAL CHARACTER(NCHAR)和 NATIONAL CHARACTER VARYING(NVARCHAR)。用户可以声明 NCHAR 和 NVARCHAR 类型,但是它们只是Greenplum数据库中 CHAR 和 VARCHAR 的同义词。
- CREATE ASSERTION 语句。
- INTERVAL 文字在Greenplum数据库中是支持的, 但是不符合标准。
- GET DIAGNOSTICS 语句。
- 对列 GRANT INSERT 或 UPDATE 权限。在Greenplum数据库中权限只能赋予在表上。
- GLOBAL TEMPORARY TABLEs 和 LOCAL TEMPORARY TABLEs. Greenplum TEMPORARY TABLEs 不符合SQL标准,但是很多商业数据库以同样的方式实现了临时表。Greenplum 临时表和Terdata中的 VOLATILE TABLEs 一样。
- UNIQUE 断言。
- 引用完整性检查的 MATCH PARTIAL (很可能不会在Greenplum数据库中实现)。
SQL 1999 一致性
以下 SQL 1999 的功能在Greenplum数据库中不支持:
- Large Object 数据类型:BLOBCLOB, NCLOB。但是,Grennplum数据库中该 BYTEA 和 TEXT 列可以存储大量的数据(数百兆字节)。
- MODULE(SQL 客户端模块)。
CREATE PROCEDURE(SQL/PSM)。这可通过创建返回值为void的FUNCTION 在Greenplum数据库中进行操作,如下调用函数:
SELECT myfunc(args);
该 PostgreSQL/Greenplum 函数定义语言 (PL/PGSQL)是Oracle的 PL/SQL的子集,而不是和 SQL/PSM 函数定义语言的兼容。 Greenplum数据库还支持使用 Python,Perl,Java,和 R定义函数。
- BIT 和 BIT VARYING 数据类型 (故意生路)。这些在 SQL 2003中被弃用,并且在 SQL 2008中被替代。
- Greenplum 63个字符长的标识符。该SQL标准要求支持达到128个字符长的标识符。
- 准备好的事务(PREPARE TRANSACTION, COMMIT PREPARED, ROLLBACK PREPARED)。这也意味着 Greenplum 不支持 XA 事务(数据库事务和外部事务2个阶段的提交的协调)。
- CHARACTER SET 选项,在 CHAR() 或 VARCHAR() 列定义的时候。
- 指明 CHARACTERS 或 OCTETS (BYTES)关于 CHAR() 或 VARCHAR() 列的长度。例如,VARCHAR(15 CHARACTERS) 或 VARCHAR(15 OCTETS) 或 VARCHAR(15 BYTES)。
- CURRENT_SCHEMA 函数。
- CREATE DISTINCT TYPE 语句。CREATE DOMAIN 可以用作Greenplum中的一种解决方案。
- 显式表 结构。
SQL 2003 一致性
以下 SQL 2003 的功能在Greenplum数据库中不支持:
- MERGE 语句。
- IDENTITY 列和相关的 GENERATED ALWAYS/GENERATED BY DEFAULT 子句。该 SERIAL 或 BIGSERIAL 数据类型 INT 或 BIGINT GENERATED BY DEFAULT AS IDENTITY非常相似。
- MULTISET 对数据类型的修饰符。
- ROW 数据类型。
- Greenplum 使用序列的语法是非标准的。例如,nextval(’seq’) 在 Greenplum 中使用来替代标准的 NEXT VALUE FOR seq。
- GENERATED ALWAYS AS 列。视图可以用来解决。
- SELECT语句上的示例子句(TABLESAMPLE)。该 random() 函数可以用解决从表中获取随机样本的方法。
- 该 partitioned join tables结构(连接中的 PARTITION BY )。
- GRANT SELECT 对列授权。Greenplum数据库中权限只能赋予表。视图可以用来解决。
- 对 CREATE TABLE x (LIKE(y)) 语句,Greenplum 不支持 [INCLUDING|EXCLUDING][DEFAULTS|CONSTRAINTS|INDEXES] 语句。
- Greenplum 数组数据类型几乎符合SQL标准,但是有一些例外,通常,用户不应该遇到使用它们的问题。
SQL 2008 一致性
以下SQL 2008的功能在Greenplum数据库中不支持:
- BINARY 和 VARBINARY 数据类型。 在Greenplum数据库中,BYTEA 可以用来替代 VARBINARY。
FETCH FIRST 或 FETCH NEXT 子句对 SELECT,例如:
SELECT id, name FROM tab1 ORDER BY id OFFSET 20 ROWS FETCH
NEXT 10 ROWS ONLY;
Greenplum 有 LIMIT 和 LIMIT OFFSET 子句可以用来替代。
该 ORDER BY 子句在视图中或子查询中会被忽视,除非也使用了 LIMIT 子句。这是可选的,正如 Greenplum 优化器不能决定什么时候可以安全的避免呢排序,可能会导致未知的性能影响因为 ORDER BY 子句。要解决这个问题,用户可以指定一个非常大的 LIMIT。例如: SELECT * FROM mytable ORDER BY 1 LIMIT 9999999999
- 该 row subquery 结构是不支持的。
- TRUNCATE TABLE 不接受 CONTINUE IDENTITY 和 RESTART IDENTITY 子句。
Greenplum 和 PostgreSQL 兼容性
Greenplum数据库是基于 PostgreSQL 8.3 的,并且带有一些新PostgreSQL版本的一些功能。要支Greenplum数据库持分布式的特点和常规的工作负载,一些SQL命令已经被添加和修改,但是仍然还有一些PostgreSQL的功能不支持。Greenplum还添加了PostgreSQL不支持的功能,例如物理数据分布,并行查询优化,外部表,负载管理的资源队列和增强的表分区。更多关于完整的SQL语法和引用,请参阅 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主机中数据库中。 STABLE 和 VOLATILE 函数不能再段级别的语句中执行。 |
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] 限制子句: UNIQUE 或 PRIMARY 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 | 限制: 限制使用 VOLATILE 和 STABLE 函数在 FROM 或 WHERE 子句中 文本搜索(Tsearch2)是不支持的。 FETCH FIRST 或 FETCH 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 |