ablog

不器用で落着きのない技術者のメモ

psql で select 結果を変数にセットして、その後の select のフィルタ条件に変数を埋め込む

psql から Amazon Redshift でクエリ実行後に pg_last_query_id() で直前のクエリIDを取得して、stl_query や svl_query_summary からクエリIDでフィルタして性能情報を取得したかったんだけど、psql だとクエリ実行後に \gset を実行するとカラム名が変数名になって結果をセットすることができた。

-- query id
select pg_last_query_id();
\gset

-- execution time
select userid,
        trim(database) "database",
        trim(label) as label,
        query,
        xid,
        pid,
        datediff(milliseconds, starttime, endtime) as "exec_time(ms)",
        starttime,
        endtime,
        aborted,
        insert_pristine,
        concurrency_scaling_status,
        trim(querytxt) as query_text
from stl_query where query = :pg_last_query_id;

-- show execution plan
select query,
       maxtime,
       avgtime,
       rows,
       bytes,
       lpad(' ',stm+seg+step) || label as label,
       is_diskbased,
       workmem,
       is_rrscan,
       is_delayed_scan,
       rows_pre_filter
from svl_query_summary
where query = :pg_last_query_id
order by stm, seg, step;

参考

\gsetコマンド

\gsetコマンドは、直前に実行したSQLの結果を変数にセットします。ただし返された行が1行だけだった場合にのみセットできます。列名分だけ変数にセットされます。

SELECT c FROM my_table LIMIT 1;
\gset
\echo :c
noborus
psqlプログラミング - Qiita