STL_DDLTEXT - Amazon Redshift

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

STL_DDLTEXT

システムで実行された以下の DDL ステートメントを取得します。

これらの DDL ステートメントには、以下のクエリとオブジェクトが含まれます。

  • CREATE SCHEMA、TABLE、VIEW

  • DROP SCHEMA、TABLE、VIEW

  • ALTER SCHEMA、TABLE

STL_QUERYTEXTSTL_UTILITYTEXTSVL_STATEMENTTEXT も参照してください。これらのビューは、システムで実行されるSQLコマンドのタイムラインを提供します。この履歴は、トラブルシューティングの目的や、すべてのシステム アクティビティの監査証跡の作成に役立ちます。

STARTTIME および ENDTIME 列を使用すると、一定の時間内に記録されたステートメントがわかります。SQL テキストの長いブロックは、200 文字の長さに分割されます。SEQUENCE 列により、1 つのステートメントに属する複数のフラグメントのテキストを識別できます。

このビュー はすべてのユーザーに表示されます。スーパーユーザーはすべての行を表示できます。通常のユーザーは自分のデータのみを表示できます。詳細については、「Visibility of data in system tables and views」を参照してください。

テーブルの列

列名 データ型 説明
userid integer エントリを生成したユーザーの ID。
xid bigint ステートメントに関連付けられるトランザクション ID。
pid integer ステートメントに関連付けられるプロセス ID。
label character(320) クエリの実行に使用されるファイルの名前、または SET QUERY_GROUP コマンドで定義されるラベル。クエリがファイルベースでないか、QUERY_GROUP パラメータが設定されていない場合、このフィールドは空になります。
starttime timestamp UTC で表されたクエリの実行開始時刻。秒の小数部の精度(6 桁)を使用します。例: 2009-06-12 11:29:19.131358.
endtime timestamp UTC で表されたクエリの実行終了時刻。秒の小数部の精度(6 桁)を使用します。例: 2009-06-12 11:29:19.131358.
sequence integer 1 つのステートメントに含まれる文字数が 200 を超える場合、そのステートメントは追加の行に記録されます。シーケンス 0 が最初の行、1 が 2 番目の行、という順番です。
text character(200) 200 文字単位の SQL テキスト。このフィールドには、バックスラッシュ (\\) や改行 (\n) などの特殊文字が含まれる場合があります。

サンプルクエリ

次のクエリは、4 つの CREATE TABLE ステートメントの DDL を表示します。DDL のテキスト列は、読みやすくするために切り詰められています。

