STL_QUERYTEXT
捕获 SQL 命令的查询文本。
查询 STL_QUERYTEXT 视图以捕获为以下语句记录的 SQL:
-
SELECT、SELECT INTO
-
INSERT、UPDATE、DELETE
-
COPY
-
UNLOAD
-
运行 VACUUM 和 ANALYZE 生成的查询
-
CREATE TABLE AS (CTAS)
要查询某个给定时间段中针对这些语句的活动,请联接 STL_QUERYTEXT 和 STL_QUERY 视图。
注意
STL_QUERY 和 STL_QUERYTEXT 视图仅包含有关查询的信息,不包含有关其他实用工具和 DDL 命令的信息。对于有关 Amazon Redshift 运行的所有语句的列表和信息,您还可以查询 STL_DDLTEXT 和 STL_UTILITYTEXT 视图。有关 Amazon Redshift 运行的所有语句的完整列表,您可以查询 SVL_STATEMENTTEXT 视图。
另请参阅 STL_DDLTEXT、STL_UTILITYTEXT 和 SVL_STATEMENTTEXT。
STL_QUERYTEXT 对所有用户可见。超级用户可以查看所有行;普通用户只能查看其自己的数据。有关更多信息,请参阅 系统表和视图中的数据可见性。
此表中的部分或全部数据也可以在 SYS 监控视图 SYS_QUERY_TEXT 中找到。SYS 监控视图中的数据经过格式化处理,便于使用和理解。我们建议您使用 SYS 监控视图进行查询。
表列
列名称 | 数据类型 | 描述 |
---|---|---|
userid | integer | 生成该条目的用户 ID。 |
xid | bigint | 事务 ID。 |
pid | integer | 进程 ID。一般情况下,会话中的所有查询在同一进程中运行,因此,如果您在同一会话中运行一系列查询,则此值通常保持不变。在特定的内部事件之后,Amazon Redshift 可能会重新启动一个活动会话并分配新的 PID。有关更多信息,请参阅 STL_RESTARTED_SESSIONS。您可以使用此列联接到 STL_ERROR 视图。 |
query | integer | 查询 ID。查询列可用于连接其他系统表和视图。 |
sequence | integer | 当一个语句包含 200 多个字符时,将为该语句记录额外的行。序列 0 是第一行,1 是第二行,依此类推。 |
text | character(200) | SQL 文本,以 200 个字符递增。此字段可能包含反斜杠 (\\ ) 和换行符 (\n ) 等特殊字符。 |
示例查询
您可以使用 PG_BACKEND_PID() 函数检索当前会话的信息。例如,以下查询返回当前会话中完成的查询的查询 ID 和一部分查询文本。
select query, substring(text,1,60) from stl_querytext where pid = pg_backend_pid() order by query desc; query | substring -------+-------------------------------------------------------------- 28262 | select query, substring(text,1,80) from stl_querytext where 28252 | select query, substring(path,0,80) as path from stl_unload_l 28248 | copy category from 's3://dw-tickit/manifest/category/1030_ma 28247 | Count rows in target table 28245 | unload ('select * from category') to 's3://dw-tickit/manifes 28240 | select query, substring(text,1,40) from stl_querytext where (6 rows)
重新构造存储的 SQL
要重新构造存储在 STL_QUERYTEXT 的text
列中的 SQL,请运行 SELECT 语句,以从 text
列中的一个或多个部分创建 SQL。在运行重新构造的 SQL 之前,将任何 (\n
) 特殊字符替换为新行。以下 SELECT 语句的结果是 query_statement
字段中重新构造的 SQL 的行。
SELECT query, LISTAGG(CASE WHEN LEN(RTRIM(text)) = 0 THEN text ELSE RTRIM(text) END) WITHIN GROUP (ORDER BY sequence) as query_statement, COUNT(*) as row_count FROM stl_querytext GROUP BY query ORDER BY query desc;
例如,以下查询选择 3 列。查询本身超过 200 个字符,并存储在 STL_QUERYTEXT 中的几个部分内。
select 1 AS a0123456789012345678901234567890123456789012345678901234567890, 2 AS b0123456789012345678901234567890123456789012345678901234567890, 3 AS b012345678901234567890123456789012345678901234 FROM stl_querytext;
在此示例中,查询存储在 STL_QUERYTEXT 的 text
列的 2 个部分(行)中。
select query, sequence, text from stl_querytext where query=pg_last_query_id() order by query desc, sequence limit 10;
query | sequence | text -------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 45 | 0 | select\n1 AS a0123456789012345678901234567890123456789012345678901234567890,\n2 AS b0123456789012345678901234567890123456789012345678901234567890,\n3 AS b012345678901234567890123456789012345678901234 45 | 1 | \nFROM stl_querytext;
要重新构造存储在 STL_QUERYTEXT 中的 SQL,请运行以下 SQL。
select LISTAGG(CASE WHEN LEN(RTRIM(text)) = 0 THEN text ELSE RTRIM(text) END, '') within group (order by sequence) AS text from stl_querytext where query=pg_last_query_id();
要在客户端中使用生成的重新构造的 SQL,需将任何 (\n
) 特殊字符替换为新行。
text ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ select\n1 AS a0123456789012345678901234567890123456789012345678901234567890,\n2 AS b0123456789012345678901234567890123456789012345678901234567890,\n3 AS b012345678901234567890123456789012345678901234\nFROM stl_querytext;