

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

# 查询系统表和视图
<a name="t_querying_redshift_system_tables"></a>

除了您创建的表以外，您的数据仓库还包含多个系统表和视图。这些表和视图包含有关您的安装以及系统上运行的各种查询和进程的信息。您可以查询这些系统表和视图来收集有关数据库的信息。有关更多信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的[系统表和视图参考](https://docs.aws.amazon.com/redshift/latest/dg/cm_chap_system-tables.html)。每个表或视图的说明指出了表或视图是对所有用户可见还是只对超级用户可见。以超级用户身份登录以查询只对超级用户可见的表。

## 查看表名称列表
<a name="t_querying_redshift_system_tables-view-a-list-of-table-names"></a>

要查看 schema 中所有表的列表，您可以查询 PG\$1TABLE\$1DEF 系统目录表。您可以首先检查 `search_path` 的设置。

```
SHOW search_path;
```

结果应如下所示：

```
  search_path
---------------
 $user, public
```

以下示例将 `SALES` schema 添加到搜索路径并显示 `SALES` schema 中的所有标。

```
set search_path to '$user', 'public', 'sales';
                
SHOW search_path;

      search_path       
------------------------
 "$user", public, sales


select * from pg_table_def where schemaname = 'sales';

 schemaname | tablename |  column  |          type          | encoding | distkey | sortkey | notnull 
------------+-----------+----------+------------------------+----------+---------+---------+---------
 sales      | demo      | personid | integer                | az64     | f       |       0 | f
 sales      | demo      | city     | character varying(255) | lzo      | f       |       0 | f
```

以下示例显示当前数据库上所有 schema 中的所有称为 `DEMO` 的表的列表。

```
set search_path to '$user', 'public', 'sales';
select * from pg_table_def where tablename = 'demo';

 schemaname | tablename |  column  |          type          | encoding | distkey | sortkey | notnull 
------------+-----------+----------+------------------------+----------+---------+---------+---------
 public     | demo      | personid | integer                | az64     | f       |       0 | f
 public     | demo      | city     | character varying(255) | lzo      | f       |       0 | f
 sales      | demo      | personid | integer                | az64     | f       |       0 | f
 sales      | demo      | city     | character varying(255) | lzo      | f       |       0 | f
```

有关更多信息，请参阅 [PG\$1TABLE\$1DEF](https://docs.aws.amazon.com/redshift/latest/dg/r_PG_TABLE_DEF.html)。

您还可以使用 Amazon Redshift 查询编辑器 v2 查看指定架构中的所有表，方法是首先选择要连接到的数据库。

## 查看用户
<a name="t_querying_redshift_system_tables-view-database-users"></a>

您可以查询 PG\$1USER 目录来查看所有用户的列表，还可以查看用户 ID (USESYSID) 和用户权限。

```
SELECT * FROM pg_user;

  usename   | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil | useconfig
------------+----------+-------------+----------+-----------+----------+----------+-----------
 rdsdb      |        1 | true        | true     | true      | ******** | infinity |
 awsuser    |      100 | true        | true     | false     | ******** |          |
 guest      |      104 | true        | false    | false     | ******** |          |
```

Amazon Redshift 在内部使用用户名称 `rdsdb` 执行日常管理和维护任务。您可以向 SELECT 语句添加 `where usesysid > 1` 来筛选查询，使其只显示用户定义的用户名称。

```
SELECT * FROM pg_user WHERE usesysid > 1;

  usename   | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil | useconfig
------------+----------+-------------+----------+-----------+----------+----------+-----------
 awsuser    |      100 | true        | true     | false     | ******** |          |
 guest      |      104 | true        | false    | false     | ******** |          |
```

## 查看最近的查询
<a name="t_querying_redshift_system_tables-view-recent-queries"></a>

在上一示例中，`adminuser` 的用户 ID（user\$1id）为 100。要列出 `adminuser` 最近运行的四次查询，您可以查询 SYS\$1QUERY\$1HISTORY 视图。

您可以使用此视图查找最近运行的查询的查询 ID（query\$1id）或进程 ID（session\$1id）。您还可以使用此视图检查完成查询花了多长时间。SYS\$1QUERY\$1HISTORY 包含查询字符串（query\$1text）的前 4000 个字符，以便帮助您查找特定查询。在 SELECT 语句中使用 LIMIT 字句来限制结果数量。

```
SELECT query_id, session_id, elapsed_time, query_text 
FROM sys_query_history
WHERE user_id = 100
ORDER BY start_time desc
LIMIT 4;
```

结果看起来如下所示。

```
 query_id |  session_id  |  elapsed_time |   query_text
----------+--------------+---------------+----------------------------------------------------------------
 892      |    21046     |       55868   | SELECT query, pid, elapsed, substring from ...
 620      |    17635     |     1296265   | SELECT query, pid, elapsed, substring from ...
 610      |    17607     |       82555   | SELECT * from DEMO; 
 596      |    16762     |      226372   | INSERT INTO DEMO VALUES (100);
```

## 确定运行的查询的会话 ID
<a name="determine_pid"></a>

要检索关于该查询的系统表信息，您可能需要指定与查询关联的会话 ID（进程 ID）。或者，您可能需要查找仍在运行的查询的会话 ID。例如，如果您需要取消在预置集群上运行时间过长的查询，就需要会话 ID。您可以通过查询 STV\$1RECENTS 系统表获取正在运行的查询的会话 ID 列表，以及相应的查询字符串。如果查询返回多个会话，您可以通过查看查询文本确定所需会话 ID。

要确定正在运行的查询的会话 ID，请运行以下 SELECT 语句。

```
SELECT session_id, user_id, start_time, query_text
FROM sys_query_history
WHERE status='running';
```