select xid, starttime, sequence, substring(text,1,40) as text from stl_ddltext order by xid desc, sequence; xid | starttime | sequence | text ------+----------------------------+----------+------------------------------------------ 1806 | 2013-10-23 00:11:14.709851 | 0 | CREATE TABLE supplier ( s_suppkey int4 N 1806 | 2013-10-23 00:11:14.709851 | 1 | s_comment varchar(101) NOT NULL ) 1805 | 2013-10-23 00:11:14.496153 | 0 | CREATE TABLE region ( r_regionkey int4 N 1804 | 2013-10-23 00:11:14.285986 | 0 | CREATE TABLE partsupp ( ps_partkey int8 1803 | 2013-10-23 00:11:14.056901 | 0 | CREATE TABLE part ( p_partkey int8 NOT N 1803 | 2013-10-23 00:11:14.056901 | 1 | ner char(10) NOT NULL , p_retailprice nu (6 rows)

ストアド SQL の再構築

STL_DDLTEXT の text 列に保存されている SQL を再構築するには、SELECT ステートメントを実行して、text 列の 1 つ以上の部分から 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_ddltext GROUP BY query ORDER BY query desc;

たとえば、次のクエリはいくつかの DDL ステートメントを実行します。クエリ自体は 200 文字より長く、STL_DDLTEXT のいくつかの部分に保存されます。

DROP TABLE IF EXISTS public.t_tx_trunc; CREATE TABLE public.t_tx_trunc(a varchar); CREATE OR REPLACE PROCEDURE public.sp_truncate_top_level() LANGUAGE plpgsql AS $$ DECLARE row_cnt int; BEGIN INSERT INTO public.t_tx_trunc VALUES ('Insert in SP: Before Truncate 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'); select count(*) into row_cnt from public.t_tx_trunc; RAISE INFO 'sp_truncate_top_level: RowCount after 1st Insert: %', row_cnt; truncate table public.t_tx_trunc; select count(*) into row_cnt from public.t_tx_trunc; RAISE INFO 'sp_truncate_top_level: RowCount After Truncate: %', row_cnt; INSERT INTO public.t_tx_trunc VALUES ('Insert 1 in SP: After Truncate'); select count(*) into row_cnt from public.t_tx_trunc; RAISE INFO 'sp_truncate_top_level: RowCount after 2nd Insert: %', row_cnt; INSERT INTO public.t_tx_trunc VALUES ('Insert 2 in SP: After Truncate'); select count(*) into row_cnt from public.t_tx_trunc; RAISE INFO 'sp_truncate_top_level: RowCount after 3rd Insert: %', row_cnt; END $$; DROP PROCEDURE sp_truncate_top_level(); DROP TABLE IF EXISTS public.t_tx_trunc;

この例では、クエリは STL_DDLTEXT の text 列の多くの部分 (行) に保存されます。

select starttime, sequence, text from stl_ddltext where query=pg_last_query_id() order by starttime, sequence limit 10;
starttime | sequence | text ----------------------------+----------+------------------------------------------------------------------------------------------------------------------------- 2019-07-23 23:08:15.672457 | 0 | DROP TABLE IF EXISTS public.t_tx_trunc; 2019-07-23 23:08:15.676281 | 0 | CREATE TABLE public.t_tx_trunc(a varchar); 2019-07-23 23:08:15.727303 | 0 | CREATE OR REPLACE PROCEDURE public.sp_truncate_top_level()\nLANGUAGE plpgsql\nAS $$\nDECLARE\n row_cnt int;\nBEGIN\n INSERT INTO public.t_tx_trunc VALUES ('Insert in SP: Before Truncate 000000000 2019-07-23 23:08:15.727303 | 1 | 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');\n select count(*) into row_cnt from public.t 2019-07-23 23:08:15.727303 | 2 | _tx_trunc;\n RAISE INFO 'sp_truncate_top_level: RowCount after 1st Insert: %', row_cnt;\n truncate table public.t_tx_trunc;\n select count(*) into row_cnt from public.t_tx_trunc;\n RAISE INFO 'sp_ 2019-07-23 23:08:15.727303 | 3 | truncate_top_level: RowCount After Truncate: %', row_cnt;\n INSERT INTO public.t_tx_trunc VALUES ('Insert 1 in SP: After Truncate');\n select count(*) into row_cnt from public.t_tx_trunc;\n RAISE I 2019-07-23 23:08:15.727303 | 4 | NFO 'sp_truncate_top_level: RowCount after 2nd Insert: %', row_cnt;\n INSERT INTO public.t_tx_trunc VALUES ('Insert 2 in SP: After Truncate');\n select count(*) into row_cnt from public.t_tx_trunc; 2019-07-23 23:08:15.727303 | 5 | \n RAISE INFO 'sp_truncate_top_level: RowCount after 3rd Insert: %', row_cnt;\nEND\n$$; 2019-07-23 23:08:15.76039 | 0 | DROP PROCEDURE sp_truncate_top_level(); 2019-07-23 23:08:16.454956 | 0 | DROP TABLE IF EXISTS public.t_tx_trunc;

STL_DDLTEXT に保存された SQL を再構築するには、次の SQL を実行します。

SELECT LISTAGG(CASE WHEN LEN(RTRIM(text)) = 0 THEN text ELSE RTRIM(text) END) WITHIN GROUP (ORDER BY sequence) as query_statement FROM stl_ddltext GROUP BY xid order by xid;

再構築された SQL をクライアントで使用するには、特殊文字 (\n) を改行に置き換えます。

query_statement --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- DROP TABLE IF EXISTS public.t_tx_trunc; CREATE TABLE public.t_tx_trunc(a varchar); CREATE OR REPLACE PROCEDURE public.sp_truncate_top_level()\nLANGUAGE plpgsql\nAS $$\nDECLARE\n row_cnt int;\nBEGIN\n INSERT INTO public.t_tx_trunc VALUES ('Insert in SP: Before Truncate 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000');\n select count(*) into row_cnt from public.t_tx_trunc;\n RAISE INFO 'sp_truncate_top_level: RowCount after 1st Insert: %', row_cnt;\n truncate table public.t_tx_trunc;\n select count(*) into row_cnt from public.t_tx_trunc;\n RAISE INFO 'sp_truncate_top_level: RowCount After Truncate: %', row_cnt;\n INSERT INTO public.t_tx_trunc VALUES ('Insert 1 in SP: After Truncate');\n select count(*) into row_cnt from public.t_tx_trunc;\n RAISE INFO 'sp_truncate_top_level: RowCount after 2nd Insert: %', row_cnt;\n INSERT INTO public.t_tx_trunc VALUES ('Insert 2 in SP: After Truncate');\n select count(*) into row_cnt from public.t_tx_trunc;\n RAISE INFO 'sp_truncate_top_level: RowCount after 3rd Insert: %', row_cnt;\nEND\n$$; DROP PROCEDURE sp_truncate_top_level(); DROP TABLE IF EXISTS public.t_tx_trunc;