

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# Amazon Redshift SQL
<a name="c_redshift-sql"></a>

**Topics**
+ [

# 在领导节点上支持的 SQL 函数
](c_sql-functions-leader-node.md)
+ [

# Amazon Redshift 和 PostgreSQL
](c_redshift-and-postgres-sql.md)

Amazon Redshift 是围绕行业标准 SQL 构建的，新增了管理非常大的数据库并支持针对这些数据进行高性能分析和报告的功能。

**注意**  
单个 Amazon Redshift SQL 语句的最大大小为 16MB。

# 在领导节点上支持的 SQL 函数
<a name="c_sql-functions-leader-node"></a>

一些 Amazon Redshift 查询是在计算节点上分发和运行的；而另一些查询仅在领导节点上运行。

每当查询引用用户创建的表或系统表（具有 STL 或 STV 前缀的表和具有 SVL 或 SVV 前缀的系统视图）时，领导节点就会将 SQL 分发到计算节点。仅引用目录表（驻留在领导节点上的、具有 PG 前缀的表，如 PG\$1TABLE\$1DEF）或不引用任何表的查询在领导节点上以独占方式运行。

部分 Amazon Redshift SQL 函数仅在领导节点上受支持，在计算节点上不受支持。使用领导节点函数的查询必须在领导节点上而不是计算节点上以独占方式执行，否则它将返回错误。

必须在领导节点上以独占方式运行的每个函数的文档包含一个注释，指示该函数将在引用用户定义的表或 Amazon Redshift 系统表时返回错误。有关在领导节点上以独占方式运行的函数的列表，请参阅[仅领导节点函数](c_SQL_functions_leader_node_only.md)。

## 示例
<a name="c_sql-functions-leader-node-examples"></a>

以下示例使用示例 TICKIT 数据库。有关示例数据库的更多信息，请转到[示例数据库](c_sampledb.md)。

**CURRENT\$1SCHEMA**

CURRENT\$1SCHEMA 函数是仅适用于领导节点的函数。在此示例中，查询不会引用表，因此它将在领导节点上以独占方式运行。

```
select current_schema();
            
current_schema
---------------
public
```

在下一个示例中，查询引用系统目录表，因此它将在领导节点上以独占方式运行。

```
select * from pg_table_def
where schemaname = current_schema() limit 1;

 schemaname | tablename | column |   type   | encoding | distkey | sortkey | notnull
------------+-----------+--------+----------+----------+---------+---------+---------
 public     | category  | catid  | smallint | none     | t       |       1 | t
```

在下一个示例中，查询引用驻留在计算节点上的 Amazon Redshift 系统表，因此它将返回错误。

```
select current_schema(), userid from users;

INFO:  Function "current_schema()" not supported.
ERROR:  Specified types or functions (one per INFO message) not supported on Amazon Redshift tables.
```

**SUBSTR**

SUBSTR 也是一个仅适用于领导节点的函数。在下面的示例中，由于查询没有引用表，因此在领导节点上以独占方式运行。

```
SELECT SUBSTR('amazon', 5);
            
+--------+
| substr |
+--------+
| on     |
+--------+
```

在下面的示例中，查询引用驻留在计算节点上的表。这会导致错误。

```
SELECT SUBSTR(catdesc, 1) FROM category LIMIT 1;
            
ERROR: SUBSTR() function is not supported (Hint: use SUBSTRING instead)
```

