【小ネタ】RedshiftでSleepする方法

2016.06.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、DI部の川崎です。

Postgresqlでは、Ver. 8.2から「遅延実行」という機能が追加されています。いわゆるSleepです。

9.9.5. 遅延実行 以下の関数は、サーバプロセスの実行を遅延させるために使用可能です。

pg_sleep(seconds) pg_sleepは、seconds秒経過するまで、現在のセッションのプロセスを休止させます。 secondsはdouble precision型の値です。 そのため、少数単位で休止秒数を指定することができます。 以下に例を示します。

SELECT pg_sleep(1.5); 注意: 休止時間の有効な分解能はプラットフォームに依存します。 0.01秒が一般的な値です。 遅延は少なくとも指定した通り行われます。 サーバの負荷が要因となり、より長くなる可能性があります。

PostgreSQL 8.2.6文書より引用

https://www.postgresql.jp/document/8.2/html/functions-datetime.html#FUNCTIONS-DATETIME-DELAY

 

残念ながら、Redshiftではpg_sleepは使用できませんので、代替手段を考えてみます。

最初に思いついたのは、UDFを使った方法です。この方法を試してみます。

【Developers.IO】Amazon Redshift UDF – シリーズ –
 https://dev.classmethod.jp/series/amazon-redshift-udf/
【Developers.IO】Amazon Redshift: UDF(User-Defined Functions:ユーザー独自の定義関数)の作成方法
 https://dev.classmethod.jp/cloud/aws/amazon-redshift-creating-user-defined-functions/

下記の内容で、f_sleepという関数を作成します。戻り値は必ずTrueを返す内容になっています。

cmdemo$# CREATE FUNCTION f_sleep (sec float) RETURNS bool IMMUTABLE as $$
cmdemo$# import time
cmdemo$# time.sleep(sec)
cmdemo$# return True
cmdemo$# $$ LANGUAGE plpythonu;
CREATE FUNCTION

タイミングコマンドで、処理時間を表示するようにします。

cmdemo=# \timing
Timing is on.

実行してみます。

cmdemo=# select f_sleep(5.5);
 f_sleep 
---------
 t
(1 row)

Time: 5628.855 ms

Sleepできました!

最後に

UDFは便利な機能ですが、負荷の比較的高いサーバーで実行される場合、性能上のボトルネックになる可能性もありますので、本番環境でのご利用については、十分に性能の検証をされた上でお使いください。