簡體   English   中英

在PostgreSQL中執行查詢的時間

[英]time of executing queries in postgreSQL

我正在嘗試編寫一個腳本,該腳本向我顯示執行某些查詢的時間,我的腳本有2個問題:1.為什么函數的結果為0? 2.如何使/ copy不會覆蓋我的文件(test.txt)?

腳本:

#!/bin/bash

psql WYPOZYCZALNIA postgres<< EOF

    CREATE OR REPLACE FUNCTION funkcja(i integer) returns double precision as'
            DECLARE
            czas_start double precision;
            czas_stop double precision;
            BEGIN
            SELECT extract(epoch from now()) into czas_start;
            insert into UZYTKOWNICY VALUES(16,''PIOTiR'',''510784543'');
            SELECT extract(epoch from now()) into czas_stop;
            RETURN czas_stop-czas_start;
    end;
    'language 'plpgsql';
    \copy   (select * from funkcja(50)) To 'test.txt'
    \q
EOF

函數NOW()是和transaction_timestamp()的別名,並且始終返回當前事務的開始時間 ,因此在存儲過程中始終返回相同的值。 請參閱此處以獲取更多詳細信息:

statement_timestamp()和transaction_timestamp()在事務的第一個命令期間返回相同的值,

要解決您的問題,請使用timeofday()clock_timestamp()而不是NOW()

timeofday()是PostgreSQL的歷史功能。 像clock_timestamp()一樣,它返回實際的當前時間,但以格式化的文本字符串的形式返回,而不是帶有時區值的時間戳。

要在EXTRACT()中使用它,請使用timeofday()::TIMESTAMP將結果轉換為timeofday()::TIMESTAMP

SELECT extract(epoch from timeofday()::TIMESTAMP) into czas_start;
insert into UZYTKOWNICY VALUES(16,''PIOTiR'',''510784543'');
SELECT extract(epoch from timeofday()::TIMESTAMP) into czas_stop;

如何附加結果而不是覆蓋輸出文件

\\copy命令不支持附加而不是覆蓋,因此最好不要使用\\copy而是在psql中運行該函數並將輸出重定向到文件:

#!/bin/bash

psql WYPOZYCZALNIA postgres<< EOF

    CREATE OR REPLACE FUNCTION funkcja(i integer) returns double precision as \$BODY$
            DECLARE
            czas_start double precision;
            czas_stop double precision;
            BEGIN
            SELECT extract(epoch from timeofday()::TIMESTAMP) into czas_start;
            INSERT INTO UZYTKOWNICY  VALUES(16,'PIOTiR','510784543');
            SELECT extract(epoch from timeofday()::TIMESTAMP) into czas_stop;
            RETURN czas_stop-czas_start;
    end;
    \$BODY$ language 'plpgsql';
EOF
psql WYPOZYCZALNIA postgres -t -A -c "SELECT funkcja(50)" >> 'test.txt'

psql選項-A表示不對齊輸出, -t表示僅在輸出中顯示元組。

注意事項

  • 該函數接受一個參數,但是不使用它。 最終刪除參數。
  • 每次要運行時都加載函數是一個糟糕的設計。 最好將函數定義與在兩個不同文件中運行時分開。 該功能應僅通過數據庫設置加載一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM