【小ネタ】RedshiftでSleepする方法
こんにちは、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は便利な機能ですが、負荷の比較的高いサーバーで実行される場合、性能上のボトルネックになる可能性もありますので、本番環境でのご利用については、十分に性能の検証をされた上でお使いください。