2016-05-22 3 views
1

多くのSQLコマンドを実行するスクリプトの実行時間を記録する必要があります。私はEXPLAINを見てきましたが、それは1つのコマンドに限られており、PL/PGSQLを使用したくないので、これに必要な機能を私に与えてくれないようです。そして、私はpsqlクライアントでこれらのスクリプトを実行しないので、\setコマンドは私にとってはうまくいきません。PostgreSQL:SQLのみを使用したロングスクリプトの実行時間の取得

この擬似コードブロックはあなたに私がしようとしているかのアイデアを与える必要があります。

-- beginning of script  
SET begin_time = NOW(); 

    ... execute a bunch of SQL commands 

-- end of script 
SET end_time = NOW(); 

INSERT INTO execute_log (script_run_time) 
    SELECT (end_time - start_time); 

だけでSQLを使用してPostgreSQLの中でこれを行う簡単な方法はありますか?そうでない場合、どのように私は同じ結果を得ることができますか?

+0

を注:今()したときにタイムスタンプを提供しますトランザクションが開始されました。実際のウォールタイムではclock_timestamp()が必要です。 – wildplasser

答えて

1
CREATE TABLE timenow 
     (seq serial NOT NULL PRIMARY KEY 
     , starttime timestamptz NOT NULL 
     , stoptime timestamptz NOT NULL 
     ); 

BEGIN; 
INSERT INTO timenow(starttime, stoptime) SELECT now(), clock_timestamp(); 

SELECT COUNT(*) from pg_class; 

INSERT INTO timenow(starttime, stoptime) SELECT now(), clock_timestamp(); 
COMMIT; 

SELECT * FROM timenow; 

出力:

CREATE TABLE 
BEGIN 
INSERT 0 1 
count 
------- 
    577 
(1 row) 

INSERT 0 1 
COMMIT 
seq |   starttime   |   stoptime    
-----+-------------------------------+------------------------------- 
    1 | 2016-05-22 17:20:12.206513+02 | 2016-05-22 17:20:12.207037+02 
    2 | 2016-05-22 17:20:12.206513+02 | 2016-05-22 17:20:12.207918+02 
(2 rows) 
0

使用して、カスタム設定パラメータ:名にドットが必要であることを

select set_config('foo.bar', clock_timestamp()::text, false); 
... 
select current_setting('foo.bar')::timestamp; 

注意。

0

お互いからの素晴らしいおかげで!

CREATE TABLE timenow (
    seq SERIAL NOT NULL PRIMARY KEY, 
    starttime TIMESTAMP NOT NULL, 
    stoptime TIMESTAMP NULL, 
    runtime INTERVAL (3) NULL 
); 

-- set execution begin time 
INSERT INTO timenow (starttime) SELECT clock_timestamp(); 

    ... execute a bunch of SQL commands 

-- set execution end time 
UPDATE timenow 
    SET stoptime = clock_timestamp(); 
UPDATE timenow 
    SET runtime = stoptime - starttime; 

SELECT * FROM timenow; 

出力::私はそうと、ハイブリッドなアプローチで行くことにしました。もちろん、

seq |   starttime   |   stoptime   | runtime 
-----+-------------------------------+-------------------------------+-------------- 
    1 | 2016-05-22 12:09:47.049678-04 | 2016-05-22 12:11:00.610502-04 | 00:01:13.561 
(1 row) 

Time: 0.338 ms 

、私が代わりに

CREATE TABLE timenow: 

を置き換えます:

TRUNCATE timenow; 
を運用環境では

です。

EDIT:

時間をキャプチャし、ログにそれを挿入するには、私が使用:

INSERT INTO script_run_log (entry) 
    SELECT 'Script #1 run time: ' || 
    TO_CHAR((SELECT runtime FROM timenow), 'MI:SS:MS'); 

出力:

| Script #1 run time: 01:11:554 | 
+0

私はたぶん、物事を少しきれいに保つために、それをそこに保持し、毎回切り捨てる代わりに、 'CREATE TEMPORARY TABLE'を行うでしょう。 –

関連する問題