STL_DDLTEXT - Amazon Redshift

STL_DDLTEXT

捕获在系统上运行的以下 DDL 语句。

这些 DDL 语句包括以下查询和对象:

  • CREATE SCHEMA、TABLE、VIEW

  • DROP SCHEMA、TABLE、VIEW

  • ALTER SCHEMA、TABLE

另请参阅 STL_QUERYTEXTSTL_UTILITYTEXTSVL_STATEMENTTEXT。这些视图提供了在系统上运行的 SQL 命令的时间表,此历史记录非常适合用于排查问题以及创建所有系统活动的审计跟踪记录。

使用 STARTTIME 和 ENDTIME 列了解在某个给定时间段内记录了哪些语句。SQL 文本的长数据块已分为 200 个字符长的行;SEQUENCE 列标识了属于一个语句的文本片段。

STL_DDLTEXT 对所有用户可见。超级用户可以查看所有行;普通用户只能查看其自己的数据。有关更多信息,请参阅 系统表和视图中的数据可见性

此表中的部分或全部数据也可以在 SYS 监控视图 SYS_QUERY_HISTORY 中找到。SYS 监控视图中的数据经过格式化处理,便于使用和理解。我们建议您使用 SYS 监控视图进行查询。

表列

列名称 数据类型 描述
userid integer 生成该条目的用户 ID。
xid bigint 与语句关联的事务 ID。
pid integer 与语句关联的进程 ID。
label character(320) 用于运行查询的文件的名称或使用 SET QUERY_GROUP 命令定义的标签。如果查询并非基于文件或未设置 QUERY_GROUP 参数,则此字段为空。
starttime 时间戳 查询开始的时间(采用 UTC 表示)。总时间包括排队和执行时间。秒的小数部分以 6 位精度表示。例如:2009-06-12 11:29:19.131358
endtime 时间戳 查询完成的时间(采用 UTC 表示)。总时间包括排队和执行时间。秒的小数部分以 6 位精度表示。例如:2009-06-12 11:29:19.131358
sequence integer 当一个语句包含 200 多个字符时,将为该语句记录额外的行。序列 0 是第一行,1 是第二行,依此类推。
text character(200) SQL 文本,以 200 个字符递增。此字段可能包含反斜杠 (\\) 和换行符 (\n) 等特殊字符。

示例查询

以下查询将返回包含以前运行的 DDL 语句的记录。

select xid, starttime, sequence, substring(text,1,40) as text from stl_ddltext order by xid desc, sequence;

以下是显示了四个 CREATE TABLE 语句的示例输出。DDL 语句显示在 text 列,为方便阅读,该列已被截断。

xid | starttime | sequence | text ------+----------------------------+----------+------------------------------------------ 1806 | 2013-10-23 00:11:14.709851 | 0 | CREATE TABLE supplier ( s_suppkey int4 N 1806 | 2013-10-23 00:11:14.709851 | 1 | s_comment varchar(101) NOT NULL ) 1805 | 2013-10-23 00:11:14.496153 | 0 | CREATE TABLE region ( r_regionkey int4 N 1804 | 2013-10-23 00:11:14.285986 | 0 | CREATE TABLE partsupp ( ps_partkey int8 1803 | 2013-10-23 00:11:14.056901 | 0 | CREATE TABLE part ( p_partkey int8 NOT N 1803 | 2013-10-23 00:11:14.056901 | 1 | ner char(10) NOT NULL , p_retailprice nu (6 rows)

重新构造存储的 SQL

以下 SQL 列出了存储在 STL_DDLTEXT 的 text 列中的行。这些行按 xidsequence 排序。如果原始 SQL 的长度超过 200 个字符并有多个行,则 STL_DDLTEXT 可以按 sequence 包含多个行。

SELECT xid, sequence, LISTAGG(CASE WHEN LEN(RTRIM(text)) = 0 THEN text ELSE RTRIM(text) END, '') WITHIN GROUP (ORDER BY sequence) as query_statement FROM stl_ddltext GROUP BY xid, sequence ORDER BY xid, sequence;
xid | sequence | query_statement --------+-----------+----------------- 7886671 0 create external schema schema_spectrum_uddh\nfrom data catalog\ndatabase 'spectrum_db_uddh'\niam_role ''\ncreate external database if not exists; 7886752 0 CREATE EXTERNAL TABLE schema_spectrum_uddh.soccer_league\n(\n league_rank smallint,\n prev_rank smallint,\n club_name varchar(15),\n league_name varchar(20),\n league_off decimal(6,2),\n le 7886752 1 ague_def decimal(6,2),\n league_spi decimal(6,2),\n league_nspi smallint\n)\nROW FORMAT DELIMITED \n FIELDS TERMINATED BY ',' \n LINES TERMINATED BY '\\n\\l'\nstored as textfile\nLOCATION 's 7886752 2 3://mybucket-spectrum-uddh/'\ntable properties ('skip.header.line.count'='1'); ...

要重新构造存储在 STL_DDLTEXT 的 text 列中的 SQL,请运行以下 SQL 语句。它聚合了 text 列中的一个或多个段的 DDL 语句。在运行重新构造的 SQL 之前,将任何 (\n) 特殊字符替换为 SQL 客户端中的新行。以下 SELECT 语句的结果按顺序将三个行放在一起,以便在 query_statement 字段中重新构建 SQL。

SELECT LISTAGG(CASE WHEN LEN(RTRIM(text)) = 0 THEN text ELSE RTRIM(text) END) WITHIN GROUP (ORDER BY sequence) as query_statement FROM stl_ddltext GROUP BY xid, endtime order by xid, endtime;
query_statement -------------- create external schema schema_spectrum_uddh\nfrom data catalog\ndatabase 'spectrum_db_uddh'\niam_role ''\ncreate external database if not exists; CREATE EXTERNAL TABLE schema_spectrum_uddh.soccer_league\n(\n league_rank smallint,\n prev_rank smallint,\n club_name varchar(15),\n league_name varchar(20),\n league_off decimal(6,2),\n league_def decimal(6,2),\n league_spi decimal(6,2),\n league_nspi smallint\n)\nROW FORMAT DELIMITED \n FIELDS TERMINATED BY ',' \n LINES TERMINATED BY '\\n\\l'\nstored as textfile\nLOCATION 's3://mybucket-spectrum-uddh/'\ntable properties ('skip.header.line.count'='1');