

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 缓存表
<a name="sql-commands-cache-table"></a>

CACHE TABLE 命令可以缓存现有表的数据或创建并缓存包含查询结果的新表。

**注意**  
缓存的数据将在整个查询中保留。

语法、参数和一些示例来自 [Apache Spark SQL 参考](https://spark.apache.org/docs/latest/api/sql/)。

## 语法
<a name="CACHE-TABLE-syntax"></a>

CACHE TABLE 命令支持三种语法模式：

使用 AS（不带括号）：根据查询结果创建并缓存新表。

```
CACHE TABLE cache_table_identifier AS query;
```

带有 AS 和圆括号：函数与第一种语法类似，但使用圆括号对查询进行显式分组。

```
CACHE TABLE cache_table_identifier AS ( query );
```

不使用 AS：缓存现有表，使用 SELECT 语句筛选要缓存的行。

```
CACHE TABLE cache_table_identifier query; 
```

其中：
+ 所有语句都应以分号 (;) 结尾
+ `query`通常是一个 SELECT 语句
+ 对于 AS，查询周围的括号是可选的
+ AS 关键字是可选的

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

 *缓存表标识符*   
缓存表的名称。可以包括可选的数据库名称限定符。

 *AS*   
根据查询结果创建和缓存新表时使用的关键字。

*query*  
定义要缓存的数据的 SELECT 语句或其他查询。

## 示例
<a name="CACHE-TABLE-examples"></a>

在以下示例中，缓存的表将在整个查询中保留。缓存后，引用的后续查询*cache\$1table\$1identifier*将从缓存的版本中读取，而不是重新计算或从中*sourceTable*读取。这可以提高经常访问的数据的查询性能。

### 根据查询结果创建并缓存经过筛选的表
<a name="create-cache-filterd-table"></a>

第一个示例演示如何根据查询结果创建和缓存新表。此命令在`SELECT`语句周围使用不带括号的`AS`关键字。它会创建一个名为 “`cache_table_identifier`” 的新表，其中仅包含状态为 `sourceTable` “” 的 “” 中的行`active'`。它运行查询，将结果存储在新表中，并缓存新表的内容。原始 “`sourceTable`” 保持不变，后续查询必须引用 “`cache_table_identifier`” 才能使用缓存的数据。

```
CACHE TABLE cache_table_identifier AS
    SELECT * FROM sourceTable 
    WHERE status = 'active';
```

### 使用带括号的 SELECT 语句缓存查询结果
<a name="cache-query-results"></a>

第二个示例演示如何使用括号将查询结果缓存为具有指定名称 (`cache_table_identifier`) 的新表。`SELECT`此命令创建一个名为 “`cache_table_identifier`” 的新表，其中仅包含状态为 “`sourceTable`” 的 “” 中的行`active'`。它运行查询，将结果存储在新表中，并缓存新表的内容。原来的 “`sourceTable`” 保持不变。后续查询必须引用 `cache_table_identifier` “” 才能使用缓存的数据。

```
CACHE TABLE cache_table_identifier AS (
    SELECT * FROM sourceTable 
    WHERE status = 'active'
);
```

### 使用筛选条件缓存现有表
<a name="cache-existing-table"></a>

第三个示例演示如何使用不同的语法缓存现有表。此语法省略了 “`AS`” 关键字和圆括号，通常从名为 “`cache_table_identifier`” 的现有表中缓存指定行，而不是创建新表。该`SELECT`语句充当筛选器，用于确定要缓存哪些行。

**注意**  
此语法的确切行为因数据库系统而异。请务必验证您的特定 AWS 服务的语法是否正确。

```
CACHE TABLE cache_table_identifier 
SELECT * FROM sourceTable 
WHERE status = 'active';
```