在postgreSQL中执行查询的时间

在postgreSQL中执行查询的时间,sql,linux,bash,postgresql,Sql,Linux,Bash,Postgresql,我正在尝试编写一个脚本,显示执行某些查询的时间。我的脚本有两个问题: 1.为什么函数的结果是0? 2.如何使/copy不会覆盖我的filetest.txt 脚本: #!/bin/bash psql WYPOZYCZALNIA postgres<< EOF CREATE OR REPLACE FUNCTION funkcja(i integer) returns double precision as' DECLARE cza

我正在尝试编写一个脚本,显示执行某些查询的时间。我的脚本有两个问题: 1.为什么函数的结果是0? 2.如何使/copy不会覆盖我的filetest.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
该函数现在是事务和时间戳的别名,并且总是返回当前事务的开始时间,因此在存储过程中总是返回相同的值。有关更多详细信息,请参阅:

语句\u时间戳和事务\u时间戳返回相同的值 事务的第一个命令期间的值

要解决此问题,请使用timeofday或clock_时间戳,而不是现在:

timeofday是一个历史PostgreSQL函数。喜欢 时钟时间戳,它返回实际的当前时间,但作为 格式化的文本字符串,而不是带有时区值的时间戳

要在提取时使用它,请使用timeofday::TIMESTAMP将结果强制转换为TIMESTAMP:

如何附加结果而不是覆盖输出文件

\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表示仅在输出中显示元组

考虑

函数接受一个参数,但不使用它。最终删除该参数。 每次要运行函数时都加载它是一种糟糕的设计。最好将函数定义与在两个不同的文件中运行分开。数据库设置程序只能加载该函数一次。
非常感谢您的回答。如何使\copy select*从funkcja50复制到'test.txt'不会覆盖test.txt?我想有一个文件中的所有结果。
#!/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'