要成功运行前一个查询，请使用 [SUBSTRING](https://docs.aws.amazon.com/redshift/latest/dg/r_SUBSTRING.html)。

```
SELECT SUBSTRING(catdesc, 1) FROM category LIMIT 1;
            
+---------------------------------+
|            substring            |
+---------------------------------+
| National Basketball Association |
+---------------------------------+
```

**FACTORIAL()**

FACTORIAL() 是仅适用于主节点的函数。在下面的示例中，由于查询没有引用表，因此在领导节点上以独占方式运行。

```
SELECT FACTORIAL(5);           

 factorial 
-------------
 120
```

在下面的示例中，查询引用驻留在计算节点上的表。使用查询编辑器 v2 运行时会导致错误。

```
create table t(a int);
insert into t values (5);
select factorial(a) from t;           

ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables.
Info: Function "factorial(bigint)" not supported.
```

# Amazon Redshift 和 PostgreSQL
<a name="c_redshift-and-postgres-sql"></a>

**Topics**
+ [

# Amazon Redshift 及 PostgreSQL JDBC 和 ODBC
](c_redshift-postgres-jdbc.md)
+ [

# 以不同方式实施的功能
](c_redshift-sql-implementated-differently.md)
+ [

# 不支持的 PostgreSQL 功能
](c_unsupported-postgresql-features.md)
+ [

# 不支持的 PostgreSQL 数据类型
](c_unsupported-postgresql-datatypes.md)
+ [

# 不支持的 PostgreSQL 函数
](c_unsupported-postgresql-functions.md)

Amazon Redshift 基于 PostgreSQL。Amazon Redshift 和 PostgreSQL 之间的差别非常大，您在设计和开发数据仓库应用程序时必须注意这一点。

Amazon Redshift 是专为联机分析处理 (OLAP) 和业务智能 (BI) 应用程序设计的，这些应用程序需要针对大型数据集的复杂查询。由于它解决了迥然不同的需求，因此 Amazon Redshift 使用的专用数据存储 schema 和查询执行引擎完全不同于 PostgreSQL 实现。例如，联机事务处理 (OLTP) 应用程序通常将数据存储在行中，Amazon Redshift 将数据存储在列中，并使用专业的数据压缩编码以获得最优的内存使用和磁盘输入/输出。某些适合小型 OLTP 处理，如二级索引和高效单行数据操作运算的 PostgreSQL 功能已省略，以改进性能。

有关 Amazon Redshift 数据仓库系统架构的详细解释，请参阅[Amazon Redshift 架构](c_redshift_system_overview.md)。

PostgreSQL 9.x 包含一些在 Amazon Redshift 中不支持的功能。此外，Amazon Redshift SQL 和 PostgreSQL 之间有一些重大差异，您必须了解。本节重点介绍了 Amazon Redshift 和 PostgreSQL 之间的差异，并提供了开发充分利用 Amazon Redshift SQL 实现的数据仓库的指南。

# Amazon Redshift 及 PostgreSQL JDBC 和 ODBC
<a name="c_redshift-postgres-jdbc"></a>

 由于 Amazon Redshift 基于 PostgreSQL，因此我们之前建议使用 JDBC4 Postgresql 驱动程序版本 8.4.703 和 psqlODBC 版本 9.x 的驱动程序。如果您当前使用的是这两种驱动程序，建议您接下来转移至新的特定于 Amazon Redshift 的驱动程序。有关驱动程序和配置连接的更多信息，请参阅《Amazon Redshift 管理指南》**中的 [Amazon Redshift 的 JDBC 和 ODBC 驱动程序](https://docs.aws.amazon.com/redshift/latest/mgmt/configuring-connections.html#connecting-drivers)。

为了避免在使用 JDBC 检索大型数据集时出现客户端内存不足错误，您可通过设置 JDBC 提取大小参数来使您的客户端能够成批提取数据。有关更多信息，请参阅 [设置 JDBC 提取大小参数](set-the-JDBC-fetch-size-parameter.md)。

Amazon Redshift 无法识别 JDBC maxRows 参数。请改为指定 [LIMIT](r_ORDER_BY_clause.md#order-by-clause-limit) 子句来限制结果集。您还可使用 [OFFSET](r_ORDER_BY_clause.md#order-by-clause-offset) 子句跳至结果集中的特定起点。

# 以不同方式实施的功能
<a name="c_redshift-sql-implementated-differently"></a>

许多 Amazon Redshift SQL 语言元素都具有不同的性能特征和使用语法以及语义，并且等效的 PostgreSQL 实施有很大不同。

**重要**  
请勿假设 Amazon Redshift 和 PostgreSQL 共同具有的元素的语义是相同的。确保查阅《Amazon Redshift 开发人员指南》**[SQL 命令](c_SQL_commands.md)以了解常有的细小差异。

一个具体的示例是 [VACUUM](r_VACUUM_command.md) 命令，该命令用于清理和重新组织表。VACUUM 具有不同的功能，并且使用的参数组不同于 PostgreSQL 版本。有关在 Amazon Redshift 中使用 VACUUM 的更多信息，请参阅[对表执行 vacuum 操作](t_Reclaiming_storage_space202.md)。

通常，数据库管理功能和工具也不相同。例如，Amazon Redshift 维护一组提供有关系统运行方式的信息的系统表和视图。参阅 [SYS 监控视图](serverless_views-monitoring.md) 了解更多信息。

以下列表包含 Amazon Redshift 中的实现方式不同的 SQL 功能的一些示例。
+  [CREATE TABLE](r_CREATE_TABLE_NEW.md) 

  Amazon Redshift 不支持表空间、表分区、继承和某些约束。CREATE TABLE 的 Amazon Redshift 实现使您能够为表定义排序和分配算法以优化并行处理。

  Amazon Redshift Spectrum 支持使用 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 命令的表分区。
+  [ALTER TABLE](r_ALTER_TABLE.md) 

  只支持 ALTER COLUMN 操作的子集。

  ADD COLUMN 支持在每个 ALTER TABLE 语句中仅添加一列。
+  [COPY](r_COPY.md) 

  Amazon Redshift COPY 命令专门用于支持从 Amazon S3 桶和 Amazon DynamoDB 表加载数据以及方便自动压缩。有关详细信息，请参阅[在 Amazon Redshift 中加载数据](t_Loading_data.md)部分和 COPY 命令参考。
+  [VACUUM](r_VACUUM_command.md) 

  VACUUM 的参数完全不同。例如，PostgreSQL 中的默认 VACUUM 操作只是回收空间并使空间可供重复使用；但是，Amazon Redshift 中的默认 VACUUM 操作为 VACUUM FULL，可回收磁盘空间并对所有行重新排序。
+ 在比较字符串值时，会忽略 VARCHAR 值的尾部空格。有关更多信息，请参阅 [尾部空格的意义](r_Character_types.md#r_Character_types-significance-of-trailing-blanks)。

# 不支持的 PostgreSQL 功能
<a name="c_unsupported-postgresql-features"></a>

这些功能在 Amazon Redshift 中不受支持。

**重要**  
请勿假设 Amazon Redshift 和 PostgreSQL 共同具有的元素的语义是相同的。确保查阅《Amazon Redshift 开发人员指南》**[SQL 命令](c_SQL_commands.md)以了解常有的细小差异。
+ 不支持查询工具 *RSQL*。支持 [Amazon Redshift RSQL](https://docs.aws.amazon.com/redshift/latest/mgmt/rsql-query-tool.html) 客户端。
+ 表分区（范围和列表分区）
+ 表空间
+ 约束
  + 唯一
  + 外键
  + 主键
  + 检查约束
  + 排他性约束

  允许唯一键、主键和外键约束，但它们仅供参考。这些约束不由系统强制实施，而是由查询规划器使用。
+ 继承
+ PostgreSQL 系统列

  Amazon Redshift SQL 不会隐式定义系统列。但是，以下 PostgreSQL 系统列名称无法用作用户定义列的名称：`oid`、`tableoid`、`xmin`、`cmin`、`xmax`、`cmax` 和 `ctid`。有关更多信息，请参阅 [https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html](https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html)。
+ 索引
+ 窗口函数中的 NULLS 子句
+ 排序规则

  Amazon Redshift 不支持区域设置特定的或用户定义的排序规则序列。请参阅 [排序规则序列](c_collation_sequences.md)。
+ 值表达式
  + 下标表达式
  + 数组构造函数
  + 行构造函数
+ 触发
+ 外部数据管理 (SQL/MED)
+ 表函数
+ 用作常量表的 VALUES 列表
+ Sequences 属性
+ 全文搜索
+ RULE 和 TRIGGER 权限。

  当您运行 GRANT ALL 或 REVOKE ALL 时，Amazon Redshift 会授予或撤销这些权限，但是 RULE 和 TRIGGER 权限的存在与否不会以任何方式影响被授权者的访问权限。

# 不支持的 PostgreSQL 数据类型
<a name="c_unsupported-postgresql-datatypes"></a>

通常，如果查询尝试使用不受支持的数据类型，包括显式或隐式强制转换，则将返回错误。但是，使用不支持的数据类型的某些查询将仅在领导节点运行，而不在计算节点上运行。请参阅 [在领导节点上支持的 SQL 函数](c_sql-functions-leader-node.md)。

 有关支持的数据类型的列表，请参阅[数据类型](c_Supported_data_types.md)。

这些 PostgreSQL 数据类型在 Amazon Redshift 中不受支持。
+ 数组
+ BIT、BIT VARYING
+ BYTEA
+ 复合类型
+ 枚举类型
+ 几何类型（Amazon Redshift 对几何类型的实现与 PostgreSQL 不同）
+ HSTORE
+ JSON
+ 网络地址类型
+ 数字类型
  + SERIAL、BIGSERIAL、SMALLSERIAL
  + MONEY
+ 对象标识符类型
+ 伪类型
+ 范围类型
+ 特殊字符类型
  + “char” – 单字节内部类型（其中名为 char 的数据类型用引号括起来）。
  + name – 对象名称的内部类型。

  有关这些类型的更多信息，请参阅 PostgreSQL 文档中的[特殊字符类型](https://www.postgresql.org/docs/8.0/datatype-character.html)。
+ 文本搜索类型
+ TXID\$1SNAPSHOT
+ UUID
+ XML

# 不支持的 PostgreSQL 函数
<a name="c_unsupported-postgresql-functions"></a>

很多未排除的函数具有不同的语义或用法。例如，一些受支持的函数将仅在领导节点上运行。此外，一些不受支持的函数在领导节点上运行时不会返回错误。这些函数在某些情况下不返回错误的情况不应视为表示这些函数受 Amazon Redshift 支持。

**重要**  
请勿假设 Amazon Redshift 和 PostgreSQL 共同具有的元素的语义是相同的。确保查阅《Amazon Redshift 数据库开发人员指南》**[SQL 命令](c_SQL_commands.md)以了解常有的细小差异。

 有关更多信息，请参阅 [在领导节点上支持的 SQL 函数](c_sql-functions-leader-node.md)。

这些 PostgreSQL 函数在 Amazon Redshift 中不受支持。
+ 访问权限查询函数
+ 劝告锁函数
+ 聚合函数
  + STRING\$1AGG()
  + ARRAY\$1AGG()
  + EVERY()
  + XML\$1AGG()
  + CORR()
  + COVAR\$1POP()
  + COVAR\$1SAMP()
  + REGR\$1AVGX()、REGR\$1AVGY()
  + REGR\$1COUNT()
  + REGR\$1INTERCEPT()
  + REGR\$1R2()
  + REGR\$1SLOPE()
  + REGR\$1SXX()、REGR\$1SXY()、REGR\$1SYY()
+ 数组函数和运算符
+ 备份控制函数
+ 注释信息函数
+ 数据库对象位置函数
+ 数据库对象大小函数
+ 日期/时间函数和运算符
  + CLOCK\$1TIMESTAMP()
  + JUSTIFY\$1DAYS()、JUSTIFY\$1HOURS()、JUSTIFY\$1INTERVAL()
  + PG\$1SLEEP()
  + TRANSACTION\$1TIMESTAMP()
+ ENUM 支持函数
+ 几何函数和运算符
+ 一般文件访问函数
+ IS DISTINCT FROM
+ 网络地址函数和运算符
+ 数学函数
  + DIV()
  + SETSEED()
  + WIDTH\$1BUCKET()
+ 设置返回函数
  + GENERATE\$1SERIES()
  + GENERATE\$1SUBSCRIPTS()
+ 范围函数和运算符
+ 恢复控制函数
+ 恢复信息函数
+ ROLLBACK TO SAVEPOINT 函数
+ Schema 可见性查询函数
+ 服务器信号函数
+ 快照同步函数
+ 顺序操作函数
+ 字符串函数
  + BIT\$1LENGTH()
  + OVERLAY()
  + CONVERT()、CONVERT\$1FROM()、CONVERT\$1TO()
  + ENCODE()
  + FORMAT()
  + QUOTE\$1NULLABLE()
  + REGEXP\$1MATCHES()
  + REGEXP\$1SPLIT\$1TO\$1ARRAY()
  + REGEXP\$1SPLIT\$1TO\$1TABLE()
+ 系统目录信息函数
+ 系统信息函数
  + CURRENT\$1CATALOG CURRENT\$1QUERY()
  + INET\$1CLIENT\$1ADDR()
  + INET\$1CLIENT\$1PORT()
  + INET\$1SERVER\$1ADDR() INET\$1SERVER\$1PORT()
  + PG\$1CONF\$1LOAD\$1TIME()
  + PG\$1IS\$1OTHER\$1TEMP\$1SCHEMA()
  + PG\$1LISTENING\$1CHANNELS()
  + PG\$1MY\$1TEMP\$1SCHEMA()
  + PG\$1POSTMASTER\$1START\$1TIME()
  + PG\$1TRIGGER\$1DEPTH()
  + SHOW VERSION()
+ 文本搜索函数和运算符
+ 事务 ID 和快照函数
+ 触发器函数
+ XML 函数