Amazon Redshift の複数システムテーブルとビューにわたり、クエリ ID を照合したいと考えています。
簡単な説明
query_id 列は、SYS_QUERY_HISTORY を含む SYS ビュー のクエリ ID として使用できます。STL_QUERY を含む STL/SVL テーブルとビューでは、query 列をクエリ ID に使用できます。query 列では、Amazon Redshift が元のクエリを処理する際に生成する、書き換えられた子クエリを識別します。詳細については、「SYS 監視ビューを使用してクエリ識別子の追跡を強化する」を参照してください。
解決策
システムテーブルへのアクセス許可を付与する
Amazon Redshift のシステムテーブル間でクエリ ID を照合するユーザーは、スーパーユーザーであるか、必要な権限を持っている必要があります。特定のユーザーにアクセス許可を付与する方法については、「システムテーブルとビューにおけるデータの可視性」を参照してください。
特定のユーザーにアクセス許可を付与し、システム定義のロールを割り当てるには、次のコマンドを実行します。
GRANT ROLE sys:monitor TO database_user;
注: database_user を実際のデータベースユーザーに置き換えてください。
クエリ ID を関連付ける
Amazon Redshift は、query_id 列と query の完全な照合を行わない場合があります。ただし、SYS および STL/SVL テーブル間で潜在的な照合を検索できます。
SYS の query_id を使用し、次のクエリで STL/SVL 内のクエリ ID を取得します。
SELECT query_id, query FROM sys_query_history a, stl_query b
WHERE a.query_id = <query_id>
AND a.transaction_id = b.xid
AND b.starttime BETWEEN a.start_time AND a.end_time
AND b.endtime BETWEEN a.start_time AND a.end_time;
注: SYS_QUERY_HISTORY にはリーダーノードでのみ実行されるクエリが存在しますが、STL_QUERY ではこれらのクエリは除外されます。
STL/SVL のクエリを使用し、次のクエリで SYS 内のクエリ ID を取得します。
SELECT query_id, query FROM sys_query_history a, stl_query b
WHERE b.query = <query>
AND a.transaction_id = b.xid
AND b.starttime BETWEEN a.start_time AND a.end_time
AND b.endtime BETWEEN a.start_time AND a.end_time;
同じ SQL ステートメントに関するクエリ履歴を特定します。
これらのクエリの出力は、さまざまなクエリ実行を比較する際に便利です。SYS_QUERY_HISTORY で異なる時間に実行された同一のクエリを特定するには、次のクエリを使用して user_query_hash 値および、対応するエントリを取得します。
SELECT user_query_hash FROM sys_query_history
WHERE query_id = <query_id>;
SELECT *
FROM sys_query_history
WHERE user_query_hash = '<user_query_hash>';
関連情報
クエリプランと実行ワークフロー