

 从补丁 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/)。

# ANALYZE
<a name="r_ANALYZE"></a>

更新表统计数据以供查询计划程序使用。

## 所需的权限
<a name="r_ANALYZE-privileges"></a>

以下是 ANALYZE 所需的权限：
+ Superuser
+ 具有 ANALYZE 权限的用户
+ 关系的拥有者
+ 向其共享表的数据库拥有者

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

```
ANALYZE [ VERBOSE ]
[ [ table_name [ ( column_name [, ...] ) ] ]
[ PREDICATE COLUMNS | ALL  COLUMNS ]
```

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

VERBOSE   
返回有关 ANALYZE 操作的进度信息消息的子句。在不指定表时，此选项会非常有用。

 *table\$1name*   
您可以分析特定表，包括临时表。您可以通过其 schema 名称来限定表。您可以视需要指定 table\$1name 来分析单个表。您不能在单个 *ANALYZE table\$1name* 语句中指定多个 *table\$1name*。如果您不指定 *table\$1name* 值，则将分析当前连接的数据库中的所有表，包括系统目录中的持久性表。如果自上次执行 ANALYZE 以来更改的行数百分比低于分析阈值，Amazon Redshift 将跳过对表的分析。有关更多信息，请参阅 [分析阈值](#r_ANALYZE-threshold)。  
您不需要分析 Amazon Redshift 系统表（STL 和 STV 表）。

 *column\$1name*   
如果您指定 *table\$1name*，您还可以指定表中的一个或多个列（以两旁加括号的逗号分隔列表的形式）。如果指定了列列表，则只分析列出的列。

 PREDICATE COLUMNS \$1 ALL COLUMNS   
用于指示 ANALYZE 是否应仅包含谓词列的子句。指定 PREDICATE COLUMNS 以仅分析在以前查询中用作谓词的列或可能用作谓词的候选列。指定 ALL COLUMNS 将分析所有列。默认值为 ALL COLUMNS。  
如果以下任意一项为 true，则列包括在一组谓词列中。  
+ 该列已在查询中用作筛选条件、联接条件或 group by 子句的一部分。
+ 该列为分配键。
+ 该列为排序键的一部分。
如果未将任何列标记为谓词列（例如，由于尚未查询表），则即使指定了 PREDICATE COLUMNS，也仍将分析所有列。发生这种情况时，Amazon Redshift 可能会回复一条消息，例如，对于“*table-name*”找不到谓词列。请分析所有列。有关谓词列的更多信息，请参阅[分析表](t_Analyzing_tables.md)。

## 使用说明
<a name="r_ANALYZE-usage-notes"></a>

Amazon Redshift 自动对使用以下命令创建的表运行 ANALYZE：
+ CREATE TABLE AS
+ CREATE TEMP TABLE AS 
+ SELECT INTO

 您无法分析外部表。

在最初创建这些表时，您不需要对这些表运行 ANALYZE 命令。如果修改了这些表，则应通过用来分析其他表的方式来分析这些表。

### 分析阈值
<a name="r_ANALYZE-threshold"></a>

为了减少处理时间并提高整体系统性能，在自上次运行 ANALYZE 命令以来更改的行数百分比低于 [analyze\$1threshold\$1percent](r_analyze_threshold_percent.md) 参数所指定分析阈值的情况下，Amazon Redshift 将跳过对表执行的 ANALYZE 操作。默认情况下，`analyze_threshold_percent` 为 10。要更改当前会话的 `analyze_threshold_percent`，请执行 [SET](r_SET.md) 命令。以下示例将 `analyze_threshold_percent` 更改为 20%。

```
set analyze_threshold_percent to 20;
```

要在仅有少量行发生更改时对表进行分析，请将 `analyze_threshold_percent` 设置为任意较小的数字。例如，如果您将 `analyze_threshold_percent` 设置为 0.01，则在含有 100000000 行的表中至少有 10000 行发生更改时，不会跳过该表。

```
set analyze_threshold_percent to 0.01;
```

如果 ANALYZE 因未达到分析阈值而跳过表，Amazon Redshift 将返回以下消息。

```
ANALYZE SKIP
```

要在即使没有任何行发生更改时仍对所有表进行分析，请将 `analyze_threshold_percent` 设置为 0。

要查看 ANALYZE 操作的结果，请查询 [STL\$1ANALYZE](r_STL_ANALYZE.md) 系统表。

有关分析表的更多信息，请参阅[分析表](t_Analyzing_tables.md)。

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

分析 TICKIT 数据库中的所有表，并返回进度信息。

```
analyze verbose;
```

只分析 LISTING 表。

```
analyze listing;
```

分析 VENUE 表中的 VENUEID 和 VENUENAME 列。

```
analyze venue(venueid, venuename);
```

仅分析 VENUE 表中的谓词列。

```
analyze venue predicate columns;
```