TableauでRedshiftにつなぎにいっていろいろ確認しているときに、Tableauが発行しているSQLを確認したいときがあります。例えば以下の場合です。
- psqlでRedshiftにつなぎにいくときに、長ったらしい、JOINをかくのが面倒なので、TableauでGUI上で作成してものを流用したい
- Tableauが意図した通りのSQLを発行しているか確認したい
上記のような場合にポイントとなるのは、 どこでRedshiftは発行したクエリを保持しているのか と、 Tableauはどのようにクエリを発行しているか ということです。
どこでRedshiftは発行したクエリを保持しているのか
svl_statementtext のテーブルにシステムで実行されたすべての SQL コマンドが入っています。
ただ、このテーブルは長いSQLは200文字で分割されて別々のレコードに格納されているので、文字列を結合する必要があります。
Tableauはどのようにクエリを発行しているか
Tableauはcursorを発行してクエリを取得しています。例えば、SQL_CUR0x7ffeb2f68c60という名前のカーソルを宣言し、fetch文を発行しレコードを取得しています。以下が例です。
fetch 1000 in "SQL_CUR0x7ffeb2f68c60"
CursorはDECLAREで宣言するので、その場所を特定できれば発行しているSELECT文が分かりそうです。
結局どのようにすればいい?
以下でいけます。SQL_CUR0x7ffeb2f68c60の部分は適宜、Tableauが発行するクエリをAWSコンソールのGUIから確認すれば出来ます。
SELECT
*
FROM
(
SELECT
DISTINCT
xid,
pid,
starttime,
LISTAGG(text) WITHIN GROUP (ORDER BY sequence) OVER (PARTITION BY starttime) AS sql_text
FROM
svl_statementtext
GROUP BY
xid,
pid,
starttime,
sequence,
text
) as t
WHERE
sql_text LIKE '%SQL_CUR0x7ffeb2f68c60%' AND sql_text LIKE '%declare%'