SVL_STATEMENTTEXT - Amazon Redshift

SVL_STATEMENTTEXT

使用 SVL_STATEMENTTEXT 视图获取已在系统上运行的所有 SQL 命令的完整记录。

SVL_STATEMENTTEXT 视图包含 STL_DDLTEXTSTL_QUERYTEXTSTL_UTILITYTEXT 表中所有行的联合。此外,此视图还包含到 STL_QUERY 表的联接。

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

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

表列

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

示例查询

下面的查询返回在 2009 年 6 月 16 日运行的 DDL 语句:

select starttime, type, rtrim(text) from svl_statementtext where starttime like '2009-06-16%' and type='DDL' order by starttime asc; starttime | type | rtrim ---------------------------|------|-------------------------------- 2009-06-16 10:36:50.625097 | DDL | create table ddltest(c1 int); 2009-06-16 15:02:16.006341 | DDL | drop view alltickitjoin; 2009-06-16 15:02:23.65285 | DDL | drop table sales; 2009-06-16 15:02:24.548928 | DDL | drop table listing; 2009-06-16 15:02:25.536655 | DDL | drop table event; ...

重新构造存储的 SQL

要重新构造存储在 SVL_STATEMENTTEXT 的 text 列中的 SQL,请运行 SELECT 语句,以从 text 列中的一个或多个部分创建 SQL。在运行重新构造的 SQL 之前,将任何 (\n) 特殊字符替换为新行。以下 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 SVL_STATEMENTTEXT where pid=pg_backend_pid();

例如,以下查询选择 3 列。查询本身超过 200 个字符,并存储在 SVL_STATEMENTTEXT 中的多个部分内。

select 1 AS a0123456789012345678901234567890123456789012345678901234567890, 2 AS b0123456789012345678901234567890123456789012345678901234567890, 3 AS b012345678901234567890123456789012345678901234 FROM stl_querytext;

在此示例中,查询存储在 SVL_STATEMENTTEXT 的 text 列的 2 个部分(行)中。

select sequence, text from SVL_STATEMENTTEXT where pid = pg_backend_pid() order by starttime, sequence;
sequence | text ----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0 | select\n1 AS a0123456789012345678901234567890123456789012345678901234567890,\n2 AS b0123456789012345678901234567890123456789012345678901234567890,\n3 AS b012345678901234567890123456789012345678901234 1 | \nFROM stl_querytext;

要重新构造存储在 STL_STATEMENTTEXT 中的 SQL,请运行以下 SQL。

select LISTAGG(CASE WHEN LEN(RTRIM(text)) = 0 THEN text ELSE RTRIM(text) END, '') within group (order by sequence) AS text from SVL_STATEMENTTEXT where pid=pg_backend_pid();

要在客户端中使用生成的重新构造的 SQL,需将任何 (\n) 特殊字符替换为新行。

text ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ select\n1 AS a0123456789012345678901234567890123456789012345678901234567890,\n2 AS b0123456789012345678901234567890123456789012345678901234567890,\n3 AS b012345678901234567890123456789012345678901234\nFROM stl_querytext;