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。請先以新的一行取代任意 (\n) 特殊字元,再執行重建的 SQL。下列 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;