任务 6:查询系统表 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

任务 6:查询系统表

除了您创建的表以外,您的数据库还包含很多系统表。这些系统表包含有关您的安装以及系统上运行的各种查询和进程的信息。您可以查询这些系统表来收集有关数据库的信息。

注意

本文档中每个表的说明指出了表是对所有用户可见还是只对超级用户可见。以超级用户身份登录以查询只对超级用户可见的表。

Amazon Redshift 提供了对以下类型的系统表的访问:

  • STL 表

    这些系统表是从 Amazon Redshift 日志文件生成的,用于提供系统历史记录。日志记录表具有 STL 前缀。

  • STV 表

    这些表是虚拟系统表,包含当前系统数据的快照。快照表具有 STV 前缀。

  • 系统视图

    系统视图包含一些 STL 和 STV 系统表中的数据的子集。系统视图具有 SVV 或 SVL 前缀。

  • 系统目录表

    系统目录表存储 schema 元数据,例如有关表和列的信息。系统目录表具有 PG 前缀。

您可能需要指定与查询关联的进程 ID 才能检索关于该查询的系统表信息。有关更多信息,请参阅确定运行的查询的进程 ID

查看表名称列表

要查看 schema 中所有表的列表,您可以查询 PG_TABLE_DEF 系统目录表。您可以首先检查 search_path 的设置。

SHOW search_path;

结果应如下所示:

search_path --------------- $user, public (1 row)

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

set search_path to '$user', 'public', 'sales'; SHOW search_path; search_path ------------------------ "$user", public, sales (1 row) 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 (2 rows)

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

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 (4 rows)

有关更多信息,请参阅 PG_TABLE_DEF

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

查看用户

您可以查询 PG_USER 目录来查看所有用户的列表,还可以查看用户 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 | ******** | | (3 rows)

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 | ******** | | (2 rows)

查看最近的查询

在上一示例中,adminuser 的用户 ID (USESYSID) 为 100。要列出 adminuser 最近运行的五次查询,您可以查询 SVL_QLOG 视图。

SVL_QLOG 视图是来自 STL_QUERY 表的信息的更友好子集。您可以使用此视图查找最近运行的查询的查询 ID (QUERY) 或进程 ID (PID)。您还可以使用此视图检查完成查询花了多长时间。SVL_QLOG 包含查询字符串 (SUBSTRING) 的前 60 个字符来帮助您定位特定查询。带 LIMIT 子句使用 SELECT 语句可将结果限制为五行。

SELECT query, pid, elapsed, substring from svl_qlog WHERE userid = 100 ORDER BY starttime desc LIMIT 4;

结果看起来如下所示。

query| pid | elapsed | substring ------+-------+----------+---------------------------------------------------------------- 892 | 21046 | 55868 | SELECT query, pid, elapsed, substring from svl_qlog WHERE us 620 | 17635 | 1296265 | SELECT query, pid, elapsed, substring from svl_qlog WHERE us 610 | 17607 | 82555 | SELECT * from DEMO; 596 | 16762 | 226372 | INSERT INTO DEMO VALUES (100);)