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 TABLE
s 和LOCAL TEMPORARY TABLE
s. GreenplumTEMPORARY TABLE
s 不符合SQL标准,但是很多商业数据库以同样的方式实现了临时表。Greenplum 临时表和Terdata中的VOLATILE TABLE
s 一样。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);
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. `CHARACTER SET` 选项,在
`CHAR()` 或 `VARCHAR()` 列定义的时候。
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中的一种解决方案。
12. *显式表* 结构。
### SQL 2003 一致性
以下 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 使用序列的语法是非标准的。例如,`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. `BINARY` 和 `VARBINARY` 数据类型。
在Greenplum数据库中,`BYTEA` 可以用来替代 `VARBINARY`。
2. `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命令参考。
表 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主机中数据库中。 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 |