STL_QUERYTEXT - Amazon Redshift

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_DDLTEXTSTL_UTILITYTEXTSVL_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;