Greenplum 特点概要
该部分提供了Greenplum数据库的系统要求和功能集合的高级概述。它包含以下主题:
Parent topic: 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
。 GreenplumTEMPORARY 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兼容性
Greenplum数据库基于PostgreSQL 9.4。 为了支持Greenplum数据库系统的分布式特性和典型工作负载,添加或修改了一些SQL命令,并且有一些不受支持的PostgreSQL功能。 Greenplum还添加了PostgreSQL中没有的功能,例如物理数据分发,并行查询优化,外部表,资源队列和增强的表分区。 有关完整的SQL语法和参考,请参阅SQL Command Reference。
Note: Greenplum数据库不支持PostgreSQL大对象工具,用于流式传输存储在大型对象结构中的用户数据。
Table 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 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 |