繁体   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