STL_QUERYTEXT - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

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

此视图 对所有用户可见。超级用户可以查看所有行;普通用户只能看到自己的数据。有关更多信息,请参阅 Visibility of data in system tables and views

Table columns

列名称 数据类型 Description
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) 等特殊字符。

Sample queries

您可以使用 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)

Reconstructing stored 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;