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结构:
- 有些设置在EXISTS或NOT EXISTS子句中返回子查询,Greenplum的并行优化器不能将之重写为到连接之中。
- 向后回滚游标,包括FETCH PRIOR,FETCH FIRST,FETCH ABSOLUTE,和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函数不能在segment上执行,因此通常仅限于传递文字值作为其参数的参数。
- 触发器是不支持的,因为他么通常依赖于VOLATILE函数的使用。
- 引用完整性约束(外键)不会再Greenplum数据库中实施。 用户可以声明外键,但是这些信息保存在系统catalog中。
- 序列操纵函数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语句。
- GLOBAL TEMPORARY TABLE和LOCAL TEMPORARY TABLE。 Greenplum TEMPORARY TABLE不符合SQL标准,但许多商业数据库系统以相同的方式实现了临时表。 Greenplum临时表与Teradata中的VOLATILE TABLE相同。
- UNIQUE断言。
- 引用完整性检查的MATCH PARTIAL(很可能不会在Greenplum数据库中实现)。
SQL 1999 一致性
以下SQL 1999的功能在Greenplum数据库中不支持:
- Large Object数据类型:BLOB, CLOB, 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个阶段的提交的协调)。
- CHAR()或VARCHAR()列定义的CHARACTER SET选项。
- 指明CHARACTERS或OCTETS(BYTES)关于CHAR()或VARCHAR()列的长度。 例如,VARCHAR(15 CHARACTERS)或VARCHAR(15 OCTETS)或VARCHAR(15 BYTES)。
- CURRENT_SCHEMA函数。
- CREATE DISTINCT TYPE语句。 CREATE DOMAIN可以用作Greenplum中的一种解决方案。
- explicit table构造。
SQL 2003 一致性
以下SQL 2003的功能在Greenplum数据库中不支持:
- MERGE语句。
- IDENTITY列和相关的GENERATED ALWAYS/GENERATED BY DEFAULT子句。 该SERIAL或BIGSERIAL数据类型与INT或BIGINT GENERATED BY DEFAULT AS IDENTITY非常相似。
- 数据类型的MULTISET修饰符。
- ROW数据类型。
- Greenplum使用序列的语法是非标准的。 例如,在Greenplum中使用nextval('seq')来替代标准的NEXT VALUE FOR seq。
- GENERATED ALWAYS AS列。 视图可以用作解决方法。
- SELECT语句上的示例子句(TABLESAMPLE)。 该random()函数可以用解决从表中获取随机样本的方法。
- 该partitioned join tables结构(连接中的PARTITION BY)。
- 对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子句可以用来替代。
- 除非还使用LIMIT子句,否则在视图和子查询中将忽略ORDER BY子句。 这是有意的,因为Greenplum优化器无法确定何时避免排序是安全的,从而对此类ORDER BY子句造成意外的性能影响。 要解决这个问题,用户可以指定一个非常大的LIMIT。 例如:SELECT * FROM mytable ORDER BY 1 LIMIT 9999999999
- row subquery结构是不支持的。
- TRUNCATE TABLE不接受CONTINUE IDENTITY和RESTART IDENTITY子句。
Greenplum和PostgreSQL兼容性
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 |
限制:
定义为STABLE或VOLATILE的函数可以在Greenplum数据库中执行,只要它们仅在master上执行即可。 STABLE和VOLATILE函数不能在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] 限制子句: UNIQUE或PRIMARY 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 |
限制:
在FROM或WHERE子句中有限使用VOLATILE和STABLE函数 不支持文本搜索(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 |
限制: DEFERRABLE子句无效。 SET TRANSACTION SNAPSHOT命令不支持。 |
SHOW | YES | |
START TRANSACTION | YES | |
TRUNCATE | YES | |
UNLISTEN | NO | |
UPDATE | YES |
限制:
不允许SET为Greenplum分发键列。 |
VACUUM | YES |
限制:
Greenplum数据库不推荐使用VACUUM FULL。 |
VALUES | YES |