SVL_STATEMENTTEXT
使用 SVL_STATEMENTTEXT 视图获取已在系统上运行的所有 SQL 命令的完整记录。
SVL_STATEMENTTEXT 视图包含 STL_DDLTEXT、STL_QUERYTEXT、STL_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 语句的类型:QUERY 、DDL 或 UTILITY 。 |
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;