TableauでRedshiftに実行されたクエリを確認する

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%'