web-dev-qa-db-ja.com

ミリ秒単位で間隔を取得

次のようなコードを含むプロシージャがあります。

processStart := current_timestamp;
-- run statement(s)
processEnd := current_timestamp;
elapsed := processEnd - processStart;
raise notice 'My Statement, elapsed time: %', elapsed;

アイデアは、ステートメントまたはステートメントのコレクションが実行されるのにかかる時間を取得したいということです。

問題は、これが1秒未満の経過時間に対して00:00:00を返すことです。本当にミリ秒を見たいです。これどうやってするの?

EXTRACTEpochの使用に関する質問と回答がありますが、これは「第2」レベルのようであり、私の目的には十分にきめ細かくありません。

[〜#〜]更新[〜#〜]

@ twn08の答えを使用して、私は最終的に次の解決策に到達しました。

次の変数を宣言しました。

declare
    processStart timestamp;
    elapsed numeric(18,3);
    processFinish timestamp;

次に、プロセスを開始する前に:

processStart := clock_timestamp();

プロセスが終了した後、私はこれを実行しました:

processFinish := clock_timestamp();
elapsed := cast(extract(Epoch from (processFinish - processStart)) as numeric(18,3));
raise notice 'My Statement, elapsed time: % ms', elapsed;

これは水泳で働いた。

11
Jeremy Holovacs
with t as
 (select
    Now() as tend, 
    Now() - interval '10 seconds 552 milliseconds' as tstart
 )

select
  extract('Epoch' from tend)  - extract('Epoch' from tstart) 
from 
  t

注意:

バージョン9.0以降の場合、 documentation 次の例を読むことができます。

SELECT EXTRACT(Epoch FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
Result: 982384720.12

9.0より前 あります

SELECT EXTRACT(Epoch FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-08');
Result: 982384720

これに基づいて、私の例がバージョン9.0より前で機能するかどうかは完全には明らかではありません。

19
Tomas Greif

これは、過去のTIMESTAMPからnow()までの経過時間をミリ秒単位で計算するためのワンライナーです。

_SELECT ROUND((EXTRACT (Epoch FROM now()) - EXTRACT (Epoch FROM pg_last_xact_replay_timestamp())) * 1000) AS "replication_lag (ms)";
_

上記の例では、プライマリPostgreSQLサーバーとスタンバイPostgreSQLサーバー間のレプリケーションラグを計算しているため、pg_last_xact_replay_timestamp()をTIMESTAMPに置き換えるだけです。

それが何をしているのかをもう少し明確に見るには:

_SELECT
    ROUND ((
        EXTRACT (Epoch FROM now()) -
        EXTRACT (Epoch FROM pg_last_xact_replay_timestamp())
    ) * 1000)
AS "replication_lag (ms)";
_

出力:

_ replication_lag (ms) 
----------------------
                  562
(1 row)
_
5
liquidki

@TomasGreifの回答に基づいて、ミリ秒のdatediffを頻繁に実行する必要がある場合に備えて、小さなdatediff関数を作成しました。

create function datediff_ms(timestamptz, timestamptz) returns INTEGER as
$$
    begin
        return (EXTRACT('Epoch' from $2) - EXTRACT('Epoch' from $1)) * 1000;
    end;
$$ LANGUAGE plpgsql;

使用法:

select datediff_ms(time1, time2)
from sometables;
3
Shaul Behr