

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

# CREATE TABLE AS
<a name="r_CREATE_TABLE_AS"></a>

**Topics**
+ [语法](#r_CREATE_TABLE_AS-synopsis)
+ [参数](#r_CREATE_TABLE_AS-parameters)
+ [CTAS 使用说明](r_CTAS_usage_notes.md)
+ [CTAS 示例](r_CTAS_examples.md)

创建基于查询的新表。此表的所有者为发出命令的用户。

新表与命令的查询定义的数据一起加载。表列具有与查询的输出列关联的名称和数据类型。CREATE TABLE AS (CTAS) 命令创建一个新表并评估查询以加载新表。

## 语法
<a name="r_CREATE_TABLE_AS-synopsis"></a>

```
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ]
TABLE table_name
[ ( column_name [, ... ] ) ]
[ BACKUP { YES | NO } ]
[ table_attributes ]
AS query

where table_attributes are:
[ DISTSTYLE { AUTO | EVEN | ALL | KEY } ]
[ DISTKEY( distkey_identifier ) ]
[ [ COMPOUND | INTERLEAVED ] SORTKEY( column_name [, ...] ) ]
```

## 参数
<a name="r_CREATE_TABLE_AS-parameters"></a>

LOCAL   
虽然语句中接受此可选关键词，但它在 Amazon Redshift 中没有任何作用。

TEMPORARY \| TEMP   
创建一个临时表。在创建临时表的会话结束时将自动删除该临时表。

 *table\_name*   
要创建的表的名称。  
如果指定以“\#”开始的表名，表会创建为临时表。例如：  

```
create table #newtable (id) as select * from oldtable;
```
表名称的最大长度为 127 个字节；更长的名称将被截断为 127 个字节。Amazon Redshift 会按节点类型强制执行每个集群的表数量配额。可使用数据库和 schema 名称限定表名，如下表所示。  

```
create table tickit.public.test (c1) as select * from oldtable;
```
在此示例中，`tickit` 为数据库名称，`public` 为 schema 名称。如果数据库或 schema 不存在，此语句将返回错误。  
如果提供 schema 名称，则在该 schema 中创建新表（假定创建者有权访问 schema）。表名称必须是该 schema 中的唯一名称。如果未指定 schema，则可使用当前数据库 schema 创建表。如果您创建的是临时表，则无法指定 schema 名称，因为特定 schema 中存在临时表。  
如果多个同名临时表是在单独的会话中创建的，则这些同名临时表能够同时存在于同一个数据库中。这些表将分配给不同的 schemas。

 *column\_name*   
新表中的列的名称。如果没有提供列名，则采用查询的输出列名中的列名。默认列名用于表达式。有关有效名称的更多信息，请参阅[名称和标识符](r_names.md)。

BACKUP { YES \| NO }   
一个子句，指定表是否应包含在自动和手动集群快照中。  
对于不会包含关键数据的表（如暂存表），请指定 BACKUP NO 以节省在创建快照并从快照还原时的处理时间，从而减小在 Amazon Simple Storage Service 上占用的存储空间。BACKUP NO 设置不会影响数据到集群内的其他节点的自动复制，因此当发生节点故障时，指定了 BACKUP NO 的表将被还原。默认值为 BACKUP YES。  
RA3 预调配集群和 Amazon Redshift Serverless 工作组不支持无备份表。在 RA3 集群和 Serverless 工作组中标记为无备份的表将被视为永久表，在拍摄快照时将始终对其进行备份，并在从快照还原时还原该表。要避免无备份表产生快照成本，请在拍摄快照之前将其截断。

DISTSTYLE { AUTO \| EVEN \| KEY \| ALL }  
定义整个表的数据分配样式的关键词。Amazon Redshift 会根据为表指定的分配样式将表行分配给计算节点。默认值为 DISTSTYLE AUTO。  
为表选择的分配样式将影响数据库的整体性能。有关更多信息，请参阅 [用于优化查询的数据分配](t_Distributing_data.md)。  
+ AUTO：Amazon Redshift 可基于表数据指定最佳分配方式。要查看应用于表的分配方式，请查询 PG\_CLASS 系统目录表。有关更多信息，请参阅 [查看分配方式](viewing-distribution-styles.md)。
+ EVEN：表中的数据在轮询分配中跨集群中的节点均匀分布。行 ID 用来确定分配，并且为每个节点分配的行数大致相同。这是默认分配方法。
+ KEY：按 DISTKEY 列中的值分配数据。在您将联接表的联接列设置为分配键时，来自这两个表的联接行将在计算节点上并置。在并置数据时，优化程序可更高效地执行联接。如果您指定 DISTSTYLE KEY，则必须命名 DISTKEY 列。
+  ALL：向每个节点分配整个表的副本。此分配样式可确保任何联接所需的所有行在每个节点上都可用，但这将使存储要求成倍提高，并且会增加表的加载和维护次数。将 ALL 分配样式用于 KEY 分配不适用的部分维度表时会缩短执行时间，但必须针对维护成本来权衡性能改进。

DISTKEY (*column*)  
指定分配键的列名或位置号。使用在表的可选列列表或所选查询列表中指定的名称。或者，使用位置号，其中所选的第一列为 1，所选的第二列为 2，以此类推。一个表中只能有一个列可成为分配键：  
+ 如果将一个列声明为 DISTKEY 列，则必须将 DISTSTYLE 设置为 KEY 或者根本不设置 DISTSTYLE。
+ 如果未声明 DISTKEY 列，则可将 DISTSTYLE 设置为 EVEN。
+ 如果您不指定 DISTKEY 或 DISTSTYLE，CTAS 会根据 SELECT 子句的查询计划确定新表的分配样式。有关更多信息，请参阅 [继承列和表属性](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes)。
您可以将同一个列定义为分配键和排序键；此方法旨在当有问题的列为查询中的联接列时加速联接。

[ COMPOUND \| INTERLEAVED ] SORTKEY ( *column\_name* [, ... ] )  
为表指定一个或多个排序键。在数据加载到表中后，将按指定为排序键的列对数据进行排序。  
您可以选择指定 COMPOUND 或 INTERLEAVED 排序样式。默认为 COMPOUND。有关更多信息，请参阅 [排序键](t_Sorting_data.md)。  
最多可以为每个表定义 400 个 COMPOUND SORTKEY 列或 8 个 INTERLEAVED SORTKEY 列。  
如果您不指定 SORTKEY，CTAS 会根据 SELECT 子句的查询计划的新表排序键。有关更多信息，请参阅 [继承列和表属性](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes)。    
COMPOUND  
指定使用由所有列出的列构成的复合键按这些列的列出顺序对数据进行排序。当查询根据排序列的顺序扫描行时，复合排序键最有用。当查询依赖辅助排序列时，使用复合键进行排序所带来的性能好处会减少。您最多可以为每个表定义 400 个 COMPOUND SORTKEY 列。  
INTERLEAVED  
指定使用交错排序键对数据进行排序。可以为一个交错排序键最多指定 8 个列。  
交错排序为排序键中的每个列或列子集提供了相同的权重，以便查询不会依赖列在排序键中的顺序。当查询使用一个或多个辅助排序列时，交错排序会大大提高查询性能。交错排序产生的数据加载和 vacuum 操作的开销成本较低。

AS *query*   
Amazon Redshift 支持的任何查询（SELECT 语句）。